Browse Source

Static inventory autogeneration (#550)

* At the provisioning stage, allow users to auto-generate a static
  inventory w/o manual steps needed. The alternative to
  go fully dynamic TBD.
* Move openshift pre-install playbook to the post provision playbook,
  where the second part of the pre install tasks is already placed.

Signed-off-by: Bogdan Dobrelya <bdobreli@redhat.com>
Bogdan Dobrelya 7 years ago
parent
commit
e7a7d1642c

+ 41 - 5
playbooks/provisioning/openstack/README.md

@@ -93,8 +93,9 @@ steps, and the Neutron subnet for the Heat stack is updated to point to that
 server in the end. So the provisioned servers will start using it natively
 server in the end. So the provisioned servers will start using it natively
 as a default nameserver that comes from the NetworkManager and cloud-init.
 as a default nameserver that comes from the NetworkManager and cloud-init.
 
 
-`openstack_ssh_key` is a Nova keypair -- you can see your keypairs with
-`openstack keypair list`.
+`openstack_ssh_key` is a Nova keypair - you can see your keypairs with
+`openstack keypair list`. This guide assumes that its corresponding private
+key is `~/.ssh/openshift`, stored on the ansible admin (control) node.
 
 
 `openstack_default_image_name` is the name of the Glance image the
 `openstack_default_image_name` is the name of the Glance image the
 servers will use. You can
 servers will use. You can
@@ -127,6 +128,14 @@ The `required_packages` variable also provides a list of the additional
 prerequisite packages to be installed before to deploy an OpenShift cluster.
 prerequisite packages to be installed before to deploy an OpenShift cluster.
 Those are ignored though, if the `manage_packages: False`.
 Those are ignored though, if the `manage_packages: False`.
 
 
+The `openstack_inventory` controls either a static inventory will be created after the
+cluster nodes provisioned on OpenStack cloud. Note, the fully dynamic inventory
+is yet to be supported, so the static inventory will be created anyway.
+
+The `openstack_inventory_path` points the directory to host the generated static inventory.
+It should point to the copied example inventory directory, otherwise ti creates
+a new one for you.
+
 #### Security notes
 #### Security notes
 
 
 Configure required `*_ingress_cidr` variables to restrict public access
 Configure required `*_ingress_cidr` variables to restrict public access
@@ -164,21 +173,48 @@ variables for the `inventory/group_vars/OSEv3.yml`, `all.yml`:
     origin_release: 1.5.1
     origin_release: 1.5.1
     openshift_deployment_type: "{{ deployment_type }}"
     openshift_deployment_type: "{{ deployment_type }}"
 
 
+### Configure static inventory
+
+Example inventory variables:
+
+    openstack_private_ssh_key: ~/.ssh/openshift
+    openstack_inventory: static
+    openstack_inventory_path: ../../../../inventory
+
+
+In this guide, the latter points to the current directory, where you run ansible commands
+from.
+
+To verify nodes connectivity, use the command:
+
+    ansible -v -i inventory/hosts -m ping all
+
+If something is broken, double-check the inventory variables, paths and the
+generated `<openstack_inventory_path>/hosts` file.
+
+The `inventory: dynamic` can be used instead to access cluster nodes directly via
+floating IPs. In this mode you can not use a bastion node and should specify
+the dynamic inventory file in your ansible commands , like `-i openstack.py`.
+
 ## Deployment
 ## Deployment
 
 
 ### Run the playbook
 ### Run the playbook
 
 
 Assuming your OpenStack (Keystone) credentials are in the `keystonerc`
 Assuming your OpenStack (Keystone) credentials are in the `keystonerc`
-file, this is how you stat the provisioning process:
+this is how you stat the provisioning process from your ansible control node:
 
 
     . keystonerc
     . keystonerc
-    ansible-playbook -i inventory --timeout 30  --private-key ~/.ssh/openshift openshift-ansible-contrib/playbooks/provisioning/openstack/provision.yaml
+    ansible-playbook openshift-ansible-contrib/playbooks/provisioning/openstack/provision.yaml
+
+Note, here you start with an empty inventory. The static inventory will be populated
+with data so you can omit providing additional arguments for future ansible commands.
+
 
 
 ### Install OpenShift
 ### Install OpenShift
 
 
 Once it succeeds, you can install openshift by running:
 Once it succeeds, you can install openshift by running:
 
 
-    ansible-playbook --user openshift --private-key ~/.ssh/openshift -i inventory/ openshift-ansible/playbooks/byo/config.yml
+    ansible-playbook openshift-ansible/playbooks/byo/config.yml
 
 
 
 
 ## License
 ## License

+ 45 - 27
playbooks/provisioning/openstack/post-provision-openstack.yml

@@ -1,72 +1,90 @@
 ---
 ---
+- hosts: cluster_hosts
+  name: Wait for the the nodes to come up
+  become: False
+  gather_facts: False
+  tasks:
+    - wait_for_connection:
+
+- hosts: cluster_hosts
+  gather_facts: True
+  tasks:
+    - name: Debug hostvar
+      debug:
+        msg: "{{ hostvars[inventory_hostname] }}"
+        verbosity: 2
+
+- name: OpenShift Pre-Requisites (part 1)
+  include: pre-install.yml
+
 - name: Assign hostnames
 - name: Assign hostnames
   hosts: cluster_hosts
   hosts: cluster_hosts
   gather_facts: False
   gather_facts: False
   become: true
   become: true
   pre_tasks:
   pre_tasks:
-  - include: pre_tasks.yml
+    - include: pre_tasks.yml
   roles:
   roles:
-  - role: hostnames
+    - role: hostnames
 
 
 - name: Subscribe DNS Host to allow for configuration below
 - name: Subscribe DNS Host to allow for configuration below
   hosts: dns
   hosts: dns
   gather_facts: False
   gather_facts: False
   become: true
   become: true
   roles:
   roles:
-  - role: subscription-manager
-    when: hostvars.localhost.rhsm_register|default(False)
-    tags: 'subscription-manager'
+    - role: subscription-manager
+      when: hostvars.localhost.rhsm_register|default(False)
+      tags: 'subscription-manager'
 
 
 - name: Determine which DNS server(s) to use for our generated records
 - name: Determine which DNS server(s) to use for our generated records
   hosts: localhost
   hosts: localhost
   gather_facts: False
   gather_facts: False
   become: False
   become: False
   roles:
   roles:
-  - dns-server-detect
+    - dns-server-detect
 
 
 - name: Build the DNS Server Views and Configure DNS Server(s)
 - name: Build the DNS Server Views and Configure DNS Server(s)
   hosts: dns
   hosts: dns
   gather_facts: False
   gather_facts: False
   become: true
   become: true
   pre_tasks:
   pre_tasks:
-  - include: pre_tasks.yml
-  - name: "Generate dns-server views"
-    include: openstack_dns_views.yml
+    - include: pre_tasks.yml
+    - name: "Generate dns-server views"
+      include: openstack_dns_views.yml
   roles:
   roles:
-  - role: infra-ansible/roles/dns-server
+    - role: infra-ansible/roles/dns-server
 
 
 - name: Build and process DNS Records
 - name: Build and process DNS Records
   hosts: localhost
   hosts: localhost
-  gather_facts: False
+  gather_facts: True
   become: False
   become: False
   pre_tasks:
   pre_tasks:
-  - include: pre_tasks.yml
-  - name: "Generate dns records"
-    include: openstack_dns_records.yml
+    - include: pre_tasks.yml
+    - name: "Generate dns records"
+      include: openstack_dns_records.yml
   roles:
   roles:
-  - role: infra-ansible/roles/dns
+    - role: infra-ansible/roles/dns
 
 
 - name: Switch the stack subnet to the configured private DNS server
 - name: Switch the stack subnet to the configured private DNS server
   hosts: localhost
   hosts: localhost
   gather_facts: False
   gather_facts: False
   become: False
   become: False
   vars_files:
   vars_files:
-  - stack_params.yaml
+    - stack_params.yaml
   tasks:
   tasks:
-  - include_role:
-      name: openstack-stack
-      tasks_from: subnet_update_dns_servers
+    - include_role:
+        name: openstack-stack
+        tasks_from: subnet_update_dns_servers
 
 
-- name: OpenShift Pre-Requisites
+- name: OpenShift Pre-Requisites (part 2)
   hosts: OSEv3
   hosts: OSEv3
   gather_facts: true
   gather_facts: true
   become: true
   become: true
   pre_tasks:
   pre_tasks:
-  - name: "Include DNS configuration to ensure proper name resolution"
-    lineinfile:
-      state: present
-      dest: /etc/sysconfig/network
-      regexp: "IP4_NAMESERVERS={{ hostvars['localhost'].private_dns_server }}"
-      line: "IP4_NAMESERVERS={{ hostvars['localhost'].private_dns_server }}"
+    - name: "Include DNS configuration to ensure proper name resolution"
+      lineinfile:
+        state: present
+        dest: /etc/sysconfig/network
+        regexp: "IP4_NAMESERVERS={{ hostvars['localhost'].private_dns_server }}"
+        line: "IP4_NAMESERVERS={{ hostvars['localhost'].private_dns_server }}"
   roles:
   roles:
-  - node-network-manager
+    - node-network-manager

+ 4 - 15
playbooks/provisioning/openstack/provision-openstack.yml

@@ -8,6 +8,10 @@
     - include: pre_tasks.yml
     - include: pre_tasks.yml
   roles:
   roles:
     - role: openstack-stack
     - role: openstack-stack
+    - role: static_inventory
+      when: openstack_inventory|default('static') == 'static'
+      inventory_path: "{{ openstack_inventory_path|default(inventory_dir) }}"
+      private_ssh_key: "{{ openstack_private_ssh_key|default('~/.ssh/id_rsa') }}"
 
 
 - name: Refresh Server inventory
 - name: Refresh Server inventory
   hosts: localhost
   hosts: localhost
@@ -17,19 +21,4 @@
   tasks:
   tasks:
     - meta: refresh_inventory
     - meta: refresh_inventory
 
 
-- hosts: cluster_hosts
-  name: Wait for the the nodes to come up
-  become: False
-  gather_facts: False
-  tasks:
-    - wait_for_connection:
-
-- hosts: cluster_hosts
-  gather_facts: True
-  tasks:
-    - name: Debug hostvar
-      debug:
-        msg: "{{ hostvars[inventory_hostname] }}"
-        verbosity: 2
-
 - include: post-provision-openstack.yml
 - include: post-provision-openstack.yml

+ 0 - 2
playbooks/provisioning/openstack/provision.yaml

@@ -2,5 +2,3 @@
 - include: "prerequisites.yml"
 - include: "prerequisites.yml"
 
 
 - include: "provision-openstack.yml"
 - include: "provision-openstack.yml"
-
-- include: "pre-install.yml"

+ 11 - 0
playbooks/provisioning/openstack/sample-inventory/group_vars/all.yml

@@ -60,3 +60,14 @@ ansible_user: openshift
 
 
 # # Use a single security group for a cluster (default: false)
 # # Use a single security group for a cluster (default: false)
 #openstack_flat_secgrp: false
 #openstack_flat_secgrp: false
+
+# # Openstack inventory type and cluster nodes access pattern
+# # Defaults to 'static'.
+# # Use 'dynamic' to access cluster nodes directly, via floating IPs
+# # and given a dynamic inventory script, like openstack.py
+#openstack_inventory: static
+# # The path to checkpoint the static inventory from the in-memory one
+#openstack_inventory_path: ../../../../inventory
+
+# # The Nova key-pair's private SSH key to access inventory nodes
+#openstack_private_ssh_key: ~/.ssh/openshift