diff --git a/setup/create_bootable_image.yaml b/setup/create_bootable_image.yaml deleted file mode 100644 index a3054151a..000000000 --- a/setup/create_bootable_image.yaml +++ /dev/null @@ -1,62 +0,0 @@ ---- -- name: "Extracting the raw disk image" - command: qemu-img convert -O raw "{{http_boot_folder}}/{{deploy_image_filename}}" "{{http_boot_folder}}/{{deploy_image_filename}}.raw" -- name: "Copying Image however with 32k of empty space at the beginning of the file." - command: dd if="{{http_boot_folder}}/{{deploy_image_filename}}.raw" of="{{http_boot_folder}}/{{deploy_image_filename}}.bootimg" seek=64 -- name: "Creating Partition Table lining up with the copied file's contents." - shell: echo '32;' | sfdisk "{{http_boot_folder}}/{{deploy_image_filename}}.bootimg" -uB -f -- name: "Allocating one of two loopbacks" - command: losetup -f - register: stored_value_loopback_alpha -- name: "Creating loopback connetion to new image file" - command: losetup "{{stored_value_loopback_alpha.stdout}}" "{{http_boot_folder}}/{{deploy_image_filename}}.bootimg" -- name: "Forcing partition table to be re-read" - command: kpartx -v -a "{{stored_value_loopback_alpha.stdout}}" - # Using second loopback as for some reason /dev/mapper does not translate into a chroot cleanly when devfs is mounted -- name: "Allocating second loopback pointing to the initial partition" - command: losetup -f - register: stored_value_loopback_beta -- name: "Binding second loopback to the first partition" - shell: losetup "{{stored_value_loopback_beta.stdout}}" /dev/mapper/$(echo "{{stored_value_loopback_alpha.stdout}}"|cut -f3 -d '/')p1 - # TODO parameterize folder name/location -- name: "Ensuring we have a location to mount the disk to" - file: path=/mnt/bootimg state=directory -- name: "Mounting volume on /mnt/bootimg" - command: mount "{{stored_value_loopback_beta.stdout}}" /mnt/bootimg -- name: "Binding /sys into /mnt/bootimg/sys" - command: mount -t sysfs sysfs /mnt/bootimg/sys -- name: "Binding /proc into /mnt/bootimg/proc" - command: mount -t proc proc /mnt/bootimg/proc -- name: "Binding /dev into /mnt/bootimg/dev" - command: mount --bind /dev /mnt/bootimg/dev - # Attempt to identify kernel -#- name: "Identify kernel" -# shell: ls vmlinuz* |cut -f 1 -d ' ' chdir=/mnt/bootimg/boot/ -# register: kernel_filename -#- name: "Identify initrd" -# shell: ls initrd* |cut -f 1 -d ' ' chdir=/mnt/bootimg/boot/ -# register: initrd_filename -- name: "Disable Grub Prober" - shell: echo "GRUB_DISABLE_OS_PROBER=true" >>/etc/default/grub -- name: "Disable Grub Prober" - shell: echo 'GRUB_TERMIAL="serial console"' >>/etc/default/grub -- name: "Run the grub-install tool" - command: chroot /mnt/bootimg grub-install --boot-directory=/boot --modules="biosdisk part_msdos" "{{stored_value_loopback_alpha.stdout}}" -- name: "Unlink /dev/bootimg/dev" - command: umount /mnt/bootimg/dev -- name: "Unlink /dev/bootimg/proc" - command: umount /mnt/bootimg/proc -- name: "Unlink /dev/bootimg/sys" - command: umount /mnt/bootimg/sys -- name: "Unmounting image" - command: umount /mnt/bootimg -- name: "Detaching second loop device" - command: losetup -d "{{stored_value_loopback_beta.stdout}}" -- name: "Removing partition map" - command: kpartx -v -d "{{stored_value_loopback_alpha.stdout}}" -- name: "Detaching first loop device" - command: losetup -d "{{stored_value_loopback_alpha.stdout}}" -- name: "Moving image to .oldimg" - command: mv "{{http_boot_folder}}/{{deploy_image_filename}}" "{{http_boot_folder}}/{{deploy_image_filename}}.oldimg" -- name: "Moving new image into place" - command: mv "{{http_boot_folder}}/{{deploy_image_filename}}.bootimg" "{{http_boot_folder}}/{{deploy_image_filename}}" diff --git a/setup/install.yaml b/setup/install.yaml index 1bb57c304..78578d40f 100644 --- a/setup/install.yaml +++ b/setup/install.yaml @@ -1,263 +1,8 @@ -# Written expecting APT based packaging, however would be trivial to -# extend another packaging system --- - hosts: localhost connection: local - name: "Install services required for ironic" + name: "Install Ironic on the local host." sudo: yes gather_facts: yes - tasks: - - name: "Update Package Cache" - local_action: apt update_cache=yes - - name: "Install packages" - local_action: apt name={{ item }} - with_items: - - mysql-server - - dnsmasq - - rabbitmq-server - - python-dev - - python-pip - - python-mysqldb - - python-configparser - - libffi-dev - - libxslt-dev - - libssl-dev - - libxml2-dev - - ipxe - - tftpd-hpa - - tftp-hpa - - syslinux-common - - syslinux - - xinetd - - parted - - ipmitool - - psmisc - - nginx - - wget - - genisoimage - - qemu-utils - - kpartx - - name: "Install 14.10 packages" - local_action: apt name={{ item }} - with_items: - - pxelinux - when: ansible_distribution_version|version_compare('14.10', '>=') - - name: "Ensuring /opt/stack is present" - local_action: file name=/opt/stack state=directory owner=root group=root - # This won't be necessary in the long run, however until a suitable version - # lands upstream, it is required. - - name: "Retrieving latest known os_ironic.py file" - local_action: get_url url={{ latest_os_ironic_url }} dest=/opt/stack/ansible/lib/ansible/modules/extras/cloud/os_ironic.py - - name: "Retrieving latest known os_ironic_node.py file" - local_action: get_url url={{ latest_os_ironic_node_url }} dest=/opt/stack/ansible/lib/ansible/modules/extras/cloud/os_ironic_node.py - - name: "Downloading Ironic" - local_action: command git clone https://git.openstack.org/openstack/ironic chdir=/opt/stack creates=/opt/stack/ironic - # TODO: Remove eventually once the features land. - - name: "Ironic - checking out master branch" - local_action: command git checkout -f master chdir=/opt/stack/ironic - - name: "Ironic - resetting master branch" - local_action: command git reset --hard master chdir=/opt/stack/ironic - - name: "Ironic - resyncing to current master branch" - local_action: command git pull --ff-only chdir=/opt/stack/ironic/ - # As of 20150302 155728 has merged. Leaving code present but commented out for future - # cases where we need to apply a specific patch at this time. - # - name: "Ironic - Downloading PXE support for IPA" - # local_action: command git fetch https://review.openstack.org/openstack/ironic refs/changes/28/155728/16 chdir=/opt/stack/ironic - #- name: "Ironic - Checking out PXE support for IPA" - # local_action: command git checkout FETCH_HEAD chdir=/opt/stack/ironic - ### End comment out - # TODO: The pip installation of python-ironicclient is disabled in order to - # support rev 158520. - #- name: "Install ironic client" - # local_action: pip name=python-ironicclient state=present - - name: "python-ironicclient - Retrieving library from git.openstack.org" - local_action: command git clone https://review.openstack.org/openstack/python-ironicclient chdir=/opt/stack creates=/opt/stack/python-ironicclient - - name: "python-ironicclient - Checking out master branch" - local_action: command git checkout -f master chdir=/opt/stack/python-ironicclient - - name: "python-ironicclient - Resetting local repository" - local_action: command git reset --hard master chdir=/opt/stack/python-ironicclient - - name: "python-ironicclient - Resyncing local reposiory" - local_action: command git pull --ff-only chdir=/opt/stack/python-ironicclient - - name: "python-ironicclient - Downloading patch for logical names in Ironic" - local_action: command git fetch https://review.openstack.org/openstack/python-ironicclient refs/changes/20/158520/1 chdir=/opt/stack/python-ironicclient - - name: "python-ironicclient - Checking out patch." - local_action: command git checkout FETCH_HEAD chdir=/opt/stack/python-ironicclient - - name: "python-ironicclient - Installing patched python-ironicclient library." - local_action: command pip install -I --force-reinstall /opt/stack/python-ironicclient - - name: "proliantutils - Install from pip" - local_action: pip name=proliantutils state=present - # TODO: The next two packages installed via git and then manyally installed - # as the os_ironic.py library requires revisions that have not yet - # landed for noauth mode. - # TODO: If the portion below remains for any period of time, it should - # be converted to an include... or consider converting to the integrated - # git module. - - name: "Shade - Retrieving library from git.openstack.org" - local_action: command git clone https://review.openstack.org/openstack-infra/shade chdir=/opt/stack creates=/opt/stack/shade - - name: "Shade - Checking out master branch" - local_action: command git checkout -f master chdir=/opt/stack/shade - - name: "Shade - Resetting local repository" - local_action: command git reset --hard master chdir=/opt/stack/shade - - name: "Shade - Resyncing local reposiory" - local_action: command git pull --ff-only chdir=/opt/stack/shade - - name: "Shade - Downloading patch to support noauth mode." - local_action: command git fetch https://review.openstack.org/openstack-infra/shade refs/changes/94/160894/4 chdir=/opt/stack/shade - - name: "Shade - Checking out patch to support noauth mode." - local_action: command git checkout FETCH_HEAD chdir=/opt/stack/shade - - name: "Shade - Installing patched shade library." - local_action: command pip install -I --force-reinstall /opt/stack/shade - # TODO Remove the commented out section below if no longer needed. - # Fix merged into os-client-config. Commenting out for now as dependency should be satisified via the installation of shade. - #- name: "os-client-config - Retrieving from git.openstack.org" - # local_action: command git clone https://review.openstack.org/stackforge/os-client-config chdir=/opt/stack creates=/opt/stack/os-client-config - #- name: "os-client-config - checking out master branch" - # local_action: command git checkout -f master chdir=/opt/stack/os-client-config - #- name: "os-client-config - Resetting local repository" - # local_action: command git reset --hard master chdir=/opt/stack/os-client-config - #- name: "os-client-config - Resyncing local reposiory" - # local_action: command git pull --ff-only chdir=/opt/stack/os-client-config - #- name: "os-client-config - Downloading patch to support noauth mode." - # local_action: command git fetch https://review.openstack.org/stackforge/os-client-config refs/changes/63/159563/2 chdir=/opt/stack/os-client-config - #- name: "os-client-config - Checking out os-client-config patch to support noauth mode." - # local_action: command git checkout FETCH_HEAD chdir=/opt/stack/os-client-config - #- name: "os-client-config - Installing patched os-client-config." - # local_action: command pip install -I --no-deps --force-reinstall /opt/stack/os-client-config - #END TODO note from above - - name: "Starting MySQL" - local_action: service name=mysql state=started - - name: "Starting rabbitmq-server" - local_action: service name=rabbitmq-server state=started - - name: "RabbitMQ - Testing if hostname is defined firsts in /etc/hosts" - local_action: command grep -i "127.0.0.1*.{{ ansible_hostname }}\ localhost" /etc/hosts - ignore_errors: yes - register: test_grep_fix_hostname - - name: "RabbitMQ - Fixing /etc/hosts" - local_action: command sed -i 's/localhost/{{ ansible_hostname }} localhost/' /etc/hosts - when: test_grep_fix_hostname.rc != 0 - - name: "Ensuring guest user is removed from rabbitmq" - local_action: rabbitmq_user user=guest state=absent force=yes - - name: "Creating Ironic user in RabbitMQ" - local_action: rabbitmq_user user=ironic password={{ ironic_db_password }} force=yes state=present configure_priv=.* write_priv=.* read_priv=.* - no_log: true - - name: "MySQL - Creating DB" - local_action: mysql_db login_user=root login_password={{ mysql_password }} name=ironic state=present encoding=utf8 - register: test_created_db - no_log: True - - name: "MySQL - Creating user for Ironic" - local_action: mysql_user login_user=root login_password={{ mysql_password }} name=ironic password={{ ironic_db_password }} priv=ironic.*:ALL state=present - no_log: True - - name: "Install Ironic using pip" - local_action: pip name=/opt/stack/ironic state=latest - - name: "Ensure /etc/ironic exists" - local_action: file name=/etc/ironic state=directory - - name: "Place Ironic Config file" - local_action: template src=templates/ironic.conf.j2 dest=/etc/ironic/ironic.conf - - name: "Place Ironic IPA Agent PXE configuration file" - local_action: template src=templates/agent_config.template.j2 dest=/etc/ironic/agent_config.template - - name: "Copy policy.json to /etc/ironic" - local_action: copy src=/opt/stack/ironic/etc/ironic/policy.json dest=/etc/ironic/ - - name: "Creating Ironic DB Schema" - local_action: command ironic-dbsync --config-file /etc/ironic/ironic.conf create_schema - when: test_created_db.changed == true - - name: "Upgrading Ironic DB Schema" - local_action: command ironic-dbsync --config-file /etc/ironic/ironic.conf upgrade - when: test_created_db.changed == false - - name: "Creating an ironic service group" - local_action: group name=ironic - - name: "Creating an ironic service user" - local_action: user name=ironic group=ironic - - name: "Placing services" - local_action: template src=templates/init_template.j2 dest=/etc/init/{{item.service_name}}.conf owner=root group=root - with_items: - - { service_name: 'ironic-api', username: 'ironic', args: '--config-file /etc/ironic/ironic.conf'} - - { service_name: 'ironic-conductor', username: 'ironic', args: '--config-file /etc/ironic/ironic.conf'} - - name: "Start ironic-conductor" - local_action: service name=ironic-conductor state=started - - name: "Start ironic-api" - local_action: service name=ironic-api state=started - - name: "Start ironic-conductor" - local_action: service name=ironic-conductor state=restarted - - name: "Start ironic-api" - local_action: service name=ironic-api state=reloaded - - name: "Setting up PXE and iPXE folders" - local_action: file name={{item}} owner=ironic group=ironic state=directory - with_items: - - /tftpboot - - /tftpboot/pxelinux.cfg - - "{{ http_boot_folder }}" - - name: "Placing tftpd map-file" - local_action: copy src=files/tftpboot-map-file dest=/tftpboot/map-file owner=ironic group=ironic - # TODO: This should not be shell, fix. - - name: "Disable tftpd-hpa by setting it to manual start" - local_action: shell echo "manual" > /etc/init/tftpd-hpa.override - - name: "Disable service tftpd-hpa" - local_action: service name=tftpd-hpa state=stopped enabled=no - - name: "Placing pxelinux.0 (pre-14.10)" - local_action: copy src=/usr/lib/syslinux/pxelinux.0 dest=/tftpboot - when: ansible_distribution_version|version_compare('14.10', '<') - - name: "Placing pxelinux.0 (>=14.10)" - local_action: copy src=/usr/lib/PXELINUX/pxelinux.0 dest=/tftpboot - when: ansible_distribution_version|version_compare('14.10', '>=') - - name: "Place boot.ipxe helper script to HTTP root" - local_action: copy src=files/boot.ipxe dest=/httpboot/boot.ipxe - - name: "Place tftp config file" - local_action: copy src=files/xinetd.tftp dest=/etc/xinetd.d/tftp - - name: "Copy iPXE image into place" - local_action: copy src=/usr/lib/ipxe/undionly.kpxe dest=/tftpboot/ - - name: "Deploy dnsmasq configuration file" - local_action: template src=templates/dnsmasq.conf.j2 dest=/etc/dnsmasq.conf - - name: "Deploying nginx configuraiton file for serving HTTP requests" - local_action: template src=templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf - - name: "Ensuring dnsmasq is running" - local_action: service name={{ item }} state=started - with_items: - - xinetd - - dnsmasq - - nginx - - name: "Sending services a reload signal" - local_action: service name={{ item }} state=reloaded - with_items: - - xinetd - - nginx - - name: "Sending services a force-reload signal" - local_action: command /etc/init.d/dnsmasq force-reload -- hosts: localhost - connection: local - name: "Retrieve Images" - sudo: yes - gather_facts: yes - tasks: - # Similar logic to below can be utilized to retrieve files - - name: "Determine if folder exists, else create and populate folder." - local_action: stat path=/tftpboot/master_images - register: test_master_images - - name: "Create master_images folder" - local_action: file name=/tftpboot/master_images state=directory owner=ironic group=ironic - when: test_master_images.stat.exists == false - # This is overly complex, however get_url will always re-retrieve the file - # if it already exists, and this is to prevent that behavior. - - name: "Test if CoreOS kernel is present" - local_action: stat path={{ http_boot_folder }}/coreos_production_pxe.vmlinuz - register: test_core_os_kernel_present - - name: "Download CoreOS kernel" - local_action: get_url url=http://tarballs.openstack.org/ironic-python-agent/coreos/files/coreos_production_pxe.vmlinuz dest={{ http_boot_folder }}/coreos_production_pxe.vmlinuz - when: test_core_os_kernel_present.stat.exists == false - - name: "Test if CoreOS image is present" - local_action: stat path={{ http_boot_folder }}/coreos_production_pxe_image-oem.cpio.gz - register: test_core_os_image_present - - name: "Download CoreOS image" - local_action: get_url url=http://tarballs.openstack.org/ironic-python-agent/coreos/files/coreos_production_pxe_image-oem.cpio.gz dest={{ http_boot_folder }}/coreos_production_pxe_image-oem.cpio.gz - when: test_core_os_image_present.stat.exists == false - - name: "Test if Ubuntu 14.04 server cloud amd64 is present" - local_action: stat path={{ deploy_image }} - register: test_os_image_present - # TODO(Julia) This needs to be entirely variablized and made a toggable setting, or auto-discovered? - # Anything better! - - name: "Download Ubuntu image" - local_action: get_url url=http://cloud-images.ubuntu.com/releases/trusty/release/ubuntu-14.04-server-cloudimg-amd64.tar.gz dest=/httpboot/ubuntu-14.04-server-cloudimg-amd64.tar.gz - when: test_os_image_present.stat.exists == false - - name: "Extract Ubuntu image" - local_action: command tar -xvzf ubuntu-14.04-server-cloudimg-amd64.tar.gz chdir=/httpboot creates=/httpboot/trusty-server-cloudimg-amd64.img - when: test_os_image_present.stat.exists == false - - include: create_bootable_image.yaml - when: test_os_image_present.stat.exists == false and transform_boot_image == true + roles: + - install_standalone_ironic_localhost diff --git a/setup/files/boot.ipxe b/setup/roles/install_standalone_ironic_localhost/files/boot.ipxe similarity index 100% rename from setup/files/boot.ipxe rename to setup/roles/install_standalone_ironic_localhost/files/boot.ipxe diff --git a/setup/files/tftpboot-map-file b/setup/roles/install_standalone_ironic_localhost/files/tftpboot-map-file similarity index 100% rename from setup/files/tftpboot-map-file rename to setup/roles/install_standalone_ironic_localhost/files/tftpboot-map-file diff --git a/setup/files/xinetd.tftp b/setup/roles/install_standalone_ironic_localhost/files/xinetd.tftp similarity index 100% rename from setup/files/xinetd.tftp rename to setup/roles/install_standalone_ironic_localhost/files/xinetd.tftp diff --git a/setup/roles/install_standalone_ironic_localhost/tasks/create_bootable_image.yaml b/setup/roles/install_standalone_ironic_localhost/tasks/create_bootable_image.yaml new file mode 100644 index 000000000..480e32c36 --- /dev/null +++ b/setup/roles/install_standalone_ironic_localhost/tasks/create_bootable_image.yaml @@ -0,0 +1,62 @@ +--- +- name: "Extracting the raw disk image" + local_action: command qemu-img convert -O raw "{{http_boot_folder}}/{{deploy_image_filename}}" "{{http_boot_folder}}/{{deploy_image_filename}}.raw" +- name: "Copying Image however with 32k of empty space at the beginning of the file." + local_action: command dd if="{{http_boot_folder}}/{{deploy_image_filename}}.raw" of="{{http_boot_folder}}/{{deploy_image_filename}}.bootimg" seek=64 +- name: "Creating Partition Table lining up with the copied file's contents." + local_action: shell echo '32;' | sfdisk "{{http_boot_folder}}/{{deploy_image_filename}}.bootimg" -uB -f +- name: "Allocating one of two loopbacks" + local_action: command losetup -f + register: stored_value_loopback_alpha +- name: "Creating loopback connetion to new image file" + local_action: command losetup "{{stored_value_loopback_alpha.stdout}}" "{{http_boot_folder}}/{{deploy_image_filename}}.bootimg" +- name: "Forcing partition table to be re-read" + local_action: command kpartx -v -a "{{stored_value_loopback_alpha.stdout}}" + # Using second loopback as for some reason /dev/mapper does not translate into a chroot cleanly when devfs is mounted +- name: "Allocating second loopback pointing to the initial partition" + local_action: command losetup -f + register: stored_value_loopback_beta +- name: "Binding second loopback to the first partition" + local_action: shell losetup "{{stored_value_loopback_beta.stdout}}" /dev/mapper/$(echo "{{stored_value_loopback_alpha.stdout}}"|cut -f3 -d '/')p1 + # TODO parameterize folder name/location +- name: "Ensuring we have a location to mount the disk to" + local_action: file path=/mnt/bootimg state=directory +- name: "Mounting volume on /mnt/bootimg" + local_action: command mount "{{stored_value_loopback_beta.stdout}}" /mnt/bootimg +- name: "Binding /sys into /mnt/bootimg/sys" + local_action: command mount -t sysfs sysfs /mnt/bootimg/sys +- name: "Binding /proc into /mnt/bootimg/proc" + local_action: command mount -t proc proc /mnt/bootimg/proc +- name: "Binding /dev into /mnt/bootimg/dev" + local_action: command mount --bind /dev /mnt/bootimg/dev + # Attempt to identify kernel +#- name: "Identify kernel" +# local_action: shell ls vmlinuz* |cut -f 1 -d ' ' chdir=/mnt/bootimg/boot/ +# register: kernel_filename +#- name: "Identify initrd" +# local_action: shell ls initrd* |cut -f 1 -d ' ' chdir=/mnt/bootimg/boot/ +# register: initrd_filename +- name: "Disable Grub Prober" + local_action: shell echo "GRUB_DISABLE_OS_PROBER=true" >>/etc/default/grub +- name: "Disable Grub Prober" + local_action: shell echo 'GRUB_TERMIAL="serial console"' >>/etc/default/grub +- name: "Run the grub-install tool" + local_action: command chroot /mnt/bootimg grub-install --boot-directory=/boot --modules="biosdisk part_msdos" "{{stored_value_loopback_alpha.stdout}}" +- name: "Unlink /dev/bootimg/dev" + local_action: command umount /mnt/bootimg/dev +- name: "Unlink /dev/bootimg/proc" + local_action: command umount /mnt/bootimg/proc +- name: "Unlink /dev/bootimg/sys" + local_action: command umount /mnt/bootimg/sys +- name: "Unmounting image" + local_action: command umount /mnt/bootimg +- name: "Detaching second loop device" + local_action: command losetup -d "{{stored_value_loopback_beta.stdout}}" +- name: "Removing partition map" + local_action: command kpartx -v -d "{{stored_value_loopback_alpha.stdout}}" +- name: "Detaching first loop device" + local_action: command losetup -d "{{stored_value_loopback_alpha.stdout}}" +- name: "Moving image to .oldimg" + local_action: command mv "{{http_boot_folder}}/{{deploy_image_filename}}" "{{http_boot_folder}}/{{deploy_image_filename}}.oldimg" +- name: "Moving new image into place" + local_action: command mv "{{http_boot_folder}}/{{deploy_image_filename}}.bootimg" "{{http_boot_folder}}/{{deploy_image_filename}}" diff --git a/setup/roles/install_standalone_ironic_localhost/tasks/main.yml b/setup/roles/install_standalone_ironic_localhost/tasks/main.yml new file mode 100644 index 000000000..74cd57514 --- /dev/null +++ b/setup/roles/install_standalone_ironic_localhost/tasks/main.yml @@ -0,0 +1,209 @@ +# Written expecting APT based packaging, however would be trivial to +# extend another packaging system +--- + - name: "Update Package Cache" + local_action: apt update_cache=yes + - name: "Install packages" + local_action: apt name={{ item }} + with_items: required_packages_ubuntu + # Step required for Ubuntu 14.10 + - name: "Install 14.10 packages" + local_action: apt name={{ item }} + with_items: + - pxelinux + when: ansible_distribution_version|version_compare('14.10', '>=') + - name: "Ensuring /opt/stack is present" + local_action: file name=/opt/stack state=directory owner=root group=root + # This won't be necessary in the long run, however until a suitable version + # lands upstream, it is required. + - name: "Retrieving latest known os_ironic.py file" + local_action: get_url url={{ latest_os_ironic_url }} dest=/opt/stack/ansible/lib/ansible/modules/extras/cloud/os_ironic.py + - name: "Retrieving latest known os_ironic_node.py file" + local_action: get_url url={{ latest_os_ironic_node_url }} dest=/opt/stack/ansible/lib/ansible/modules/extras/cloud/os_ironic_node.py + - name: "Downloading Ironic" + local_action: command git clone https://git.openstack.org/openstack/ironic chdir=/opt/stack creates=/opt/stack/ironic + # TODO: Remove eventually once the features land. + - name: "Ironic - checking out master branch" + local_action: command git checkout -f master chdir=/opt/stack/ironic + - name: "Ironic - resetting master branch" + local_action: command git reset --hard master chdir=/opt/stack/ironic + - name: "Ironic - resyncing to current master branch" + local_action: command git pull --ff-only chdir=/opt/stack/ironic/ + # As of 20150302 155728 has merged. Leaving code present but commented out for future + # cases where we need to apply a specific patch at this time. + # - name: "Ironic - Downloading PXE support for IPA" + # local_action: command git fetch https://review.openstack.org/openstack/ironic refs/changes/28/155728/16 chdir=/opt/stack/ironic + #- name: "Ironic - Checking out PXE support for IPA" + # local_action: command git checkout FETCH_HEAD chdir=/opt/stack/ironic + ### End comment out + # TODO: The pip installation of python-ironicclient is disabled in order to + # support rev 158520. + #- name: "Install ironic client" + # local_action: pip name=python-ironicclient state=present + - name: "python-ironicclient - Retrieving library from git.openstack.org" + local_action: command git clone https://review.openstack.org/openstack/python-ironicclient chdir=/opt/stack creates=/opt/stack/python-ironicclient + - name: "python-ironicclient - Checking out master branch" + local_action: command git checkout -f master chdir=/opt/stack/python-ironicclient + - name: "python-ironicclient - Resetting local repository" + local_action: command git reset --hard master chdir=/opt/stack/python-ironicclient + - name: "python-ironicclient - Resyncing local reposiory" + local_action: command git pull --ff-only chdir=/opt/stack/python-ironicclient + # This patch is https://review.openstack.org/#/c/158520/ which adds support + # for use of node names instead of UUIDs. We don't presently utilize this + # but it can be supported at some point. + - name: "python-ironicclient - Downloading patch for logical names in Ironic" + local_action: command git fetch https://review.openstack.org/openstack/python-ironicclient refs/changes/20/158520/1 chdir=/opt/stack/python-ironicclient + - name: "python-ironicclient - Checking out patch." + local_action: command git checkout FETCH_HEAD chdir=/opt/stack/python-ironicclient + - name: "python-ironicclient - Installing patched python-ironicclient library." + local_action: command pip install -I --force-reinstall /opt/stack/python-ironicclient + - name: "proliantutils - Install from pip" + local_action: pip name=proliantutils state=present + # TODO: The next package is installed via git and then manyally installed + # as the os_ironic and os_ironic_node are under active development and + # may require features that have not yet been released in shade. + # TODO: If the portion below remains for any period of time, it should + # be converted to an include... or consider converting to the integrated + # git module. + - name: "Shade - Retrieving library from git.openstack.org" + local_action: command git clone https://review.openstack.org/openstack-infra/shade chdir=/opt/stack creates=/opt/stack/shade + - name: "Shade - Checking out master branch" + local_action: command git checkout -f master chdir=/opt/stack/shade + - name: "Shade - Resetting local repository" + local_action: command git reset --hard master chdir=/opt/stack/shade + - name: "Shade - Resyncing local reposiory" + local_action: command git pull --ff-only chdir=/opt/stack/shade + - name: "Shade - Installing patched shade library." + local_action: command pip install -I --force-reinstall /opt/stack/shade + - name: "Starting MySQL" + local_action: service name=mysql state=started + - name: "Starting rabbitmq-server" + local_action: service name=rabbitmq-server state=started + - name: "RabbitMQ - Testing if hostname is defined firsts in /etc/hosts" + local_action: command grep -i "127.0.0.1*.{{ ansible_hostname }}\ localhost" /etc/hosts + ignore_errors: yes + register: test_grep_fix_hostname + - name: "RabbitMQ - Fixing /etc/hosts" + local_action: command sed -i 's/localhost/{{ ansible_hostname }} localhost/' /etc/hosts + when: test_grep_fix_hostname.rc != 0 + - name: "Ensuring guest user is removed from rabbitmq" + local_action: rabbitmq_user user=guest state=absent force=yes + - name: "Creating Ironic user in RabbitMQ" + local_action: rabbitmq_user user=ironic password={{ ironic_db_password }} force=yes state=present configure_priv=.* write_priv=.* read_priv=.* + no_log: true + - name: "MySQL - Creating DB" + local_action: mysql_db login_user=root login_password={{ mysql_password }} name=ironic state=present encoding=utf8 + register: test_created_db + no_log: True + - name: "MySQL - Creating user for Ironic" + local_action: mysql_user login_user=root login_password={{ mysql_password }} name=ironic password={{ ironic_db_password }} priv=ironic.*:ALL state=present + no_log: True + - name: "Install Ironic using pip" + local_action: pip name=/opt/stack/ironic state=latest + - name: "Ensure /etc/ironic exists" + local_action: file name=/etc/ironic state=directory + - name: "Place Ironic Config file" + local_action: template src=templates/ironic.conf.j2 dest=/etc/ironic/ironic.conf + - name: "Place Ironic IPA Agent PXE configuration file" + local_action: template src=templates/agent_config.template.j2 dest=/etc/ironic/agent_config.template + - name: "Copy policy.json to /etc/ironic" + local_action: copy src=/opt/stack/ironic/etc/ironic/policy.json dest=/etc/ironic/ + - name: "Creating Ironic DB Schema" + local_action: command ironic-dbsync --config-file /etc/ironic/ironic.conf create_schema + when: test_created_db.changed == true + - name: "Upgrading Ironic DB Schema" + local_action: command ironic-dbsync --config-file /etc/ironic/ironic.conf upgrade + when: test_created_db.changed == false + - name: "Creating an ironic service group" + local_action: group name=ironic + - name: "Creating an ironic service user" + local_action: user name=ironic group=ironic + - name: "Placing services" + local_action: template src=templates/init_template.j2 dest=/etc/init/{{item.service_name}}.conf owner=root group=root + with_items: + - { service_name: 'ironic-api', username: 'ironic', args: '--config-file /etc/ironic/ironic.conf'} + - { service_name: 'ironic-conductor', username: 'ironic', args: '--config-file /etc/ironic/ironic.conf'} + - name: "Start ironic-conductor" + local_action: service name=ironic-conductor state=started + - name: "Start ironic-api" + local_action: service name=ironic-api state=started + - name: "Start ironic-conductor" + local_action: service name=ironic-conductor state=restarted + - name: "Start ironic-api" + local_action: service name=ironic-api state=reloaded + - name: "Setting up PXE and iPXE folders" + local_action: file name={{item}} owner=ironic group=ironic state=directory + with_items: + - /tftpboot + - /tftpboot/pxelinux.cfg + - "{{ http_boot_folder }}" + - name: "Placing tftpd map-file" + local_action: copy src=files/tftpboot-map-file dest=/tftpboot/map-file owner=ironic group=ironic + # TODO: This should not be shell, fix. + - name: "Disable tftpd-hpa by setting it to manual start" + local_action: shell echo "manual" > /etc/init/tftpd-hpa.override + - name: "Disable service tftpd-hpa" + local_action: service name=tftpd-hpa state=stopped enabled=no + - name: "Placing pxelinux.0 (pre-14.10)" + local_action: copy src=/usr/lib/syslinux/pxelinux.0 dest=/tftpboot + when: ansible_distribution_version|version_compare('14.10', '<') + - name: "Placing pxelinux.0 (>=14.10)" + local_action: copy src=/usr/lib/PXELINUX/pxelinux.0 dest=/tftpboot + when: ansible_distribution_version|version_compare('14.10', '>=') + - name: "Place boot.ipxe helper script to HTTP root" + local_action: copy src=files/boot.ipxe dest=/httpboot/boot.ipxe + - name: "Place tftp config file" + local_action: copy src=files/xinetd.tftp dest=/etc/xinetd.d/tftp + - name: "Copy iPXE image into place" + local_action: copy src=/usr/lib/ipxe/undionly.kpxe dest=/tftpboot/ + - name: "Deploy dnsmasq configuration file" + local_action: template src=templates/dnsmasq.conf.j2 dest=/etc/dnsmasq.conf + - name: "Deploying nginx configuraiton file for serving HTTP requests" + local_action: template src=templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf + - name: "Ensuring dnsmasq is running" + local_action: service name={{ item }} state=started + with_items: + - xinetd + - dnsmasq + - nginx + - name: "Sending services a reload signal" + local_action: service name={{ item }} state=reloaded + with_items: + - xinetd + - nginx + - name: "Sending services a force-reload signal" + local_action: command /etc/init.d/dnsmasq force-reload + # Similar logic to below can be utilized to retrieve files + - name: "Determine if folder exists, else create and populate folder." + local_action: stat path=/tftpboot/master_images + register: test_master_images + - name: "Create master_images folder" + local_action: file name=/tftpboot/master_images state=directory owner=ironic group=ironic + when: test_master_images.stat.exists == false + # This is overly complex, however get_url will always re-retrieve the file + # if it already exists, and this is to prevent that behavior. + - name: "Test if CoreOS kernel is present" + local_action: stat path={{ http_boot_folder }}/coreos_production_pxe.vmlinuz + register: test_core_os_kernel_present + - name: "Download CoreOS kernel" + local_action: get_url url=http://tarballs.openstack.org/ironic-python-agent/coreos/files/coreos_production_pxe.vmlinuz dest={{ http_boot_folder }}/coreos_production_pxe.vmlinuz + when: test_core_os_kernel_present.stat.exists == false + - name: "Test if CoreOS image is present" + local_action: stat path={{ http_boot_folder }}/coreos_production_pxe_image-oem.cpio.gz + register: test_core_os_image_present + - name: "Download CoreOS image" + local_action: get_url url=http://tarballs.openstack.org/ironic-python-agent/coreos/files/coreos_production_pxe_image-oem.cpio.gz dest={{ http_boot_folder }}/coreos_production_pxe_image-oem.cpio.gz + when: test_core_os_image_present.stat.exists == false + - name: "Test if Ubuntu 14.04 server cloud amd64 is present" + local_action: stat path={{ deploy_image }} + register: test_os_image_present + # TODO(Julia) This needs to be entirely variablized and made a toggable setting, or auto-discovered? + # Anything better! + - name: "Download Ubuntu image" + local_action: get_url url=http://cloud-images.ubuntu.com/releases/trusty/release/ubuntu-14.04-server-cloudimg-amd64.tar.gz dest=/httpboot/ubuntu-14.04-server-cloudimg-amd64.tar.gz + when: test_os_image_present.stat.exists == false + - name: "Extract Ubuntu image" + local_action: command tar -xvzf ubuntu-14.04-server-cloudimg-amd64.tar.gz chdir=/httpboot creates=/httpboot/trusty-server-cloudimg-amd64.img + when: test_os_image_present.stat.exists == false + - include: create_bootable_image.yaml + when: test_os_image_present.stat.exists == false and transform_boot_image == true diff --git a/setup/templates/agent_config.template.j2 b/setup/roles/install_standalone_ironic_localhost/templates/agent_config.template.j2 similarity index 100% rename from setup/templates/agent_config.template.j2 rename to setup/roles/install_standalone_ironic_localhost/templates/agent_config.template.j2 diff --git a/setup/templates/dnsmasq.conf.j2 b/setup/roles/install_standalone_ironic_localhost/templates/dnsmasq.conf.j2 similarity index 100% rename from setup/templates/dnsmasq.conf.j2 rename to setup/roles/install_standalone_ironic_localhost/templates/dnsmasq.conf.j2 diff --git a/setup/templates/init_template.j2 b/setup/roles/install_standalone_ironic_localhost/templates/init_template.j2 similarity index 100% rename from setup/templates/init_template.j2 rename to setup/roles/install_standalone_ironic_localhost/templates/init_template.j2 diff --git a/setup/templates/ironic.conf.j2 b/setup/roles/install_standalone_ironic_localhost/templates/ironic.conf.j2 similarity index 100% rename from setup/templates/ironic.conf.j2 rename to setup/roles/install_standalone_ironic_localhost/templates/ironic.conf.j2 diff --git a/setup/templates/nginx.conf.j2 b/setup/roles/install_standalone_ironic_localhost/templates/nginx.conf.j2 similarity index 100% rename from setup/templates/nginx.conf.j2 rename to setup/roles/install_standalone_ironic_localhost/templates/nginx.conf.j2 diff --git a/setup/roles/install_standalone_ironic_localhost/vars/main.yml b/setup/roles/install_standalone_ironic_localhost/vars/main.yml new file mode 100644 index 000000000..3692fcfd9 --- /dev/null +++ b/setup/roles/install_standalone_ironic_localhost/vars/main.yml @@ -0,0 +1,32 @@ +--- +required_packages_ubuntu: + - mysql-server + - dnsmasq + - rabbitmq-server + - python-dev + - python-pip + - python-mysqldb + - python-configparser + - libffi-dev + - libxslt-dev + - libssl-dev + - libxml2-dev + - ipxe + - tftpd-hpa + - tftp-hpa + - syslinux-common + - syslinux + - xinetd + - parted + - ipmitool + - psmisc + - nginx + - wget + - genisoimage + - qemu-utils + - kpartx +http_boot_folder: /httpboot +transform_boot_image: false +ironic_url: "http://localhost:6385/" +network_interface: "eth0" +ssh_public_key_path: ~/.ssh/id_rsa.pub