ricketsiallpox

Create proxmox template

Oct 5th, 2025
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
YAML 5.13 KB | Source Code | 0 0
  1. ---
  2.  
  3. - name: Define template types
  4.   ansible.builtin.set_fact:
  5.     template_types:
  6.       bare:
  7.         vm_id: 1002
  8.         vm_name: ol8-template
  9.       si:
  10.         vm_id: 1003
  11.         vm_name: ol8-si-template
  12.       rac:
  13.         vm_id: 1004
  14.         vm_name: ol8-rac-template
  15.  
  16. - name: Define valid types
  17.   ansible.builtin.set_fact:
  18.     valid_types: "{{ template_types.keys() | list }}"
  19.  
  20. - name: Assert template type
  21.   ansible.builtin.assert:
  22.     that:
  23.      - template_type is defined
  24.       - template_type in valid_types
  25.  
  26. - name: Define vm_id and vm_name
  27.   ansible.builtin.set_fact:
  28.     vm_id: "{{ template_types[template_type].vm_id }}"
  29.     vm_name: "{{ template_types[template_type].vm_name }}"
  30.  
  31. - name: Check if Oracle Linux 8 cloud image exists
  32.   ansible.builtin.stat:
  33.     path: "{{ image_storage_path }}/{{ ol8_image_filename }}"
  34.   no_log: true
  35.   register: ol8_image_check
  36.  
  37. - name: Download Oracle Linux 8 cloud image
  38.   ansible.builtin.get_url:
  39.     url: "{{ ol8_image_url }}"
  40.     dest: "{{ image_storage_path }}/{{ ol8_image_filename }}"
  41.     mode: '0644'
  42.     timeout: 600
  43.   async: 3600
  44.   poll: 15
  45.   when: not ol8_image_check.stat.exists
  46.   register: image_download
  47.  
  48. - name: Check if VM already exists
  49.   ansible.builtin.shell: |
  50.    set -o pipefail && qm list | grep -q '^.*{{ vm_id }}'
  51.   args:
  52.     executable: /bin/bash
  53.   register: vm_exists
  54.   failed_when: false
  55.   changed_when: false
  56.  
  57. - name: Fail if VM already exists
  58.   ansible.builtin.fail:
  59.     msg: "VM {{ vm_name }} already exists"
  60.   when: vm_exists.rc == 0
  61.  
  62. - name: Create new VM
  63.   ansible.builtin.command: >
  64.    qm create {{ vm_id }}
  65.       --name {{ vm_name }}
  66.       --memory {{ vm_memory }}
  67.       --cores {{ vm_cores }}
  68.       --net0 virtio={{ 'BC:24:11' | community.general.random_mac(seed=vm_name) }},bridge={{ vm_network_bridge }}
  69.       --scsihw virtio-scsi-pci
  70.       --scsi0 {{ vm_storage }}:0,import-from={{ image_storage_path }}/{{ ol8_image_filename }},discard=on
  71.       --ide2 {{ vm_storage }}:cloudinit
  72.       --boot c --bootdisk scsi0
  73.       --serial0 socket --vga serial0
  74.       --agent enabled=1
  75.       --localtime 1
  76.   register: qm_create_result
  77.   changed_when: qm_create_result == 0
  78.  
  79. - name: Resize disk to desired size
  80.   ansible.builtin.command: qm resize {{ vm_id }} scsi0 {{ vm_disk_size }}
  81.   register: qm_resize_result
  82.   changed_when: qm_resize_result == 0
  83.  
  84. - name: Copy Cloud-Init data to snippets
  85.   ansible.builtin.template:
  86.     src: user-data.j2
  87.     dest: "/var/lib/vz/snippets/user-data-{{ vm_id }}.yml"
  88.     owner: root
  89.     group: root
  90.     mode: '0644'
  91.  
  92. - name: Configure Cloud-Init settings
  93.   ansible.builtin.command: >
  94.    qm set {{ vm_id }}
  95.     --cicustom "user=local:snippets/user-data-{{ vm_id }}.yml"
  96.     --ipconfig0 ip=dhcp
  97.   register: qm_set_result
  98.   changed_when: qm_set_result == 0
  99.  
  100. - name: Start VM
  101.   ansible.builtin.command: "qm start {{ vm_id }}"
  102.   register: qm_start_result
  103.   changed_when: qm_start_result == 0
  104.  
  105. - name: Check VM status and wait for it to be stopped
  106.   ansible.builtin.shell: "qm status {{ vm_id }}"
  107.   register: qm_status_result
  108.   until: "'status: stopped' in qm_status_result.stdout"
  109.   retries: 60
  110.   delay: 15
  111.   changed_when: false
  112.  
  113. - name: "Remove cloud init drive from {{ vm_id }}"
  114.   ansible.builtin.command:
  115.     cmd: "qm set {{ vm_id }} --ide2 none"
  116.   changed_when: true
  117.   failed_when: false
  118.  
  119. - name: "Generate Cloud-Init configuration for {{ vm_name }}"
  120.   ansible.builtin.template:
  121.     src: cloud-init.yml.j2
  122.     dest: "/var/lib/vz/snippets/ci-{{ vm_id }}.yaml"
  123.     mode: '0644'
  124.  
  125. - name: "Attach cloud-init drive and apply configuration"
  126.   ansible.builtin.shell:
  127.     cmd: "qm set {{ vm_id }} --ide2 \"local-lvm:cloudinit\" && qm set {{ vm_id }} --cicustom \"user=local:snippets/ci-{{ vm_id }}.yaml\""
  128.   changed_when: true
  129.  
  130. - name: Start VM
  131.   ansible.builtin.command: "qm start {{ vm_id }}"
  132.   register: qm_start_result
  133.   changed_when: qm_start_result == 0
  134.  
  135. - name: "Wait for VM to start"
  136.   ansible.builtin.wait_for:
  137.     host: "{{ vm_name }}"
  138.     port: 22
  139.     delay: 30
  140.  
  141. - name: Configure template
  142.   when: template_type == 'si'
  143.   ansible.builtin.import_tasks:
  144.     file: configure_si.yml
  145.   delegate_to: "{{ vm_name }}"
  146.   remote_user: oracle
  147.  
  148. - name: Configure template
  149.   when: template_type == 'rac'
  150.   ansible.builtin.import_tasks:
  151.     file: configure_rac.yml
  152.   delegate_to: "{{ vm_name }}"
  153.   remote_user: oracle
  154.  
  155. - name: Prepare the VM for template
  156.   ansible.builtin.command:
  157.     cmd: "{{ item }}"
  158.   with_items:
  159.    - "rm -f /etc/machine-id"
  160.     - "rm -f /var/lib/dbus/machine-id"
  161.   delegate_to: "{{ vm_name }}"
  162.   become: true
  163.   remote_user: oracle
  164.  
  165. - name: Stop VM
  166.   ansible.builtin.command: "qm stop {{ vm_id }}"
  167.   register: qm_stop_result
  168.   changed_when: qm_stop_result == 0
  169.  
  170. - name: Check VM status and wait for it to be stopped
  171.   ansible.builtin.shell: "qm status {{ vm_id }}"
  172.   register: qm_status_result
  173.   until: "'status: stopped' in qm_status_result.stdout"
  174.   retries: 60
  175.   delay: 15
  176.   changed_when: false
  177.  
  178. - name: Convert the VM to a template
  179.   ansible.builtin.command: "qm template {{ vm_id }}"
  180.   register: qm_tmpl_result
  181.   changed_when: qm_tmpl_result == 0
  182.  
Advertisement
Add Comment
Please, Sign In to add comment