Skip to content

Instantly share code, notes, and snippets.

@iamarya2k24
Created September 4, 2019 12:31
Show Gist options
  • Save iamarya2k24/e9d76b3884f881e1ee14eba2a348010d to your computer and use it in GitHub Desktop.
Save iamarya2k24/e9d76b3884f881e1ee14eba2a348010d to your computer and use it in GitHub Desktop.
Ansible Template for Debian Auto Install with Virtual Disk, 2 Network Cards.
-append "preseed/url={{ item.value.preseed | default(deployments[item.value.type].preseed) }}
debian-installer/allow_unauthenticated_ssl=true
debian-installer/locale=en_US.UTF-8
keyboard-configuration/layoutcode=us
console-setup/ask_detect=false
debian/priority=critical
vga=normal
netcfg/choose_interface=auto
localechooser/translation/warn-light=true
localechooser/translation/warn-severe=true
console-setup/ask_detect=false
netcfg/get_hostname={{ item.key }}
{% if item.value.network is defined %}
{% if item.value.network.domainname is defined %}
netcfg/get_domain={{ item.value.network.domainname }}
{% endif %}
{% if ( item.value.network.ip is defined and item.value.network.netmask is defined ) %}
netcfg/confirm_static=true
netcfg/disable_dhcp=true
netcfg/get_ipaddress={{ item.value.network.ip }}
netcfg/get_netmask={{ item.value.network.netmask }}
{% if item.value.network.gateway is defined %}
netcfg/get_gateway={{ item.value.network.gateway }}
{% endif %}
{% if item.value.network.nameserver is defined %}
netcfg/get_nameservers={{ item.value.network.nameserver }}
{% endif %}
{% endif %}
{% else %}
netcfg/get_domain=string unassigned-domain
{% endif %}
FRONTEND_BACKGROUND=original"
---
# Invocation: ansible-playbook pve_create_vm.yml -e "pve_node=node1 pve_guest=testguest" --diff
- hosts: "{{ pve_node }}"
handlers:
- name: sleep
pause:
seconds: 5
tasks:
# TODO: Install from stretch-backports once available there
- name: "Install python-proxmoxer"
apt:
deb: "http://ftp.de.debian.org/debian/pool/main/p/proxmoxer/python-proxmoxer_1.0.2-1_all.deb"
state: present
- name: "Create Debian-Installer directory on PVE node"
file:
path: "/var/local/d-i/{{ pve_guest }}/tmp"
state: directory
owner: root
group: root
mode: 0755
- name: "Update Debian-Installer files"
get_url:
url: "http://ftp.de.debian.org/debian/dists/stretch/main/installer-amd64/current/images/netboot/debian-installer/amd64/{{ item }}"
dest: "/var/local/d-i/"
with_items:
- linux
- initrd.gz
- name: "Copy Debian preseed file for VM {{ pve_guest }}"
template:
src: "../templates/pve_create_vm/preseed.cfg.j2"
dest: "/var/local/d-i/{{ pve_guest }}/{{ item }}"
owner: root
group: root
mode: 0644
with_items:
- "preseed.cfg"
- "tmp/preseed.cfg"
- name: "Unpack initrd.gz for VM {{ pve_guest }}"
shell: "gunzip -c /var/local/d-i/initrd.gz | cpio -i"
args:
chdir: "/var/local/d-i/{{ pve_guest }}/tmp"
creates: "/var/local/d-i/{{ pve_guest }}/tmp/init"
- name: "Build new initrd.gz for VM {{ pve_guest }}"
shell: "find . | cpio -H newc -o | gzip -9 >/var/local/d-i/{{ pve_guest }}/initrd.gz"
args:
chdir: "/var/local/d-i/{{ pve_guest }}/tmp"
creates: "/var/local/d-i/{{ pve_guest }}/initrd.gz"
- name: "Cleanup initrd.gz tmp files from VM {{ pve_guest }}"
file:
path: "/var/local/d-i/{{ pve_guest }}/tmp"
state: absent
- name: "Get next VM ID"
command: >
python -c 'from proxmoxer import ProxmoxAPI; print ProxmoxAPI(
"{{ pve_node }}.{{ domain }}", user="{{ pve_api_user }}",
password="{{ pve_api_password }}").cluster.nextid.get();'
check_mode: False
changed_when: False
register: __pve_next_vmid
- set_fact:
pve_vmid: "{{ __pve_next_vmid.stdout }}"
- name: "Create Virtual disk for for VM {{ pve_guest }}"
- ovirt_disk:
name: myvm_disk
vm_name: rhel7
size: 10GiB
format: cow
interface: virtio
storage_domain: data
- name: "Create VM {{ pve_guest }}"
proxmox_kvm:
api_user: '{{ pve_api_user }}'
api_password: '{{ pve_api_password }}'
api_host: '{{ pve_node }}.{{ domain }}'
vmid: '{{ pve_vmid }}'
node: '{{ pve_node }}'
name: '{{ pve_guest }}'
state: 'present'
ostype: 'l26'
cores: '{{ pve_cores|d("2") }}'
memory: '{{ pve_memory|d("2048") }}'
scsihw: 'virtio-scsi-pci'
scsi: '{"scsi0":"zpool1:vm-{{ pve_vmid }}-disk-1,size={{ pve_size|d("30G") }}"}'
bootdisk: 'scsi0'
net: '{"net0":"virtio,bridge=vmbr0","net1":"virtio,bridge=vmbr1"}'
args: '-serial unix:/var/run/qemu-server/{{ pve_vmid }}.serial,server,nowait -kernel /var/local/d-i/linux -initrd /var/local/d-i/{{ pve_guest }}/initrd.gz -no-reboot'
notify: sleep
register: __pve_vm_created
- meta: flush_handlers
when: __pve_vm_created.changed
- name: "Start installation on VM {{ pve_guest }}"
proxmox_kvm:
api_user: '{{ pve_api_user }}'
api_password: '{{ pve_api_password }}'
api_host: '{{ pve_node }}.{{ domain }}'
vmid: '{{ pve_vmid }}'
node: '{{ pve_node }}'
name: '{{ pve_guest }}'
state: 'started'
notify: sleep
when: __pve_vm_created.changed
- meta: flush_handlers
when: __pve_vm_created.changed
- name: "Remove deploy args from VM {{ pve_guest }}"
proxmox_kvm:
api_user: '{{ pve_api_user }}'
api_password: '{{ pve_api_password }}'
api_host: '{{ pve_node }}.{{ domain }}'
vmid: '{{ pve_vmid }}'
node: '{{ pve_node }}'
name: '{{ pve_guest }}'
args: '-serial unix:/var/run/qemu-server/{{ pve_vmid }}.serial,server,nowait'
update: yes
when: __pve_vm_created.changed
- name: "Get PID from installation on VM {{ pve_guest }}"
slurp:
src: "/var/run/qemu-server/{{ pve_vmid }}.pid"
register: __pve_vm_pidfile
- set_fact:
pve_vm_pid: "{{ __pve_vm_pidfile['content'] | b64decode | trim }}"
# Unfortunately, pidfile in /var/run/qemu-server/ is not cleaned up when VM
# halts. Thus we have to wait for the /proc/<PID>/status to disappear.
- name: "Wait for VM to be halted after installation"
wait_for:
path: "/proc/{{ pve_vm_pid }}/status"
state: absent
delay: 60
timeout: 900
when: __pve_vm_created.changed
- name: "Start VM {{ pve_guest }}"
proxmox_kvm:
api_user: '{{ pve_api_user }}'
api_password: '{{ pve_api_password }}'
api_host: '{{ pve_node }}.{{ domain }}'
vmid: '{{ pve_vmid }}'
node: '{{ pve_node }}'
name: '{{ pve_guest }}'
state: 'started'
when: __pve_vm_created.changed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment