Bladeren bron

Bug 1320829 - Ensure docker installed for facts

- gather facts requiring docker only if docker is present and running
- Update reference to etcd role in playbooks/common/openshift-etcd/config.yml
  to use openshift_etcd
Jason DeTiberus 9 jaren geleden
bovenliggende
commit
2c608429d8

+ 1 - 1
playbooks/common/openshift-etcd/config.yml

@@ -103,7 +103,7 @@
       dest: "{{ etcd_cert_config_dir }}"
     when: etcd_server_certs_missing
   roles:
-  - etcd
+  - openshift_etcd
   - role: nickhammond.logrotate
 
 - name: Delete temporary directory on localhost

+ 2 - 1
roles/etcd/tasks/main.yml

@@ -39,7 +39,8 @@
 - name: Check for etcd service presence
   command: systemctl show etcd.service
   register: etcd_show
-  
+  changed_when: false
+
 - name: Mask system etcd when containerized
   when: openshift.common.is_containerized | bool and 'LoadState=not-found' not in etcd_show.stdout
   command: systemctl mask etcd

+ 2 - 1
roles/openshift_cli/meta/main.yml

@@ -12,6 +12,7 @@ galaxy_info:
   categories:
   - cloud
 dependencies:
-- role: openshift_common
 - role: openshift_docker
   when: openshift.common.is_containerized | bool
+- role: openshift_common
+- role: openshift_cli_facts

+ 0 - 6
roles/openshift_cli/tasks/main.yml

@@ -1,10 +1,4 @@
 ---
-# TODO: move this to a new 'cli' role
-- openshift_facts:
-    role: common
-    local_facts:
-      cli_image: "{{ osm_image | default(None) }}"
-
 - name: Install clients
   action: "{{ ansible_pkg_mgr }} name={{ openshift.common.service_type }}-clients state=present"
   when: not openshift.common.is_containerized | bool

+ 15 - 0
roles/openshift_cli_facts/meta/main.yml

@@ -0,0 +1,15 @@
+---
+galaxy_info:
+  author: Jason DeTiberus
+  description: OpenShift CLI Facts
+  company: Red Hat, Inc.
+  license: Apache License, Version 2.0
+  min_ansible_version: 1.9
+  platforms:
+  - name: EL
+    versions:
+    - 7
+  categories:
+  - cloud
+dependencies:
+- role: openshift_facts

+ 6 - 0
roles/openshift_cli_facts/tasks/main.yml

@@ -0,0 +1,6 @@
+---
+# TODO: move this to a new 'cli' role
+- openshift_facts:
+    role: common
+    local_facts:
+      cli_image: "{{ osm_image | default(None) }}"

+ 62 - 7
roles/openshift_facts/library/openshift_facts.py

@@ -26,6 +26,8 @@ from distutils.util import strtobool
 from distutils.version import LooseVersion
 import struct
 import socket
+from dbus import SystemBus, Interface
+from dbus.exceptions import DBusException
 
 
 def migrate_docker_facts(facts):
@@ -745,8 +747,9 @@ def set_version_facts_if_unset(facts):
     """
     if 'common' in facts:
         deployment_type = facts['common']['deployment_type']
-        facts['common']['version'] = version = get_openshift_version(facts)
+        version = get_openshift_version(facts)
         if version is not None:
+            facts['common']['version'] = version
             if deployment_type == 'origin':
                 version_gte_3_1_or_1_1 = LooseVersion(version) >= LooseVersion('1.1.0')
                 version_gte_3_1_1_or_1_1_1 = LooseVersion(version) >= LooseVersion('1.1.1')
@@ -965,6 +968,50 @@ def build_api_server_args(facts):
             facts = merge_facts({'master': {'api_server_args': api_server_args}}, facts, [], [])
     return facts
 
+def is_service_running(service):
+    """ Queries systemd through dbus to see if the service is running """
+    service_running = False
+    bus = SystemBus()
+    systemd = bus.get_object('org.freedesktop.systemd1', '/org/freedesktop/systemd1')
+    manager = Interface(systemd, dbus_interface='org.freedesktop.systemd1.Manager')
+    try:
+        service_unit = service if service.endswith('.service') else manager.GetUnit('{0}.service'.format(service))
+        service_proxy = bus.get_object('org.freedesktop.systemd1', str(service_unit))
+        service_properties = Interface(service_proxy, dbus_interface='org.freedesktop.DBus.Properties')
+        service_load_state = service_properties.Get('org.freedesktop.systemd1.Unit', 'LoadState')
+        service_active_state = service_properties.Get('org.freedesktop.systemd1.Unit', 'ActiveState')
+        if service_load_state == 'loaded' and service_active_state == 'active':
+            service_running = True
+    except DBusException:
+        pass
+
+    return service_running
+
+def get_version_output(binary, version_cmd):
+    """ runs and returns the version output for a command """
+    cmd = []
+    for item in (binary, version_cmd):
+        if isinstance(item, list):
+            cmd.extend(item)
+        else:
+            cmd.append(item)
+
+    if os.path.isfile(cmd[0]):
+        _, output, _ = module.run_command(cmd)
+    return output
+
+def get_docker_version_info():
+    """ Parses and returns the docker version info """
+    result = None
+    if is_service_running('docker'):
+        version_info = yaml.safe_load(get_version_output('/usr/bin/docker', 'version'))
+        if 'Server' in version_info:
+            result = {
+                'api_version': version_info['Server']['API version'],
+                'version': version_info['Server']['Version']
+            }
+    return result
+
 def get_openshift_version(facts, cli_image=None):
     """ Get current version of openshift on the host
 
@@ -1006,9 +1053,10 @@ def get_openshift_version(facts, cli_image=None):
 
         if version is None and cli_image is not None:
             # Assume we haven't installed the environment yet and we need
-            # to query the latest image
-            exit_code, output, _ = module.run_command(['docker', 'run', '--rm', cli_image, 'version'])
-            version = parse_openshift_version(output)
+            # to query the latest image, but only if docker is installed
+            if 'docker' in facts and 'version' in facts['docker']:
+                exit_code, output, _ = module.run_command(['docker', 'run', '--rm', cli_image, 'version'])
+                version = parse_openshift_version(output)
 
     return version
 
@@ -1257,8 +1305,10 @@ def set_container_facts_if_unset(facts):
     if safe_get_bool(facts['common']['is_containerized']):
         facts['common']['admin_binary'] = '/usr/local/bin/oadm'
         facts['common']['client_binary'] = '/usr/local/bin/oc'
-        base_version = get_openshift_version(facts, cli_image).split('-')[0]
-        facts['common']['image_tag'] = "v" + base_version
+        openshift_version = get_openshift_version(facts, cli_image)
+        if openshift_version is not None:
+            base_version = openshift_version.split('-')[0]
+            facts['common']['image_tag'] = "v" + base_version
 
     return facts
 
@@ -1466,7 +1516,12 @@ class OpenShiftFacts(object):
                                     set_node_ip=False)
 
         if 'docker' in roles:
-            defaults['docker'] = dict(disable_push_dockerhub=False)
+            docker = dict(disable_push_dockerhub=False)
+            version_info = get_docker_version_info()
+            if version_info is not None:
+                docker['api_version'] = version_info['api_version']
+                docker['version'] = version_info['version']
+            defaults['docker'] = docker
 
         if 'cloudprovider' in roles:
             defaults['cloudprovider'] = dict(kind=None)

+ 1 - 1
roles/openshift_facts/tasks/main.yml

@@ -30,6 +30,6 @@
       cluster_id: "{{ openshift_cluster_id | default('default') }}"
       hostname: "{{ openshift_hostname | default(None) }}"
       ip: "{{ openshift_ip | default(None) }}"
-      is_containerized: "{{ containerized | default(None) }}"
+      is_containerized: "{{ l_is_containerized | default(None) }}"
       public_hostname: "{{ openshift_public_hostname | default(None) }}"
       public_ip: "{{ openshift_public_ip | default(None) }}"

+ 1 - 0
roles/openshift_master/meta/main.yml

@@ -14,3 +14,4 @@ galaxy_info:
 dependencies:
 - role: openshift_cli
 - role: openshift_cloud_provider
+- role: openshift_master_facts

+ 0 - 65
roles/openshift_master/tasks/main.yml

@@ -23,71 +23,6 @@
     msg: "Pacemaker based HA is not supported at this time when used with containerized installs"
   when: openshift_master_ha | bool and openshift_master_cluster_method == "pacemaker" and openshift.common.is_containerized | bool
 
-- name: Set master facts
-  openshift_facts:
-    role: master
-    local_facts:
-      cluster_method: "{{ openshift_master_cluster_method | default(None) }}"
-      cluster_hostname: "{{ openshift_master_cluster_hostname | default(None) }}"
-      cluster_public_hostname: "{{ openshift_master_cluster_public_hostname | default(None) }}"
-      debug_level: "{{ openshift_master_debug_level | default(openshift.common.debug_level) }}"
-      api_port: "{{ openshift_master_api_port | default(None) }}"
-      api_url: "{{ openshift_master_api_url | default(None) }}"
-      api_use_ssl: "{{ openshift_master_api_use_ssl | default(None) }}"
-      public_api_url: "{{ openshift_master_public_api_url | default(None) }}"
-      console_path: "{{ openshift_master_console_path | default(None) }}"
-      console_port: "{{ openshift_master_console_port | default(None) }}"
-      console_url: "{{ openshift_master_console_url | default(None) }}"
-      console_use_ssl: "{{ openshift_master_console_use_ssl | default(None) }}"
-      public_console_url: "{{ openshift_master_public_console_url | default(None) }}"
-      logging_public_url: "{{ openshift_master_logging_public_url | default(None) }}"
-      metrics_public_url: "{{ openshift_master_metrics_public_url | default(None) }}"
-      logout_url: "{{ openshift_master_logout_url | default(None) }}"
-      extension_scripts: "{{ openshift_master_extension_scripts | default(None) }}"
-      extension_stylesheets: "{{ openshift_master_extension_stylesheets | default(None) }}"
-      extensions: "{{ openshift_master_extensions | default(None) }}"
-      oauth_template: "{{ openshift_master_oauth_template | default(None) }}"
-      etcd_hosts: "{{ openshift_master_etcd_hosts | default(None) }}"
-      etcd_port: "{{ openshift_master_etcd_port | default(None) }}"
-      etcd_use_ssl: "{{ openshift_master_etcd_use_ssl | default(None) }}"
-      etcd_urls: "{{ openshift_master_etcd_urls | default(None) }}"
-      embedded_etcd: "{{ openshift_master_embedded_etcd | default(None) }}"
-      embedded_kube: "{{ openshift_master_embedded_kube | default(None) }}"
-      embedded_dns: "{{ openshift_master_embedded_dns | default(None) }}"
-      dns_port: "{{ openshift_master_dns_port | default(None) }}"
-      bind_addr: "{{ openshift_master_bind_addr | default(None) }}"
-      pod_eviction_timeout: "{{ openshift_master_pod_eviction_timeout | default(None) }}"
-      portal_net: "{{ openshift_master_portal_net | default(None) }}"
-      session_max_seconds: "{{ openshift_master_session_max_seconds | default(None) }}"
-      session_name: "{{ openshift_master_session_name | default(None) }}"
-      session_secrets_file: "{{ openshift_master_session_secrets_file | default(None) }}"
-      session_auth_secrets: "{{ openshift_master_session_auth_secrets | default(None) }}"
-      session_encryption_secrets: "{{ openshift_master_session_encryption_secrets | default(None) }}"
-      access_token_max_seconds: "{{ openshift_master_access_token_max_seconds | default(None) }}"
-      auth_token_max_seconds: "{{ openshift_master_auth_token_max_seconds | default(None) }}"
-      identity_providers: "{{ openshift_master_identity_providers | default(None) }}"
-      registry_url: "{{ oreg_url | default(None) }}"
-      oauth_grant_method: "{{ openshift_master_oauth_grant_method | default(None) }}"
-      sdn_cluster_network_cidr: "{{ osm_cluster_network_cidr | default(None) }}"
-      sdn_host_subnet_length: "{{ osm_host_subnet_length | default(None) }}"
-      default_subdomain: "{{ openshift_master_default_subdomain | default(osm_default_subdomain) | default(None) }}"
-      custom_cors_origins: "{{ osm_custom_cors_origins | default(None) }}"
-      default_node_selector: "{{ osm_default_node_selector | default(None) }}"
-      project_request_message: "{{ osm_project_request_message | default(None) }}"
-      project_request_template: "{{ osm_project_request_template | default(None) }}"
-      mcs_allocator_range: "{{ osm_mcs_allocator_range | default(None) }}"
-      mcs_labels_per_project: "{{ osm_mcs_labels_per_project | default(None) }}"
-      uid_allocator_range: "{{ osm_uid_allocator_range | default(None) }}"
-      router_selector: "{{ openshift_router_selector | default(None) }}"
-      registry_selector: "{{ openshift_registry_selector | default(None) }}"
-      api_server_args: "{{ osm_api_server_args | default(None) }}"
-      controller_args: "{{ osm_controller_args | default(None) }}"
-      infra_nodes: "{{ openshift_infra_nodes | default(None) }}"
-      disabled_features: "{{ osm_disabled_features | default(None) }}"
-      master_count: "{{ openshift_master_count | default(None) }}"
-      controller_lease_ttl: "{{ osm_controller_lease_ttl | default(None) }}"
-      master_image: "{{ osm_image | default(None) }}"
-
 - name: Install Master package
   action: "{{ ansible_pkg_mgr }} name={{ openshift.common.service_type }}-master{{ openshift_version  }} state=present"
   when: not openshift.common.is_containerized | bool

+ 15 - 0
roles/openshift_master_facts/meta/main.yml

@@ -0,0 +1,15 @@
+---
+galaxy_info:
+  author: Jason DeTiberus
+  description: OpenShift Master Facts
+  company: Red Hat, Inc.
+  license: Apache License, Version 2.0
+  min_ansible_version: 1.9
+  platforms:
+  - name: EL
+    versions:
+    - 7
+  categories:
+  - cloud
+dependencies:
+- role: openshift_facts

+ 65 - 0
roles/openshift_master_facts/tasks/main.yml

@@ -0,0 +1,65 @@
+---
+- name: Set master facts
+  openshift_facts:
+    role: master
+    local_facts:
+      cluster_method: "{{ openshift_master_cluster_method | default(None) }}"
+      cluster_hostname: "{{ openshift_master_cluster_hostname | default(None) }}"
+      cluster_public_hostname: "{{ openshift_master_cluster_public_hostname | default(None) }}"
+      debug_level: "{{ openshift_master_debug_level | default(openshift.common.debug_level) }}"
+      api_port: "{{ openshift_master_api_port | default(None) }}"
+      api_url: "{{ openshift_master_api_url | default(None) }}"
+      api_use_ssl: "{{ openshift_master_api_use_ssl | default(None) }}"
+      public_api_url: "{{ openshift_master_public_api_url | default(None) }}"
+      console_path: "{{ openshift_master_console_path | default(None) }}"
+      console_port: "{{ openshift_master_console_port | default(None) }}"
+      console_url: "{{ openshift_master_console_url | default(None) }}"
+      console_use_ssl: "{{ openshift_master_console_use_ssl | default(None) }}"
+      public_console_url: "{{ openshift_master_public_console_url | default(None) }}"
+      logging_public_url: "{{ openshift_master_logging_public_url | default(None) }}"
+      metrics_public_url: "{{ openshift_master_metrics_public_url | default(None) }}"
+      logout_url: "{{ openshift_master_logout_url | default(None) }}"
+      extension_scripts: "{{ openshift_master_extension_scripts | default(None) }}"
+      extension_stylesheets: "{{ openshift_master_extension_stylesheets | default(None) }}"
+      extensions: "{{ openshift_master_extensions | default(None) }}"
+      oauth_template: "{{ openshift_master_oauth_template | default(None) }}"
+      etcd_hosts: "{{ openshift_master_etcd_hosts | default(None) }}"
+      etcd_port: "{{ openshift_master_etcd_port | default(None) }}"
+      etcd_use_ssl: "{{ openshift_master_etcd_use_ssl | default(None) }}"
+      etcd_urls: "{{ openshift_master_etcd_urls | default(None) }}"
+      embedded_etcd: "{{ openshift_master_embedded_etcd | default(None) }}"
+      embedded_kube: "{{ openshift_master_embedded_kube | default(None) }}"
+      embedded_dns: "{{ openshift_master_embedded_dns | default(None) }}"
+      dns_port: "{{ openshift_master_dns_port | default(None) }}"
+      bind_addr: "{{ openshift_master_bind_addr | default(None) }}"
+      pod_eviction_timeout: "{{ openshift_master_pod_eviction_timeout | default(None) }}"
+      portal_net: "{{ openshift_master_portal_net | default(None) }}"
+      session_max_seconds: "{{ openshift_master_session_max_seconds | default(None) }}"
+      session_name: "{{ openshift_master_session_name | default(None) }}"
+      session_secrets_file: "{{ openshift_master_session_secrets_file | default(None) }}"
+      session_auth_secrets: "{{ openshift_master_session_auth_secrets | default(None) }}"
+      session_encryption_secrets: "{{ openshift_master_session_encryption_secrets | default(None) }}"
+      access_token_max_seconds: "{{ openshift_master_access_token_max_seconds | default(None) }}"
+      auth_token_max_seconds: "{{ openshift_master_auth_token_max_seconds | default(None) }}"
+      identity_providers: "{{ openshift_master_identity_providers | default(None) }}"
+      registry_url: "{{ oreg_url | default(None) }}"
+      oauth_grant_method: "{{ openshift_master_oauth_grant_method | default(None) }}"
+      sdn_cluster_network_cidr: "{{ osm_cluster_network_cidr | default(None) }}"
+      sdn_host_subnet_length: "{{ osm_host_subnet_length | default(None) }}"
+      default_subdomain: "{{ openshift_master_default_subdomain | default(osm_default_subdomain) | default(None) }}"
+      custom_cors_origins: "{{ osm_custom_cors_origins | default(None) }}"
+      default_node_selector: "{{ osm_default_node_selector | default(None) }}"
+      project_request_message: "{{ osm_project_request_message | default(None) }}"
+      project_request_template: "{{ osm_project_request_template | default(None) }}"
+      mcs_allocator_range: "{{ osm_mcs_allocator_range | default(None) }}"
+      mcs_labels_per_project: "{{ osm_mcs_labels_per_project | default(None) }}"
+      uid_allocator_range: "{{ osm_uid_allocator_range | default(None) }}"
+      router_selector: "{{ openshift_router_selector | default(None) }}"
+      registry_selector: "{{ openshift_registry_selector | default(None) }}"
+      api_server_args: "{{ osm_api_server_args | default(None) }}"
+      controller_args: "{{ osm_controller_args | default(None) }}"
+      infra_nodes: "{{ openshift_infra_nodes | default(None) }}"
+      disabled_features: "{{ osm_disabled_features | default(None) }}"
+      master_count: "{{ openshift_master_count | default(None) }}"
+      controller_lease_ttl: "{{ osm_controller_lease_ttl | default(None) }}"
+      master_image: "{{ osm_image | default(None) }}"

+ 1 - 1
roles/openshift_node/meta/main.yml

@@ -12,6 +12,6 @@ galaxy_info:
   categories:
   - cloud
 dependencies:
-- role: openshift_common
 - role: openshift_docker
 - role: openshift_cloud_provider
+- role: openshift_common