diff --git a/tasks/persistent_cloud.yml b/tasks/persistent_cloud.yml new file mode 100644 index 0000000000..103bb1d82f --- /dev/null +++ b/tasks/persistent_cloud.yml @@ -0,0 +1,109 @@ +# New tasks to spin up instance in https://fedorainfracloud.org + +- include_vars: dir=/srv/web/infra/ansible/vars/all/ ignore_files=README + +- name: check it out + local_action: shell nc -w 5 {{ inventory_hostname }} 22 < /dev/null + register: host_is_up + ignore_errors: true + changed_when: false + check_mode: no + +- name: spin UP VM using nova_compute + become: False + local_action: + module: nova_compute + auth_url: "{{os_auth_url}}" + login_username: "admin" + login_password: "{{ADMIN_PASS}}" + login_tenant_name: "{{inventory_tenant}}" + name: "{{inventory_instance_name}}" + image_id: "{{ image|image_name_to_id('admin', ADMIN_PASS, inventory_tenant, os_auth_url) }}" + wait_for: 600 + flavor_id: "{{ instance_type|flavor_name_to_id('admin', ADMIN_PASS, inventory_tenant, os_auth_url) }}" + security_groups: "{{security_group}}" + key_name: "{{ keypair }}" + nics: "{{ cloud_networks }}" + user_data: "#cloud-config\ndisable_root: 0" + floating_ips: + - "{{public_ip}}" + register: nova_result + when: host_is_up is failed + +# instance can be both id and name, volume must be id +# volume must be id +# +# Check that the volume is available +# +- local_action: shell nova --os-auth-url="{{os_auth_url}}" --os-username="admin" --os-password="{{ADMIN_PASS}}" --os-tenant-name={{inventory_tenant}} volume-list | grep ' {{item.volume_id}} ' | grep 'available' + with_items: "{{ volumes|default([]) }}" + register: volume_available + failed_when: volume_available.rc == 2 + changed_when: volume_available.rc == 0 + ignore_errors: True + when: volumes is defined + check_mode: no + +# +# If it is attach it. +# +- local_action: shell nova --os-auth-url="{{os_auth_url}}" --os-username="admin" --os-password="{{ADMIN_PASS}}" --os-tenant-name={{inventory_tenant}} volume-attach "{{inventory_instance_name}}" "{{item.volume_id}}" "{{item.device}}" + with_items: "{{ volume_available.results|default([]) }}" + ignore_errors: True + failed_when: False + when: volumes is defined and volume_available is defined and item.changed + +- name: wait for he host to be hot + local_action: wait_for host={{ public_ip }} port=22 delay=1 timeout=600 + when: host_is_up is failed + +# SSH is up and running, however cloud-init still did not deployed ssh keypair +# we have to wait some time. 10 sec is usually enough, but not always. + +- name: waiting for cloud-init + pause: seconds=30 + when: host_is_up is failed + +- name: gather ssh host key from new instance + local_action: command ssh-keyscan -t rsa {{ inventory_hostname }} + ignore_errors: True + register: hostkey + when: host_is_up is failed + +- name: add new ssh host key (until we can sign it) + local_action: known_hosts path={{item}} key="{{ hostkey.stdout }}" host={{ inventory_hostname }} state=present + ignore_errors: True + with_items: + - /root/.ssh/known_hosts + when: host_is_up is failed + +# +# Next we try and gather facts. If the host doesn't have python2 this will fail. +# + +- name: gather facts + setup: + check_mode: no + ignore_errors: True + register: facts + +# +# If that failed, then we use the raw module to install things +# + +- name: install python2 and dnf stuff + raw: dnf -y install python-dnf libselinux-python + when: facts is failed + +# TODO - somehow guess when keypair is finally deployed and return little bit earlier +## We need to specify user, here we trying with fedora or root +#- name: wait until ssh is available +# # local_action: shell false; until [ "$?" -eq "0" ]; do sleep 2; ssh -o PasswordAuthentication=no fedora@{{ public_ip }} 'echo foobar' || ssh -o PasswordAuthentication=no root@{{ public_ip }} 'echo foobar'; done +# # local_action: shell false; until [ "$?" -eq "0" ]; do sleep 2; ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o PasswordAuthentication=no fedora@{{ public_ip }} 'echo foobar'; done +# local_action: shell whoami && ssh -vvvv -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o PasswordAuthentication=no fedora@{{ public_ip }} 'echo foobar' +# # async: 20 +# # poll: 5 +# ignore_errors: True +# +- name: Include SSH config + import_role: name=basessh