{"id":15135,"date":"2026-01-14T22:51:48","date_gmt":"2026-01-15T06:51:48","guid":{"rendered":"https:\/\/www.apolonio.com\/blog\/?p=15135"},"modified":"2026-01-14T22:51:48","modified_gmt":"2026-01-15T06:51:48","slug":"lab-back-up","status":"publish","type":"post","link":"https:\/\/www.apolonio.com\/blog\/?p=15135","title":{"rendered":"Lab Back Up"},"content":{"rendered":"\n<p>Still need a lab, not just a lab, but VMs with a minimal install.<\/p>\n\n\n\n<p>One skill I have lost was building machines from scratch that don&#8217;t have the packages I need.<\/p>\n\n\n\n<p>I am working a bit on a playbook that can change passwords.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">---<br>- name: Securely change root password on multiple machines<br>  hosts: all<br>  become: yes<br>  vars:<br>     local_rpm_path: \"python3-passlib-1.7.4-9.el9.noarch.rpm\"<br>     package_name: \"python3-passlib\"<br><br>  vars_files:<br>    - vault_root_passwords.yml<br><br>  tasks:<br>    - name: Gather installed package facts<br>      ansible.builtin.package_facts:<br>        manager: auto<br><br>    - name: Copy RPM to target<br>      ansible.builtin.copy:<br>        src: \"{{ local_rpm_path }}\"<br>        dest: \/tmp\/python3-passlib-1.7.4-9.el9.noarch.rpm<br>        mode: '0644'<br>      when: package_name not in ansible_facts.packages<br><br>    - name: Install package from local RPM file if not installed<br>      ansible.builtin.dnf: <br>        name: \/tmp\/python3-passlib-1.7.4-9.el9.noarch.rpm<br>        state: present<br>        disable_gpg_check: true <br>      when: package_name not in ansible_facts.packages<br><br>    - name: Set unique root password per host<br>      ansible.builtin.user:<br>        name: root<br>        password: \"{{ root_passwords[inventory_hostname] | password_hash('sha512') }}\"<br>      no_log: true<br><br>    - name: \"Support Password\"<br>      ansible.builtin.user:<br>        name: support<br>        state: present<br>        password: \"{{ support_password[inventory_hostname] | password_hash('sha512') }}\"<br>      no_log: true<br>...<br><\/pre>\n\n\n\n<p>I needed that python3-passlib file what got me on the path of a small minimal install.<\/p>\n\n\n\n<p>Here is a sample of the vault_root_passwords.yml<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">root_passwords:<br>  lxhost01.retrodvr.com: arajmyisyeeng7<br>  lxhost02.retrodvr.com: giojisthoc9<br>  lxhost03.retrodvr.com: crersyijlirfuv5<br>support_password:<br>  lxhost01.retrodvr.com: 3onagvakni<br>  lxhost02.retrodvr.com: gejed4shlamegso<br>  lxhost03.retrodvr.com: un5olwugus<br><\/pre>\n\n\n\n<p>I really used those passwords because it is easy to recreate a new one<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#!\/bin\/bash<br>HOSTNAMELIST=`ansible-vault view inventory | grep -v '^\\[' | awk '{print $1}';`<br>echo \"root_passwords:\"<br>for HOSTNAME in $HOSTNAMELIST<br>do<br>  PASSWORD=`apg -n1 -m10 -x15 -MN`<br>  echo \"  $HOSTNAME: $PASSWORD\"<br>done<br><br>echo \"support_password:\"<br>for HOSTNAME in $HOSTNAMELIST<br>do<br>   PASSWORD=`apg -n1 -m10 -x15 -MN`<br>   echo \"  $HOSTNAME: $PASSWORD\"<br>done<br><\/pre>\n\n\n\n<p>I do encrypt the vault_root_passwords.yml and sometimes the inventory file<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Remove old file\n  rm vault_root_passwords.yml\n\nCreate emmpty file\n  touch vault_root_passwords.yml\n\nLimit perms\n  chmod 0600 vault_root_passwords.yml\n\nCreate Passwords file\n.\/makepwfile.sh > vault_root_passwords.yml\nansible-vault encrypt vault_root_passwords.yml\n<\/pre>\n\n\n\n<p>Weight: 328.4<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Still need a lab, not just a lab, but VMs with a minimal install. One skill I have lost was building machines from scratch that don&#8217;t have the packages I need. I am working a bit on a playbook that &hellip; <a href=\"https:\/\/www.apolonio.com\/blog\/?p=15135\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27,11,3,9],"tags":[],"class_list":["post-15135","post","type-post","status-publish","format-standard","hentry","category-coding","category-technical","category-training","category-weighin"],"_links":{"self":[{"href":"https:\/\/www.apolonio.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/15135","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.apolonio.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.apolonio.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.apolonio.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.apolonio.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=15135"}],"version-history":[{"count":1,"href":"https:\/\/www.apolonio.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/15135\/revisions"}],"predecessor-version":[{"id":15136,"href":"https:\/\/www.apolonio.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/15135\/revisions\/15136"}],"wp:attachment":[{"href":"https:\/\/www.apolonio.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=15135"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.apolonio.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=15135"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.apolonio.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=15135"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}