diff --git a/libvirt-ansible-python/README.md b/libvirt-ansible-python/README.md index 0c8e4b3..7c36101 100644 --- a/libvirt-ansible-python/README.md +++ b/libvirt-ansible-python/README.md @@ -1,10 +1,7 @@ # Quick configuration # -To quickly set up your pulumi deployment, configure the following settings: +Check out the file `input.yml` for a quick setup for a new machine. +Also, don't forget to setup the password for your account on your ProxmoxVE +server configuring `pulumi`: $ pulumi config set libvirt:uri --plaintext "qemu:///system" - $ pulumi config set image_url --plaintext "https://cdimage.debian.org/images/cloud/bullseye-backports/20220711-1073/debian-11-backports-generic-amd64-20220711-1073.qcow2" - $ pulumi config set disksize --plaintext 20 - $ pulumi config set memory --plaintext 2048 - $ pulumi config set ansible_playbook --plaintext deploy.yml - diff --git a/libvirt-ansible-python/__main__.py b/libvirt-ansible-python/__main__.py index 79e8348..88c4078 100644 --- a/libvirt-ansible-python/__main__.py +++ b/libvirt-ansible-python/__main__.py @@ -3,29 +3,38 @@ import pulumi import pulumi_libvirt as lv import pulumi_command as command +import yaml +from dotmap import DotMap +from jinja2 import Template +from passlib import sha512_crypt + +conf = DotMap(yaml.safe_load(open("./input.yaml", "r").read())) + +# Replacing readed password with its own counterpart. +conf.password = sha512_crypt.hash(conf.password, rounds=4096) config = pulumi.Config() -pool = lv.Pool("default", +pool = lv.Pool("pool", type = "dir", - path = "/var/tmp/libvirt/pulumi" + path = conf.poolpath ) baseimg = lv.Volume("base-image", pool = pool.name, - source = config.require("image_url") + source = conf.image_url #source = "https://cdimage.debian.org/images/cloud/bullseye-backports/20220711-1073/debian-11-backports-generic-amd64-20220711-1073.qcow2" ) volume = lv.Volume("disk", base_volume_id = baseimg.id, pool = pool.name, - size = int(config.require("disksize")) * 1024 ** 3 + size = int(conf.disksize) * 1024 ** 3 ) # Stream configuration files -userdata = open("./cloud-init/user-data", "r").read() -metadata = open("./cloud-init/meta-data", "r").read() +userdata = Template(open("./cloud-init/user-data.jinja", "r").read()).render(conf) +metadata = Template(open("./cloud-init/meta-data.jinja", "r").read()).render(conf) networkconfig = open("./cloud-init/network-config", "r").read() cloudinit = lv.CloudInitDisk("cloud-init", @@ -34,13 +43,13 @@ cloudinit = lv.CloudInitDisk("cloud-init", network_config = networkconfig ) -vm = lv.Domain("debian11", +vm = lv.Domain(vm.name, boot_devices = [ lv.DomainBootDeviceArgs( devs = [ "hd", "cdrom" ] ) ], cloudinit = cloudinit.id, disks = [ lv.DomainDiskArgs(volume_id = volume.id) ], - memory = int(config.require("memory")), + memory = int(conf.ram), network_interfaces = [ lv.DomainNetworkInterfaceArgs( network_name = "default", wait_for_lease = True @@ -58,16 +67,15 @@ vm = lv.Domain("debian11", # Creating the inventory file inventory = command.local.Command("a-inventory", create = vm.network_interfaces[0]['addresses'][0].apply( - lambda ipaddr: f"echo '{vm_name} ansible_host={ipaddr} ansible_user=syntaxerrormm' >./inventory" + lambda ipaddr: f"echo '{conf.name} ansible_host={ipaddr} ansible_user={conf.username}' >./inventory" ), delete = "rm -f ./inventory", opts = pulumi.ResourceOptions(depends_on = [ vm ]) ) # Applying the command -ansible_playbook = config.require("ansible_playbook") execute_ansible = command.local.Command("a-deploy", - create = f"ansible-playbook {ansible_playbook}", + create = f"ansible-playbook {conf.ansible_playbook}", delete = "rm -f ./ansible.log", opts = pulumi.ResourceOptions(depends_on = [ inventory ]) ) diff --git a/libvirt-ansible-python/cloud-init/meta-data b/libvirt-ansible-python/cloud-init/meta-data deleted file mode 100644 index 75c7c6a..0000000 --- a/libvirt-ansible-python/cloud-init/meta-data +++ /dev/null @@ -1,2 +0,0 @@ -instance-id: debian11 -local-hostname: debian11 diff --git a/libvirt-ansible-python/cloud-init/meta-data.jinja b/libvirt-ansible-python/cloud-init/meta-data.jinja new file mode 100644 index 0000000..3ac6292 --- /dev/null +++ b/libvirt-ansible-python/cloud-init/meta-data.jinja @@ -0,0 +1,2 @@ +instance-id: {{ conf.name }} +local-hostname: {{ conf.name }} diff --git a/libvirt-ansible-python/cloud-init/user-data b/libvirt-ansible-python/cloud-init/user-data deleted file mode 100644 index 6609114..0000000 --- a/libvirt-ansible-python/cloud-init/user-data +++ /dev/null @@ -1,24 +0,0 @@ -#cloud-config -resize_rootfs: true -users: - - name: syntaxerrormmm - sudo: ALL=(ALL) NOPASSWD:ALL - groups: users, admin - shell: /bin/bash - ssh_authorized_keys: - - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFioHkaV1NhX6NCqsJakJw8EVBOcDHm1MEbpY499CPtG syntaxerrormmm@fisso - - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILu91hBh8pNRt4eE1pug0Y4jCHZDCcMJ+vj3CiF5EQHV syntaxerrormmm@syntaxxps - - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP/hn/0xn6DRS2B0paFzDQRakupgTQQ5hitQhqOfWcqz syntaxerrormmm@microbo - hashed_passwd: $6$rounds=4096$4ZUeoch.EwyR/TLb$.71i1otUQpw2eMlrjcP3H4XxsnLlVbIQxagFDGviOvCaIz7ONa.tTZPO09YL7hiAh4vLaTcGD43VoAM6tEYjx/ -ssh_pwauth: true -disable_root: false -chpasswd: - expire: false - list: | - root:$6$rounds=4096$4ZUeoch.EwyR/TLb$.71i1otUQpw2eMlrjcP3H4XxsnLlVbIQxagFDGviOvCaIz7ONa.tTZPO09YL7hiAh4vLaTcGD43VoAM6tEYjx/ - syntaxerrormmm:$6$rounds=4096$4ZUeoch.EwyR/TLb$.71i1otUQpw2eMlrjcP3H4XxsnLlVbIQxagFDGviOvCaIz7ONa.tTZPO09YL7hiAh4vLaTcGD43VoAM6tEYjx/ -#packages: -# - qemu-guest-agent -#power_state: -# delay: now -# mode: reboot diff --git a/libvirt-ansible-python/cloud-init/user-data.jinja b/libvirt-ansible-python/cloud-init/user-data.jinja new file mode 100644 index 0000000..75d3a1b --- /dev/null +++ b/libvirt-ansible-python/cloud-init/user-data.jinja @@ -0,0 +1,24 @@ +#cloud-config +resize_rootfs: true +users: + - name: {{ conf.username }} + sudo: ALL=(ALL) NOPASSWD:ALL + groups: users, admin + shell: /bin/bash + ssh_authorized_keys: + {% for key in conf.sshkeys %} + - {{ item }} + {% endfor %} + hashed_passwd: {{ conf.password }} +ssh_pwauth: true +disable_root: false +chpasswd: + expire: false + list: | + root:{{ conf.password }} + syntaxerrormmm:{{ conf.password }} +#packages: +# - qemu-guest-agent +#power_state: +# delay: now +# mode: reboot diff --git a/libvirt-ansible-python/input.yaml b/libvirt-ansible-python/input.yaml new file mode 100644 index 0000000..12cdeaf --- /dev/null +++ b/libvirt-ansible-python/input.yaml @@ -0,0 +1,18 @@ +--- +# Basic VM configuration +name: virtual-machine +vcpu: 1 +ram: 2048 +disksize: 20 +username: syntaxerrormmm +password: cicciopasticcio +sshkeys: + - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFioHkaV1NhX6NCqsJakJw8EVBOcDHm1MEbpY499CPtG syntaxerrormmm@fisso" + - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILu91hBh8pNRt4eE1pug0Y4jCHZDCcMJ+vj3CiF5EQHV syntaxerrormmm@syntaxxps" + - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP/hn/0xn6DRS2B0paFzDQRakupgTQQ5hitQhqOfWcqz syntaxerrormmm@microbo" + +image_url: "https://cdimage.debian.org/images/cloud/bullseye-backports/20220711-1073/debian-11-backports-generic-amd64-20220711-1073.qcow2" +poolpath: /var/tmp/libvirt/pulumi + +# Ansible configuration +ansible_playbook: deploy.yml diff --git a/libvirt-ansible-python/requirements.txt b/libvirt-ansible-python/requirements.txt index 2b0919c..b83b294 100644 --- a/libvirt-ansible-python/requirements.txt +++ b/libvirt-ansible-python/requirements.txt @@ -1,3 +1,6 @@ pulumi>=3.0.0,<4.0.0 pulumi_libvirt>=0.3.0 pulumi-command>=0.4.1 +Jinja2>=3.1.2 +dotmap>=1.3.30 +passlib>=1.7.4