Created
September 4, 2019 12:31
-
-
Save iamarya2k24/e9d76b3884f881e1ee14eba2a348010d to your computer and use it in GitHub Desktop.
Ansible Template for Debian Auto Install with Virtual Disk, 2 Network Cards.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-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" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- | |
# 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