2022-04-19 14:36:19 +00:00
|
|
|
- name: Provision VM's
|
|
|
|
hosts: localhost
|
2022-04-18 10:58:57 +00:00
|
|
|
gather_facts: false
|
|
|
|
vars_files:
|
2022-04-18 12:28:05 +00:00
|
|
|
- hypervisor.vcenter.yml
|
2022-04-18 19:35:28 +00:00
|
|
|
- cluster.k3s.yml
|
2022-04-18 10:58:57 +00:00
|
|
|
tasks:
|
2022-04-19 10:07:26 +00:00
|
|
|
|
2022-04-19 07:10:44 +00:00
|
|
|
- name: Download OVF-template
|
|
|
|
ansible.builtin.get_url:
|
|
|
|
url: "https://{{ repo_username }}:{{ repo_password }}@{{ image.ova_url }}"
|
|
|
|
dest: /scratch/image.ova
|
2022-04-19 10:07:26 +00:00
|
|
|
|
2022-04-19 11:27:38 +00:00
|
|
|
- name: Deploy VM's from OVF-template
|
2022-04-18 20:49:50 +00:00
|
|
|
community.vmware.vmware_deploy_ovf:
|
2022-04-18 12:28:05 +00:00
|
|
|
hostname: "{{ hv.hostname }}"
|
|
|
|
username: "{{ hv.username }}"
|
|
|
|
password: "{{ hv_password }}"
|
2022-04-18 10:58:57 +00:00
|
|
|
validate_certs: no
|
2022-04-18 12:28:05 +00:00
|
|
|
datacenter: "{{ hv.datacenter }}"
|
|
|
|
folder: "{{ hv.folder }}"
|
|
|
|
cluster: "{{ hv.cluster }}"
|
2022-04-19 14:36:19 +00:00
|
|
|
name: "{{ cluster.name | upper }}-{{ (item.ip | checksum)[-5:] | upper }}"
|
2022-04-18 20:49:50 +00:00
|
|
|
datastore: "{{ hv.datastore }}"
|
2022-04-18 21:08:48 +00:00
|
|
|
disk_provisioning: thin
|
|
|
|
networks:
|
|
|
|
"LAN": "{{ hv.network }}"
|
2022-04-18 20:49:50 +00:00
|
|
|
power_on: yes
|
2022-04-19 07:10:44 +00:00
|
|
|
ovf: /scratch/image.ova
|
2022-04-18 21:08:48 +00:00
|
|
|
deployment_option: "{{ image.deployment_option }}"
|
|
|
|
properties:
|
2022-04-19 14:36:19 +00:00
|
|
|
guestinfo.hostname: "{{ cluster.name | upper }}-{{ (item.ip | checksum)[-5:] | upper }}"
|
2022-04-18 21:08:48 +00:00
|
|
|
guestinfo.rootpw: "{{ root_password }}"
|
2022-04-19 16:12:13 +00:00
|
|
|
guestinfo.rootsshkey: "{{ public_key }}"
|
2022-04-19 07:53:20 +00:00
|
|
|
guestinfo.ntpserver: "{{ network.ntpserver }}"
|
2022-04-18 21:12:30 +00:00
|
|
|
guestinfo.ipaddress: "{{ item.ip | ansible.utils.ipaddr('address') }}"
|
2022-04-19 08:45:18 +00:00
|
|
|
guestinfo.prefixlength: "{{ item.ip | ansible.utils.ipaddr('prefix') }}"
|
2022-04-19 07:53:20 +00:00
|
|
|
guestinfo.dnsserver: "{{ network.dnsserver }}"
|
|
|
|
guestinfo.gateway: "{{ network.gateway }}"
|
2022-04-18 12:28:05 +00:00
|
|
|
delegate_to: localhost
|
2022-04-18 10:58:57 +00:00
|
|
|
with_items: "{{ servers }}"
|
2022-04-19 10:07:26 +00:00
|
|
|
register: job_init
|
2022-04-19 10:22:56 +00:00
|
|
|
async: 300
|
2022-04-19 10:07:26 +00:00
|
|
|
poll: 0
|
|
|
|
|
|
|
|
- name: Poll for completion
|
|
|
|
ansible.builtin.async_status:
|
2022-04-19 10:12:15 +00:00
|
|
|
jid: "{{ item.ansible_job_id }}"
|
2022-04-19 10:07:26 +00:00
|
|
|
with_items: "{{ job_init.results }}"
|
|
|
|
register: job_poll
|
|
|
|
retries: 5
|
2022-04-19 10:22:56 +00:00
|
|
|
delay: 100
|
2022-04-19 10:07:26 +00:00
|
|
|
until: job_poll.finished
|
|
|
|
|
2022-04-19 13:49:12 +00:00
|
|
|
- name: Parse results into dictionary
|
|
|
|
ansible.builtin.set_fact:
|
|
|
|
nodes: "{{ nodes | default([]) + [ {'name': item.instance.hw_name, 'ip': item.item.item.ip | ansible.utils.ipaddr('address')} ] }}"
|
|
|
|
with_items: "{{ job_poll | json_query('results[*]') }}"
|
2022-04-19 15:04:09 +00:00
|
|
|
# Purely to avoid large amount of spam; no sensitive data here.
|
2022-04-19 13:49:12 +00:00
|
|
|
no_log: true
|
|
|
|
|
2022-04-19 11:27:38 +00:00
|
|
|
- name: Register new VM's in inventory
|
|
|
|
ansible.builtin.add_host:
|
2022-04-19 13:49:12 +00:00
|
|
|
name: "{{ item.name }}"
|
|
|
|
ansible_host: "{{ item.ip }}"
|
|
|
|
groups: k3s_ha
|
|
|
|
with_items: "{{ nodes }}"
|
2022-04-19 14:36:19 +00:00
|
|
|
|
2022-04-20 07:16:55 +00:00
|
|
|
- name: Scan public keys
|
|
|
|
ansible.builtin.shell:
|
|
|
|
cmd: "ssh-keyscan -t rsa {{ item.ip }}"
|
|
|
|
register: publickeys
|
|
|
|
with_items: "{{ nodes }}"
|
|
|
|
|
|
|
|
- name: Store public keys
|
|
|
|
ansible.builtin.known_hosts:
|
2022-04-20 07:46:01 +00:00
|
|
|
name: "{{ item.item.name | lower }}"
|
|
|
|
key: "{{ item.item.name | lower }},{{ item.stdout }}"
|
2022-04-20 07:16:55 +00:00
|
|
|
state: present
|
|
|
|
path: ~/.ssh/known_hosts
|
|
|
|
with_items: "{{ publickeys.results }}"
|
2022-04-20 06:35:27 +00:00
|
|
|
|
2022-04-19 14:36:19 +00:00
|
|
|
- name: Provision Kubernetes
|
|
|
|
hosts: k3s_ha
|
|
|
|
gather_facts: false
|
2022-04-19 14:53:33 +00:00
|
|
|
vars_files:
|
|
|
|
- cluster.k3s.yml
|
2022-04-19 14:36:19 +00:00
|
|
|
tasks:
|
|
|
|
|
|
|
|
- name: Iterate over hosts
|
|
|
|
block:
|
2022-04-19 14:53:33 +00:00
|
|
|
|
2022-04-19 14:36:19 +00:00
|
|
|
- name: Install K3s binary
|
|
|
|
ansible.builtin.command:
|
|
|
|
cmd: "curl -sfL https://get.k3s.io | sh -s - server --cluster-init --disable local-storage,traefik --tls-san {{ cluster.virtualip | ansible.utils.ipaddr('address') }}"
|
|
|
|
environment:
|
2022-04-19 14:53:33 +00:00
|
|
|
K3S_TOKEN: cluster.mastertoken | default('', true)
|
|
|
|
K3S_URL: cluster.apiurl | default('', true)
|
|
|
|
|
|
|
|
- name: Retrieve token & reference new cluster
|
|
|
|
ansible.builtin.set_fact:
|
|
|
|
cluster: "{{ cluster | combine( { mastertoken: lookup('file', /var/lib/rancher/k3s/server/token) }, { apiurl: 'https://{{ cluster.virtualip | ansible.utils.ipaddr('address') }}:6443' } ) }}"
|
|
|
|
when: cluster.mastertoken is not defined
|
|
|
|
|
|
|
|
- ansible.builtin.debug:
|
|
|
|
var: cluster
|
|
|
|
|
2022-04-19 14:36:19 +00:00
|
|
|
throttle: 1
|