01__create_jumpbox_and_nlb.yml.md
The source files for this tutorial can be downloaded from its GitHub repository, or cloned into your current working directory using the command git clone https://github.com/ionos-cloud/module-ansible.git
before changing into the module-ansible/docs/tutorials/09__a_quick_introduction_to_dbaas
sub-directory.
01__create_jumpbox_and_nlb.yml
---
- hosts: localhost
connection: local
gather_facts: false
vars_files:
- ../vars.yml
- vars.yml
tasks:
# =======================================================================
- name: Display EULA
ansible.builtin.pause:
prompt: "{{ IONOS_UNSUPPORTED_EULA }}"
register: INTERACTIVE_EULA_ACCEPTED
when: IONOS_UNSUPPORTED_EULA_ACCEPTED != "yes"
- name: Confirm acceptance of EULA
ansible.builtin.assert:
that:
- IONOS_UNSUPPORTED_EULA_ACCEPTED == "yes" or INTERACTIVE_EULA_ACCEPTED.user_input == "yes"
# =======================================================================
- name: Create the datacenter '{{ datacenter_name }}' in {{ location }}
ionoscloudsdk.ionoscloud.datacenter:
name: "{{ datacenter_name }}"
location: "{{ location }}"
state: present
register: datacenter_response
# =======================================================================
# Provision the jumpbox, heavily borrowed from 3__jumpbox_with_internal_server
- name: Retrieve Cube templates
ionoscloudsdk.ionoscloud.cube_template_info:
filters: "{ 'properties.name': '{{ server_config['jumpbox'].cube_size }}' }"
register: template_list
- name: Provision a minimal Cube Jumpbox
ionoscloudsdk.ionoscloud.cube_server:
datacenter: "{{ datacenter_name }}"
name: "{{ server_config['jumpbox'].name }}"
template_uuid: "{{ template_list.cube_templates[0].id }}"
disk_type: DAS
image: "{{ image_alias }}"
image_password: "{{ default_password }}"
ssh_keys:
- "{{ ssh_public_key }}"
assign_public_ip: true
state: present
wait: true
wait_timeout: "{{ wait_timeout }}"
register: create_cube_response
- name: Create a second, internal LAN within '{{ datacenter_name }}'
ionoscloudsdk.ionoscloud.lan:
datacenter: "{{ datacenter_name }}"
name: "{{ lan.name }}"
public: false
register: create_second_lan_response
- name: Create a second NIC for the Jumpbox
ionoscloudsdk.ionoscloud.nic:
datacenter: "{{ datacenter_name }}"
name: "{{ server_config['jumpbox'].name }}.eth1"
server: "{{ server_config['jumpbox'].name }}"
lan: "{{ create_second_lan_response.lan.id }}"
ips:
- "{{ server_config['jumpbox'].ip }}"
dhcp: true
state: present
wait: true
wait_timeout: "{{ wait_timeout }}"
# =======================================================================
# Create (and, where necessary, transfer) the required temporary files
- name: Create a temporary ssh-key-pair so we can connect to the 'internal server' via the jumpbox
ansible.builtin.shell:
cmd: ssh-keygen -t rsa -b 4096 -f temporary_id_rsa -N "" || true
- name: Create a local ssh_config file
ansible.builtin.template:
src: templates/ssh_config.j2
dest: ssh_config
- name: Delete any pre-existing ssh_known_hosts_tmp file
ansible.builtin.shell: rm -f ssh_known_hosts_tmp
- name: Copy temporary ssh private key to the jumpbox
ansible.builtin.shell: scp -F ssh_config temporary_id_rsa jumpbox:/root/.ssh/id_rsa
when: false
- name: Add an Ansible host entry for the jumpbox
ansible.builtin.add_host:
hostname: "jumpbox"
ansible_host: "{{ create_cube_response['machines'][0]['entities']['nics']['items'][0]['properties']['ips'][0] }}"
remote_user: root
group: vms-to-be-configured
# =======================================================================
# Reserve a one-IP-address block for the NLB
- name: Create an IP Block for our datacenter
ionoscloudsdk.ionoscloud.ipblock:
name: "IP Block for {{ datacenter_name }}"
location: "{{ location }}"
size: "{{ ip_block.size }}"
state: present
register: ip_block_response
when: ENABLE_EXPLICITLY_UNSUPPORTED_CONFIGURATIONS
# =======================================================================
# see https://docs.ionos.com/ansible/api/network-load-balancer/network_load_balancer
- name: Create Network Load Balancer --- sometimes, this can take a while (up to 15 or so minutes), so please don't interrupt this operation...
ionoscloudsdk.ionoscloud.network_load_balancer:
datacenter: "{{ datacenter_name }}"
name: "{{ nlb.name }}"
listener_lan: "{{ create_cube_response.machines[0]['entities']['nics']['items'][0]['properties']['lan'] }}"
ips:
- "{{ ip_block_response.ipblock.properties.ips[0] }}"
target_lan: "{{ create_second_lan_response.lan.id }}"
lb_private_ips:
- "{{ nlb.ip }}"
state: present
wait: true
wait_timeout: "{{ vnf_wait_timeout }}"
register: create_nlb_response
when: ENABLE_EXPLICITLY_UNSUPPORTED_CONFIGURATIONS
# see https://docs.ionos.com/ansible/api/network-load-balancer/network_load_balancer_rule
- name: Create Network Load Balancer Forwarding Rule for psql
ionoscloudsdk.ionoscloud.network_load_balancer_rule:
name: "NLB PSQL connections"
algorithm: "ROUND_ROBIN"
protocol: "TCP"
listener_ip: "{{ ip_block_response.ipblock.properties.ips[0] }}"
listener_port: "5432"
targets:
- ip: "{{ dbaas_config.postgres_cluster.ip }}"
port: "5432"
weight: "100"
datacenter: "{{ datacenter_name }}"
network_load_balancer: "{{ create_nlb_response.network_load_balancer.id }}"
wait: true
wait_timeout: "{{ vnf_wait_timeout }}"
register: nlb_forwarding_rule_response_psql
when: ENABLE_EXPLICITLY_UNSUPPORTED_CONFIGURATIONS
- name: Create Network Load Balancer Forwarding Rule for mongo
ionoscloudsdk.ionoscloud.network_load_balancer_rule:
name: "NLB MONGO connections"
algorithm: "ROUND_ROBIN"
protocol: "TCP"
listener_ip: "{{ ip_block_response.ipblock.properties.ips[0] }}"
listener_port: "27017"
targets:
- ip: "{{ dbaas_config.mongodb_cluster.ip }}"
port: "27017"
weight: "100"
datacenter: "{{ datacenter_name }}"
network_load_balancer: "{{ create_nlb_response.network_load_balancer.id }}"
wait: true
wait_timeout: "{{ vnf_wait_timeout }}"
register: nlb_forwarding_rule_response_mongo
when: ENABLE_EXPLICITLY_UNSUPPORTED_CONFIGURATIONS
# =======================================================================
# And in our second play, go ahead and configure the jumpbox (which was
# added, dynamically, to our inventory above using the add_host module)
- hosts: vms-to-be-configured
gather_facts: false
tasks:
- name: Set ansible_ssh_common_args
set_fact:
ansible_ssh_common_args: "-F ssh_config"
- name: Update repositories cache and upgrade the system
ansible.builtin.apt:
upgrade: dist
update_cache: yes
cache_valid_time: 3600
- name: Install required packages
ansible.builtin.package:
name:
- gnupg
- postgresql-client-common
- postgresql-client
state: present
- name: Add the MongoDB 6.0 signing key
ansible.builtin.apt_key:
url: https://www.mongodb.org/static/pgp/server-6.0.asc
state: present
- name: Add the MongoDB 6.0 Linux repository
ansible.builtin.apt_repository:
repo: deb [arch=amd64] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse
filename: mongodb-org-6.0
state: present
- name: Install MongoSH
ansible.builtin.apt:
name:
- mongodb-mongosh
update_cache: yes
state: present
Last updated