Clonage par l'API (community.proxmox) avec bwpoc@pve limité au pool bwpoc ; modèle créé une fois en root avec l'agent QEMU, qui sert à lire les IP DHCP écrites dans inventory/host_vars/<vm>/dhcp.yml. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
90 lines
2.8 KiB
YAML
90 lines
2.8 KiB
YAML
---
|
|
- name: "{{ vm_name }} : lecture des paramètres"
|
|
ansible.builtin.set_fact:
|
|
vm: "{{ hostvars[vm_name] }}"
|
|
|
|
- name: "{{ vm_name }} : la VM existe-t-elle ?"
|
|
community.proxmox.proxmox_vm_info:
|
|
vmid: "{{ vm.vm_id }}"
|
|
node: "{{ pve_node }}"
|
|
config: none
|
|
register: vm_info
|
|
|
|
- name: "{{ vm_name }} : création"
|
|
when: vm_info.proxmox_vms | length == 0
|
|
block:
|
|
- name: "{{ vm_name }} : clonage du modèle {{ pve_template_vmid }}"
|
|
community.proxmox.proxmox_kvm:
|
|
node: "{{ pve_node }}"
|
|
vmid: "{{ pve_template_vmid }}"
|
|
clone: "{{ pve_template_name }}"
|
|
newid: "{{ vm.vm_id }}"
|
|
name: "{{ vm_name }}"
|
|
full: true
|
|
storage: "{{ pve_storage }}"
|
|
pool: "{{ pve_pool }}"
|
|
timeout: 600
|
|
|
|
- name: "{{ vm_name }} : agrandissement du disque à {{ vm.vm_disk_gb }} Go"
|
|
community.proxmox.proxmox_disk:
|
|
vmid: "{{ vm.vm_id }}"
|
|
disk: scsi0
|
|
state: resized
|
|
size: "{{ vm.vm_disk_gb }}G"
|
|
|
|
- name: "{{ vm_name }} : ressources et cloud-init"
|
|
community.proxmox.proxmox_kvm:
|
|
node: "{{ pve_node }}"
|
|
vmid: "{{ vm.vm_id }}"
|
|
update: true
|
|
cores: "{{ vm.vm_cores }}"
|
|
memory: "{{ vm.vm_memory }}"
|
|
onboot: true
|
|
tags: [bwpoc]
|
|
ciuser: "{{ poc_vm_user }}"
|
|
sshkeys: "{{ lookup('ansible.builtin.file', poc_ssh_pubkey_file) }}"
|
|
ipconfig:
|
|
ipconfig0: "ip=dhcp" # passerelle et DNS fournis par le DHCP du VLAN LAB
|
|
ciupgrade: false
|
|
|
|
- name: "{{ vm_name }} : démarrage"
|
|
community.proxmox.proxmox_kvm:
|
|
node: "{{ pve_node }}"
|
|
vmid: "{{ vm.vm_id }}"
|
|
state: started
|
|
timeout: 120
|
|
|
|
- name: "{{ vm_name }} : adresse DHCP remontée par l'agent QEMU"
|
|
community.proxmox.proxmox_vm_info:
|
|
node: "{{ pve_node }}"
|
|
vmid: "{{ vm.vm_id }}"
|
|
config: current
|
|
network: true
|
|
register: vm_net
|
|
until: >-
|
|
(vm_net.proxmox_vms[0].network | default([]) | rejectattr('name', 'equalto', 'lo')
|
|
| map(attribute='ip-addresses') | flatten | selectattr('ip-address-type', 'equalto', 'ipv4') | list | length) > 0
|
|
retries: 40
|
|
delay: 10
|
|
|
|
- name: "{{ vm_name }} : mémoriser l'IP"
|
|
ansible.builtin.set_fact:
|
|
vm_ip: >-
|
|
{{ vm_net.proxmox_vms[0].network | rejectattr('name', 'equalto', 'lo')
|
|
| map(attribute='ip-addresses') | flatten | selectattr('ip-address-type', 'equalto', 'ipv4')
|
|
| map(attribute='ip-address') | first }}
|
|
|
|
- name: "{{ vm_name }} : écrire l'IP dans inventory/host_vars (relu par les playbooks suivants)"
|
|
ansible.builtin.copy:
|
|
dest: "{{ inventory_dir }}/host_vars/{{ vm_name }}/dhcp.yml"
|
|
mode: "0644"
|
|
content: |
|
|
# Généré par 00-proxmox.yml : IP obtenue par DHCP (VMID {{ vm.vm_id }})
|
|
ansible_host: {{ vm_ip }}
|
|
|
|
- name: "{{ vm_name }} : attente du SSH sur {{ vm_ip }}"
|
|
ansible.builtin.wait_for:
|
|
host: "{{ vm_ip }}"
|
|
port: 22
|
|
timeout: 300
|