diff --git a/roles/freeipa-setup/templates/deploy_freeipa.sh.j2 b/roles/freeipa-setup/templates/deploy_freeipa.sh.j2 index 9b32e5884..5914bbdb6 100644 --- a/roles/freeipa-setup/templates/deploy_freeipa.sh.j2 +++ b/roles/freeipa-setup/templates/deploy_freeipa.sh.j2 @@ -80,4 +80,4 @@ EOF iptables-restore < freeipa-iptables-rules.txt -### ---stop_docs \ No newline at end of file +### ---stop_docs diff --git a/roles/modify-image/defaults/main.yml b/roles/modify-image/defaults/main.yml index 26d8687ee..1b531dcbf 100644 --- a/roles/modify-image/defaults/main.yml +++ b/roles/modify-image/defaults/main.yml @@ -24,3 +24,6 @@ modify_image_working_dir: "{{ working_dir }}" # modify_image_vc_root_password: modify_image_vc_verbose: false modify_image_vc_trace: false +libguestfs_mode: true +# TODO(sshnaidm): implement initramfs image modifying +initramfs_image: false diff --git a/roles/modify-image/tasks/libguestfs.yml b/roles/modify-image/tasks/libguestfs.yml new file mode 100644 index 000000000..93a9b2b07 --- /dev/null +++ b/roles/modify-image/tasks/libguestfs.yml @@ -0,0 +1,61 @@ +- name: ensure libguestfs is installed + yum: name=libguestfs-tools-c state=latest + become: true + +- name: virt-customize args --> reset private var + set_fact: _vc_args="" + +- name: virt-customize args --> memory + set_fact: _vc_args="{{ _vc_args }} -m {{ modify_image_vc_ram }}" + when: modify_image_vc_ram is defined + +- name: virt-customize args --> cpu + set_fact: _vc_args="{{ _vc_args }} --smp {{ modify_image_vc_cpu }}" + when: modify_image_vc_cpu is defined + +- name: virt-customize args --> verbose output + set_fact: _vc_args="{{ _vc_args }} -v" + when: modify_image_vc_verbose|bool + +- name: virt-customize args --> trace/debug output + set_fact: _vc_args="{{ _vc_args }} -x" + when: modify_image_vc_trace|bool + +- name: virt-customize args --> upload files + set_fact: _vc_args="{{ _vc_args }} --upload {{ item.src }}:{{ item.dest }}" + with_items: "{{ modify_image_upload_files }}" + +- name: virt-customize args --> install packages + set_fact: _vc_args="{{ _vc_args }} --install {{ modify_image_install_packages|join(",") }}" + when: modify_image_install_packages + +- name: virt-customize args --> modify script + set_fact: _vc_args="{{ _vc_args }} --run {{ modify_script }}" + when: modify_script is defined + +- name: virt-customize args --> root password + set_fact: _vc_args="{{ _vc_args }} --root-password password:{{ modify_image_vc_root_password }}" + when: modify_image_vc_root_password is defined + +- name: Run virt-customize on the provided image + shell: > + virt-customize {{ _vc_args }} + -a {{ image_to_modify }} + > {{ modify_script|default('modify_image') }}.log 2>&1 + environment: + LIBGUESTFS_BACKEND: direct + args: + chdir: "{{ modify_image_working_dir }}" + +- name: Extract artifacts from the image + shell: > + virt-copy-out + -a {{ image_to_modify }} + {{ item }} + {{ modify_image_working_dir }} + environment: + LIBGUESTFS_BACKEND: direct + args: + chdir: "{{ modify_image_working_dir }}" + with_items: "{{ modify_image_extract_list }}" + diff --git a/roles/modify-image/tasks/main.yml b/roles/modify-image/tasks/main.yml index 3c76dc9f3..28d7ccad4 100644 --- a/roles/modify-image/tasks/main.yml +++ b/roles/modify-image/tasks/main.yml @@ -7,64 +7,8 @@ provided." when: image_to_modify is not defined or (modify_script is not defined and modify_image_upload_files == []) -- name: ensure libguestfs is installed - yum: name=libguestfs-tools-c state=latest - become: true - -- name: virt-customize args --> reset private var - set_fact: _vc_args="" - -- name: virt-customize args --> memory - set_fact: _vc_args="{{ _vc_args }} -m {{ modify_image_vc_ram }}" - when: modify_image_vc_ram is defined - -- name: virt-customize args --> cpu - set_fact: _vc_args="{{ _vc_args }} --smp {{ modify_image_vc_cpu }}" - when: modify_image_vc_cpu is defined - -- name: virt-customize args --> verbose output - set_fact: _vc_args="{{ _vc_args }} -v" - when: modify_image_vc_verbose|bool - -- name: virt-customize args --> trace/debug output - set_fact: _vc_args="{{ _vc_args }} -x" - when: modify_image_vc_trace|bool - -- name: virt-customize args --> upload files - set_fact: _vc_args="{{ _vc_args }} --upload {{ item.src }}:{{ item.dest }}" - with_items: "{{ modify_image_upload_files }}" - -- name: virt-customize args --> install packages - set_fact: _vc_args="{{ _vc_args }} --install {{ modify_image_install_packages|join(",") }}" - when: modify_image_install_packages - -- name: virt-customize args --> modify script - set_fact: _vc_args="{{ _vc_args }} --run {{ modify_script }}" - when: modify_script is defined - -- name: virt-customize args --> root password - set_fact: _vc_args="{{ _vc_args }} --root-password password:{{ modify_image_vc_root_password }}" - when: modify_image_vc_root_password is defined - -- name: Run virt-customize on the provided image - shell: > - virt-customize {{ _vc_args }} - -a {{ image_to_modify }} - > {{ modify_script|default('modify_image') }}.log 2>&1 - environment: - LIBGUESTFS_BACKEND: direct - args: - chdir: "{{ modify_image_working_dir }}" - -- name: Extract artifacts from the image - shell: > - virt-copy-out - -a {{ image_to_modify }} - {{ item }} - {{ modify_image_working_dir }} - environment: - LIBGUESTFS_BACKEND: direct - args: - chdir: "{{ modify_image_working_dir }}" - with_items: "{{ modify_image_extract_list }}" +- include: libguestfs.yml + when: libguestfs_mode|bool +- include: manual.yml + when: not libguestfs_mode|bool diff --git a/roles/modify-image/tasks/manual.yml b/roles/modify-image/tasks/manual.yml new file mode 100644 index 000000000..b9ffc8db0 --- /dev/null +++ b/roles/modify-image/tasks/manual.yml @@ -0,0 +1,57 @@ +- when: not initramfs_image|bool + block: + + - name: Set abs path for image + shell: echo "{{ image_to_modify }}" + register: image_to_modify_abs_path + + - name: Set names for images and temp dir + set_fact: + image_to_modify_qcow: "{{ image_to_modify_abs_path.stdout }}" + image_to_modify_raw: "{{ image_to_modify_abs_path.stdout|replace('qcow2', 'raw') }}" + mount_tempdir: "{{ lookup('pipe', 'mktemp -d') }}" + + - name: Convert image + shell: > + qemu-img convert -f qcow2 -O raw {{ image_to_modify_qcow }} {{ image_to_modify_raw }}; + rm -rf "{{ image_to_modify_qcow }}"; + + - name: Mount image + shell: > + kpartx -avs {{ image_to_modify_raw }}; + mount /dev/mapper/loop0p1 {{ mount_tempdir }} || mount /dev/loop0 {{ mount_tempdir }}; + become: true + + - name: Upload files to image + shell: > + cp {{ item.src }} {{ mount_tempdir }}/{{ item.dest }}; + with_items: "{{ modify_image_upload_files }}" + become: true + + - name: Run script on image + shell: > + mv {{ mount_tempdir }}/etc/resolv.conf{,_}; + echo -e "nameserver 8.8.8.8\nnameserver 8.8.4.4" > {{ mount_tempdir }}/etc/resolv.conf; + cp {{ modify_script }} {{ mount_tempdir }}/tmp/{{ modify_script|basename }}; + set -o pipefail && chroot {{ mount_tempdir }} /bin/bash /tmp/{{ modify_script|basename }} 2>&1 + {{ timestamper_cmd }} > {{ working_dir }}/{{ modify_script|basename }}.$(date +%s).log; + mv -f {{ mount_tempdir }}/etc/resolv.conf{_,}; + become: true + + - name: Extract files from image + shell: cp {{ mount_tempdir }}/{{ item }} {{ modify_image_working_dir }}/; + with_items: "{{ modify_image_extract_list }}" + ignore_errors: true + become: true + + - name: Close image + shell: > + chroot {{ mount_tempdir }} setfiles /etc/selinux/targeted/contexts/files/file_contexts / ; + umount {{ mount_tempdir }}; + kpartx -dv {{ image_to_modify_raw }}; + qemu-img convert -c -f raw -O qcow2 {{ image_to_modify_raw }} {{ image_to_modify_qcow }}; + rm -rf "{{ image_to_modify_raw }}"; + losetup -d /dev/loop0; + rm -rf "{{ mount_tempdir }}"; + chown -R {{ undercloud_user }}: /home/{{ undercloud_user }}/; + become: true