From a0d2dd9d29e8622e739870baf172f2b8a7e9c6a0 Mon Sep 17 00:00:00 2001 From: Bogdan Dobrelya Date: Mon, 17 Jul 2017 14:05:42 +0200 Subject: Add a role to generate a static inventory (#540) * Add the static-inventory role that configures the inventory/hosts file by the given path, or creates it for you. Signed-off-by: Bogdan Dobrelya --- roles/static_inventory/defaults/main.yml | 8 +++ roles/static_inventory/tasks/checkpoint.yml | 17 ++++++ roles/static_inventory/tasks/main.yml | 6 +++ roles/static_inventory/tasks/openstack.yml | 47 +++++++++++++++++ roles/static_inventory/templates/inventory.j2 | 76 +++++++++++++++++++++++++++ 5 files changed, 154 insertions(+) create mode 100644 roles/static_inventory/defaults/main.yml create mode 100644 roles/static_inventory/tasks/checkpoint.yml create mode 100644 roles/static_inventory/tasks/main.yml create mode 100644 roles/static_inventory/tasks/openstack.yml create mode 100644 roles/static_inventory/templates/inventory.j2 (limited to 'roles') diff --git a/roles/static_inventory/defaults/main.yml b/roles/static_inventory/defaults/main.yml new file mode 100644 index 000000000..315965cde --- /dev/null +++ b/roles/static_inventory/defaults/main.yml @@ -0,0 +1,8 @@ +--- +# Either to checkpoint the dynamic inventory into a static one +refresh_inventory: True +inventory: static +inventory_path: ~/openstack-inventory + +# SSH key to access nodes +private_ssh_key: ~/.ssh/openshift diff --git a/roles/static_inventory/tasks/checkpoint.yml b/roles/static_inventory/tasks/checkpoint.yml new file mode 100644 index 000000000..c0365bd3d --- /dev/null +++ b/roles/static_inventory/tasks/checkpoint.yml @@ -0,0 +1,17 @@ +--- +- name: check for static inventory dir + stat: + path: "{{ inventory_path }}" + register: stat_inventory_path + +- name: create static inventory dir + file: + path: "{{ inventory_path }}" + state: directory + mode: 0750 + when: not stat_inventory_path.stat.exists + +- name: create inventory from template + template: + src: inventory.j2 + dest: "{{ inventory_path }}/hosts" diff --git a/roles/static_inventory/tasks/main.yml b/roles/static_inventory/tasks/main.yml new file mode 100644 index 000000000..15c81690e --- /dev/null +++ b/roles/static_inventory/tasks/main.yml @@ -0,0 +1,6 @@ +--- +- name: Generate in-memory inventory + include: openstack.yml + +- name: Checkpoint in-memory data into a static inventory + include: checkpoint.yml diff --git a/roles/static_inventory/tasks/openstack.yml b/roles/static_inventory/tasks/openstack.yml new file mode 100644 index 000000000..a25502835 --- /dev/null +++ b/roles/static_inventory/tasks/openstack.yml @@ -0,0 +1,47 @@ +--- +- no_log: true + block: + - name: fetch all nodes from openstack shade dynamic inventory + command: shade-inventory --list + register: registered_nodes_output + when: refresh_inventory|bool + + - name: set fact for openstack inventory cluster nodes + set_fact: + registered_nodes: "{{ (registered_nodes_output.stdout | from_json) | json_query(q) }}" + vars: + q: "[] | [?metadata.clusterid=='{{stack_name}}']" + when: + - refresh_inventory|bool + + - name: set_fact for openstack inventory nodes + set_fact: + registered_nodes_floating: "{{ (registered_nodes_output.stdout | from_json) | json_query(q2) }}" + vars: + q: "[] | [?metadata.group=='infra.{{stack_name}}']" + q2: "[] | [?metadata.clusterid=='{{stack_name}}'] | [?public_v4!='']" + when: + - refresh_inventory|bool + + - name: Add cluster nodes w/o floating IPs to inventory + with_items: "{{ registered_nodes }}" + when: not item in registered_nodes_floating + add_host: + name: '{{ item.name }}' + groups: '{{ item.metadata.group }}' + ansible_host: '{{ item.private_v4 }}' + ansible_fqdn: '{{ item.name }}' + ansible_private_key_file: '{{ private_ssh_key }}' + private_v4: '{{ item.private_v4 }}' + + - name: Add cluster nodes with floating IPs to inventory + with_items: "{{ registered_nodes_floating }}" + when: item in registered_nodes_floating + add_host: + name: '{{ item.name }}' + groups: '{{ item.metadata.group }}' + ansible_host: '{{ item.public_v4 }}' + ansible_fqdn: '{{ item.name }}' + ansible_private_key_file: '{{ private_ssh_key }}' + private_v4: '{{ item.private_v4 }}' + public_v4: '{{ item.public_v4 }}' diff --git a/roles/static_inventory/templates/inventory.j2 b/roles/static_inventory/templates/inventory.j2 new file mode 100644 index 000000000..aa87e2b11 --- /dev/null +++ b/roles/static_inventory/templates/inventory.j2 @@ -0,0 +1,76 @@ +# BEGIN Autogenerated hosts +{% for host in groups['all'] %} +{% if hostvars[host].get('ansible_connection', '') == 'local' %} +{{ host }} ansible_connection=local +{% else %} + +{{ host }}{% if 'ansible_host' in hostvars[host] +%} ansible_host={{ hostvars[host]['ansible_host'] }}{% endif %} +{% if 'private_v4' in hostvars[host] +%} private_v4={{ hostvars[host]['private_v4'] }}{% endif %} +{% if 'public_v4' in hostvars[host] +%} public_v4={{ hostvars[host]['public_v4'] }}{% endif %} +{% if 'ansible_private_key_file' in hostvars[host] +%} ansible_private_key_file={{ hostvars[host]['ansible_private_key_file'] }}{% endif %} + +{% endif %} +{% endfor %} +# END autogenerated hosts + +#[all:vars] +# For all group_vars, see ./group_vars/all.yml + +# Create an OSEv3 group that contains the master, nodes, etcd, and lb groups. +# The lb group lets Ansible configure HAProxy as the load balancing solution. +# Comment lb out if your load balancer is pre-configured. +[cluster_hosts:children] +OSEv3 +dns + +[OSEv3:children] +masters +nodes +etcd + +# Set variables common for all OSEv3 hosts +#[OSEv3:vars] + +# For OSEv3 normal group vars, see ./group_vars/OSEv3.yml + +# Host Groups + +[masters:children] +masters.{{ stack_name }} + +[etcd:children] +etcd.{{ stack_name }} + +[nodes:children] +masters +infra.{{ stack_name }} +nodes.{{ stack_name }} + +[infra_hosts:children] +infra.{{ stack_name }} + +[dns:children] +dns.{{ stack_name }} + +# Empty placeholders for all groups of the cluster nodes +[masters.{{ stack_name }}] +[etcd.{{ stack_name }}] +[infra.{{ stack_name }}] +[nodes.{{ stack_name }}] +[dns.{{ stack_name }}] + +# BEGIN Autogenerated groups +{% for group in groups %} +{% if group not in ['ungrouped', 'all'] %} +[{{ group }}] +{% for host in groups[group] %} +{{ host }} +{% endfor %} + +{% endif %} +{% endfor %} +# END Autogenerated groups -- cgit v1.2.3