infra/roles/pve/tasks/create_vm.yml
Sergey Bubnov (omg) d89c7ab77e prevent wrong behaviour when more than one dhcp on interfaces
firts we check that the VM has already get some IP address
and if so we just deploy as usual. If VM have no IP address
on any interface we throw all interfaces except first (eth0) to
the `empty vlan` that have no DHCP server enabled. VLAD ID defined
in environment variable. After network configuration inside VM we
restore propper VLAN IDs on all interfaces. This approach should help
in situations when DHCP available on more than one interfaces and those
interfaces configured as dhcp-clients, thus more than one default gw
will be configured with some metrics and all traffic will be routed
to the right one or will be not.
2019-06-27 13:21:48 +04:00

114 lines
3.5 KiB
YAML

---
- set_fact: node_name="{{tmp_node}}"
- set_fact: vm_name="{{node_name}}.{{stack.name}}"
- set_fact: other_nics_to_vlan=false
- name: "[{{vm_name}}] clone VM"
proxmox_kvm:
node: srv
api_user: "{{env.pve.username}}"
api_password: "{{env.pve.password}}"
api_host: "{{env.pve.api_url}}"
name: "{{vm_name}}"
pool: "{{env_name}}"
clone: "{{stack.nodes[node_name].template}}"
full: no
# storage: "{{env.pve.storage}}"
timeout: 90
# state: present
- name: "[{{vm_name}}] get VM state"
proxmox_kvm:
node: srv
api_user: "{{env.pve.username}}"
api_password: "{{env.pve.password}}"
api_host: "{{env.pve.api_url}}"
name: "{{vm_name}}"
agent: yes
state: current
register: vm_status
until: vm_status is succeeded
retries: 30
delay: 1
ignore_errors: yes
- name: "[{{vm_name}}] get VM`s ip addresses"
proxmox_qemu_agent:
api_user: "{{env.pve.username}}"
api_password: "{{env.pve.password}}"
api_host: "{{env.pve.api_url}}"
name: "{{vm_name}}"
command: "network-get-interfaces"
register: res
until: res.results | json_query('[] | [?name!=`lo`]."ip-addresses" | [] | [?"ip-address-type"==`ipv4`] | []."ip-address"') | length > 0
retries: 3
delay: 1
ignore_errors: yes
- set_fact: other_nics_to_vlan="{{env.pve.empty_vlan}}"
when: res.failed
- debug: msg="{{hostvars['localhost']['other_nics_to_vlan']}}"
- name: "[{{vm_name}}] configure VM"
proxmox_kvm:
node: srv
api_user: "{{env.pve.username}}"
api_password: "{{env.pve.password}}"
api_host: "{{env.pve.api_url}}"
name: "{{vm_name}}"
agent: yes
cpu: host
kvm: yes
cores: "{{stack.nodes[node_name].cores}}"
memory: "{{stack.nodes[node_name].mem}}"
# storage: "{{env.pve.storage}}"
net: "{{stack.nodes[node_name].net | to_proxmox_net(other_nics_to_vlan)}}"
update: yes
state: present
# ide: '{ide[2]: "local-lvm:cloudinit"}'
ipconfig0: "ip={{stack.nodes[node_name].net.eth0.ipv4[0]}},gw={{stack.nodes[node_name].net.eth0.default}}"
nameserver: "{{stack.nodes[node_name].net.eth0.nameservers | default(omit) | first}}"
searchdomain: "{{stack.nodes[node_name].net.eth0.search | default(omit) | first}}"
register: vm_status
until: vm_status is succeeded
retries: 30
delay: 1
ignore_errors: yes
- name: "[{{vm_name}}] start VM"
proxmox_kvm:
node: srv
api_user: "{{env.pve.username}}"
api_password: "{{env.pve.password}}"
api_host: "{{env.pve.api_url}}"
name: "{{vm_name}}"
state: started
- name: "[{{vm_name}}] wait for qemu-agent return addresses list"
proxmox_qemu_agent:
api_user: "{{env.pve.username}}"
api_password: "{{env.pve.password}}"
api_host: "{{env.pve.api_url}}"
name: "{{vm_name}}"
command: "network-get-interfaces"
register: res
until: res.results | json_query('[] | [?name!=`lo`]."ip-addresses" | [] | [?"ip-address-type"==`ipv4`] | []."ip-address"') != None
retries: 30
delay: 1
- name: "[{{vm_name}}] wait for any IP on any VM's interface"
proxmox_qemu_agent:
api_user: "{{env.pve.username}}"
api_password: "{{env.pve.password}}"
api_host: "{{env.pve.api_url}}"
name: "{{vm_name}}"
command: "network-get-interfaces"
register: res
until: res.results | json_query('[] | [?name!=`lo`]."ip-addresses" | [] | [?"ip-address-type"==`ipv4`] | []."ip-address"') | length > 0
retries: 30
delay: 1
- name: "[{{vm_name}}] register VM's interfaces info"
set_fact: stack="{{stack|dict_inject("/nodes/"+node_name+"/nics", res.results|to_nics_dict)}}"