diff options
Diffstat (limited to 'roles')
51 files changed, 868 insertions, 485 deletions
| diff --git a/roles/etcd/tasks/main.yml b/roles/etcd/tasks/main.yml index 71735dc25..75d40216d 100644 --- a/roles/etcd/tasks/main.yml +++ b/roles/etcd/tasks/main.yml @@ -12,6 +12,8 @@  - name: Pull etcd container    command: docker pull {{ openshift.etcd.etcd_image }} +  register: pull_result +  changed_when: "'Downloaded newer image' in pull_result.stdout"    when: etcd_is_containerized | bool  - name: Install etcd container service file diff --git a/roles/openshift_ca/README.md b/roles/openshift_ca/README.md new file mode 100644 index 000000000..96c9cd5f2 --- /dev/null +++ b/roles/openshift_ca/README.md @@ -0,0 +1,48 @@ +OpenShift CA +============ + +This role delegates all tasks to the `openshift_ca_host` such that this role can be depended on by other OpenShift certificate roles. + +Requirements +------------ + +Role Variables +-------------- + +From this role: + +| Name                    | Default value                                 | Description                                                                 | +|-------------------------|-----------------------------------------------|-----------------------------------------------------------------------------| +| openshift_ca_host       | None (Required)                               | The hostname of the system where the OpenShift CA will be created.          | +| openshift_ca_config_dir | `{{ openshift.common.config_base }}/master`   | CA certificate directory.                                                   | +| openshift_ca_cert       | `{{ openshift_ca_config_dir }}/ca.crt`        | CA certificate path including CA certificate filename.                      | +| openshift_ca_key        | `{{ openshift_ca_config_dir }}/ca.key`        | CA key path including CA key filename.                                      | +| openshift_ca_serial     | `{{ openshift_ca_config_dir }}/ca.serial.txt` | CA serial path including CA serial filename.                                | +| openshift_version       | `{{ openshift_pkg_version }}`                 | OpenShift package version.                                                  | + +Dependencies +------------ + +* openshift_repos +* openshift_cli + +Example Playbook +---------------- + +``` +- name: Create OpenShift CA +  hosts: localhost +  roles: +  - role: openshift_ca +    openshift_ca_host: master1.example.com +``` + +License +------- + +Apache License Version 2.0 + +Author Information +------------------ + +Jason DeTiberus (jdetiber@redhat.com) diff --git a/roles/openshift_master_ca/meta/main.yml b/roles/openshift_ca/meta/main.yml index b5dd466c9..a08aa1686 100644 --- a/roles/openshift_master_ca/meta/main.yml +++ b/roles/openshift_ca/meta/main.yml @@ -1,10 +1,10 @@  ---  galaxy_info:    author: Jason DeTiberus -  description: +  description: OpenShift CA    company: Red Hat, Inc.    license: Apache License, Version 2.0 -  min_ansible_version: 1.8 +  min_ansible_version: 2.1    platforms:    - name: EL      versions: @@ -13,5 +13,5 @@ galaxy_info:    - cloud    - system  dependencies: -- { role: openshift_repos } -- { role: openshift_cli } +- role: openshift_repos +- role: openshift_cli diff --git a/roles/openshift_ca/vars/main.yml b/roles/openshift_ca/vars/main.yml new file mode 100644 index 000000000..a32e385ec --- /dev/null +++ b/roles/openshift_ca/vars/main.yml @@ -0,0 +1,6 @@ +--- +openshift_ca_config_dir: "{{ openshift.common.config_base }}/master" +openshift_ca_cert: "{{ openshift_ca_config_dir }}/ca.crt" +openshift_ca_key: "{{ openshift_ca_config_dir }}/ca.key" +openshift_ca_serial: "{{ openshift_ca_config_dir }}/ca.serial.txt" +openshift_version: "{{ openshift_pkg_version | default('') }}" diff --git a/roles/openshift_cli/library/openshift_container_binary_sync.py b/roles/openshift_cli/library/openshift_container_binary_sync.py new file mode 100644 index 000000000..fd290c6fc --- /dev/null +++ b/roles/openshift_cli/library/openshift_container_binary_sync.py @@ -0,0 +1,131 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# vim: expandtab:tabstop=4:shiftwidth=4 +# pylint: disable=missing-docstring,invalid-name +# + +import random +import tempfile +import shutil +import os.path + +# pylint: disable=redefined-builtin,wildcard-import,unused-wildcard-import +from ansible.module_utils.basic import * + + +DOCUMENTATION = ''' +--- +module: openshift_container_binary_sync +short_description: Copies OpenShift binaries out of the given image tag to host system. +''' + + +class BinarySyncError(Exception): +    def __init__(self, msg): +        super(BinarySyncError, self).__init__(msg) +        self.msg = msg + + +# pylint: disable=too-few-public-methods +class BinarySyncer(object): +    """ +    Syncs the openshift, oc, oadm, and kubectl binaries/symlinks out of +    a container onto the host system. +    """ + +    def __init__(self, module, image, tag): +        self.module = module +        self.changed = False +        self.output = [] +        self.bin_dir = '/usr/local/bin' +        self.image = image +        self.tag = tag +        self.temp_dir = None # TBD + +    def sync(self): +        container_name = "openshift-cli-%s" % random.randint(1, 100000) +        rc, stdout, stderr = self.module.run_command(['docker', 'create', '--name', +                                                      container_name, '%s:%s' % (self.image, self.tag)]) +        if rc: +            raise BinarySyncError("Error creating temporary docker container. stdout=%s, stderr=%s" % +                                  (stdout, stderr)) +        self.output.append(stdout) +        try: +            self.temp_dir = tempfile.mkdtemp() +            self.output.append("Using temp dir: %s" % self.temp_dir) + +            rc, stdout, stderr = self.module.run_command(['docker', 'cp', "%s:/usr/bin/openshift" % container_name, +                                                          self.temp_dir]) +            if rc: +                raise BinarySyncError("Error copying file from docker container: stdout=%s, stderr=%s" % +                                      (stdout, stderr)) + +            rc, stdout, stderr = self.module.run_command(['docker', 'cp', "%s:/usr/bin/oc" % container_name, +                                                          self.temp_dir]) +            if rc: +                raise BinarySyncError("Error copying file from docker container: stdout=%s, stderr=%s" % +                                      (stdout, stderr)) + +            self._sync_binary('openshift') + +            # In older versions, oc was a symlink to openshift: +            if os.path.islink(os.path.join(self.temp_dir, 'oc')): +                self._sync_symlink('oc', 'openshift') +            else: +                self._sync_binary('oc') + +            # Ensure correct symlinks created: +            self._sync_symlink('kubectl', 'openshift') +            self._sync_symlink('oadm', 'openshift') +        finally: +            shutil.rmtree(self.temp_dir) +            self.module.run_command(['docker', 'rm', container_name]) + +    def _sync_symlink(self, binary_name, link_to): +        """ Ensure the given binary name exists and links to the expected binary. """ +        link_path = os.path.join(self.bin_dir, binary_name) +        link_dest = os.path.join(self.bin_dir, binary_name) +        if not os.path.exists(link_path) or \ +                not os.path.islink(link_path) or \ +                os.path.realpath(link_path) != os.path.realpath(link_dest): +            if os.path.exists(link_path): +                os.remove(link_path) +            os.symlink(link_to, os.path.join(self.bin_dir, binary_name)) +            self.output.append("Symlinked %s to %s." % (link_path, link_dest)) +            self.changed = True + +    def _sync_binary(self, binary_name): +        src_path = os.path.join(self.temp_dir, binary_name) +        dest_path = os.path.join(self.bin_dir, binary_name) +        incoming_checksum = self.module.run_command(['sha256sum', src_path])[1] +        if not os.path.exists(dest_path) or self.module.run_command(['sha256sum', dest_path])[1] != incoming_checksum: +            shutil.move(src_path, dest_path) +            self.output.append("Moved %s to %s." % (src_path, dest_path)) +            self.changed = True + + +def main(): +    module = AnsibleModule( +        argument_spec=dict( +            image=dict(required=True), +            tag=dict(required=True), +        ), +        supports_check_mode=True +    ) + +    image = module.params['image'] +    tag = module.params['tag'] + +    binary_syncer = BinarySyncer(module, image, tag) + +    try: +        binary_syncer.sync() +    except BinarySyncError as ex: +        module.fail_json(msg=ex.msg) + +    return module.exit_json(changed=binary_syncer.changed, +                            output=binary_syncer.output) + + +if __name__ == '__main__': +    main() diff --git a/roles/openshift_cli/tasks/main.yml b/roles/openshift_cli/tasks/main.yml index 4d6219b94..11c73b25c 100644 --- a/roles/openshift_cli/tasks/main.yml +++ b/roles/openshift_cli/tasks/main.yml @@ -6,24 +6,14 @@  - name: Pull CLI Image    command: >      docker pull {{ openshift.common.cli_image }}:{{ openshift_image_tag }} +  register: pull_result +  changed_when: "'Downloaded newer image' in pull_result.stdout"    when: openshift.common.is_containerized | bool -- name: Create /usr/local/bin/openshift cli wrapper -  template: -    src: openshift.j2 -    dest: /usr/local/bin/openshift -    mode: 0755 -  when: openshift.common.is_containerized | bool - -- name: Create client symlinks -  file: -    path: "{{ item }}" -    state: link -    src: /usr/local/bin/openshift -  with_items: -    - /usr/local/bin/oadm -    - /usr/local/bin/oc -    - /usr/local/bin/kubectl +- name: Copy client binaries/symlinks out of CLI image for use on the host +  openshift_container_binary_sync: +    image: "{{ openshift.common.cli_image }}" +    tag: "{{ openshift_image_tag }}"    when: openshift.common.is_containerized | bool  - name: Reload facts to pick up installed OpenShift version diff --git a/roles/openshift_cli/templates/openshift.j2 b/roles/openshift_cli/templates/openshift.j2 deleted file mode 100644 index 7786acead..000000000 --- a/roles/openshift_cli/templates/openshift.j2 +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -if [ ! -d ~/.kube ]; then -   mkdir -m 0700 ~/.kube -fi -cmd=`basename $0` -user=`id -u` -group=`id -g` -image_tag="{{ openshift_image_tag }}" - ->&2 echo """ -================================================================================ -ATTENTION: You are running ${cmd} via a wrapper around 'docker run {{ openshift.common.cli_image }}:${image_tag}'. -This wrapper is intended only to be used to bootstrap an environment. Please -install client tools on another host once you have granted cluster-admin -privileges to a user. -{% if openshift.common.deployment_type in ['openshift-enterprise','atomic-enterprise'] %} -See https://docs.openshift.com/enterprise/latest/cli_reference/get_started_cli.html -{% else %} -See https://docs.openshift.org/latest/cli_reference/get_started_cli.html -{% endif %} -================================================================================= -""" - -if [ -n "$image_tag" ]; then -    image_tag=":$image_tag" -fi - -docker run -i --privileged --net=host --user=${user}:${group} -v ~/.kube:/root/.kube -v /tmp:/tmp -v {{ openshift.common.config_base}}:{{ openshift.common.config_base }} -e KUBECONFIG=/root/.kube/config --entrypoint ${cmd} --rm {{ openshift.common.cli_image }}${image_tag} "${@}" diff --git a/roles/openshift_cluster_metrics/README.md b/roles/openshift_cluster_metrics/README.md deleted file mode 100644 index 9fdfab8e3..000000000 --- a/roles/openshift_cluster_metrics/README.md +++ /dev/null @@ -1,36 +0,0 @@ -#openshift_cluster_metrics - -This role configures Cluster wide metrics. It does setting up three services: -* Metrics are stored in InfluxDB for querying. -* Heapster reads all nodes and pods from the master, then connects to eachs node's kubelet to retrieve pod metrics. -* Grafan allows users to create dashboards of metrics from InfluxDB - -## Requirements - -Running OpenShift cluster - -## Role Variables - -``` -# Enable cluster metrics -use_cluster_metrics=true -``` - -## Dependencies - -None - -## Example Playbook - -TODO - -## Security Note -Opening up the read-only port exposes information about the running pods (such as namespace, pod name, labels, etc.) to unauthenticated clients. The requirement to open up this read-only port will be fixed in future versions. - -##License - -Apache License, Version 2.0 - -## Author Information - -Diego Castro (diego.castro@getupcloud.com) diff --git a/roles/openshift_cluster_metrics/files/cluster-metrics/grafana.yaml b/roles/openshift_cluster_metrics/files/cluster-metrics/grafana.yaml deleted file mode 100644 index bff422efc..000000000 --- a/roles/openshift_cluster_metrics/files/cluster-metrics/grafana.yaml +++ /dev/null @@ -1,53 +0,0 @@ -apiVersion: "v1" -kind: "List" -items: -  - -    apiVersion: "v1" -    kind: "Service" -    metadata: -      labels: -        provider: "fabric8" -        component: "grafana" -      name: "grafana" -    spec: -      ports: -        - -          port: 80 -          targetPort: "http" -      selector: -        provider: "fabric8" -        component: "grafana" -  - -    apiVersion: "v1" -    kind: "ReplicationController" -    metadata: -      labels: -        provider: "fabric8" -        component: "grafana" -      name: "grafana" -    spec: -      replicas: 1 -      selector: -        provider: "fabric8" -        component: "grafana" -      template: -        metadata: -          labels: -            provider: "fabric8" -            component: "grafana" -        spec: -          containers: -            - -              env: -                - -                  name: "INFLUXDB_SERVICE_NAME" -                  value: "INFLUXDB_MONITORING" -                - -                  name: "GRAFANA_DEFAULT_DASHBOARD" -                  value: "/dashboard/file/kubernetes.json" -              image: "fabric8/grafana:1.9.1_2" -              name: "grafana" -              ports: -                - -                  containerPort: 3000 -                  name: "http"
\ No newline at end of file diff --git a/roles/openshift_cluster_metrics/files/cluster-metrics/heapster-serviceaccount.yaml b/roles/openshift_cluster_metrics/files/cluster-metrics/heapster-serviceaccount.yaml deleted file mode 100644 index 1de2ad699..000000000 --- a/roles/openshift_cluster_metrics/files/cluster-metrics/heapster-serviceaccount.yaml +++ /dev/null @@ -1,4 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: -  name: heapster
\ No newline at end of file diff --git a/roles/openshift_cluster_metrics/files/cluster-metrics/heapster.yaml b/roles/openshift_cluster_metrics/files/cluster-metrics/heapster.yaml deleted file mode 100644 index 83e314074..000000000 --- a/roles/openshift_cluster_metrics/files/cluster-metrics/heapster.yaml +++ /dev/null @@ -1,30 +0,0 @@ -apiVersion: "v1" -kind: "List" -items: -  - -    apiVersion: "v1" -    kind: "ReplicationController" -    metadata: -      labels: -        provider: "fabric8" -        component: "heapster" -      name: "heapster" -    spec: -      replicas: 1 -      selector: -        provider: "fabric8" -        component: "heapster" -      template: -        metadata: -          labels: -            provider: "fabric8" -            component: "heapster" -        spec: -          containers: -            - -              args: -                - "-source=kubernetes:https://kubernetes.default.svc.cluster.local?auth=&insecure=true&useServiceAccount=true" -                - "-sink=influxdb:http://influxdb-monitoring.default.svc.cluster.local:8086" -              image: "kubernetes/heapster:V0.14.2" -              name: "heapster" -          serviceAccount: "heapster"
\ No newline at end of file diff --git a/roles/openshift_cluster_metrics/files/cluster-metrics/influxdb.yaml b/roles/openshift_cluster_metrics/files/cluster-metrics/influxdb.yaml deleted file mode 100644 index 6f67c3d7c..000000000 --- a/roles/openshift_cluster_metrics/files/cluster-metrics/influxdb.yaml +++ /dev/null @@ -1,67 +0,0 @@ -apiVersion: "v1" -kind: "List" -items: -  - -    apiVersion: "v1" -    kind: "Service" -    metadata: -      labels: -        provider: "fabric8" -        component: "influxdb-monitoring" -      name: "influxdb-monitoring" -    spec: -      ports: -        - -          port: 8086 -          targetPort: "http" -      selector: -        provider: "fabric8" -        component: "influxdb-monitoring" -  - -    apiVersion: "v1" -    kind: "ReplicationController" -    metadata: -      labels: -        provider: "fabric8" -        component: "influxdb-monitoring" -      name: "influxdb-monitoring" -    spec: -      replicas: 1 -      selector: -        provider: "fabric8" -        component: "influxdb-monitoring" -      template: -        metadata: -          labels: -            provider: "fabric8" -            component: "influxdb-monitoring" -        spec: -          containers: -            - -              env: -                - -                  name: "PRE_CREATE_DB" -                  value: "k8s;grafana" -              image: "fabric8/influxdb:0.8.8" -              name: "influxdb" -              ports: -                - -                  containerPort: 8090 -                  name: "raft" -                - -                  containerPort: 8099 -                  name: "protobuf" -                - -                  containerPort: 8083 -                  name: "admin" -                - -                  containerPort: 8086 -                  name: "http" -              volumeMounts: -                - -                  mountPath: "/data" -                  name: "influxdb-data" -          volumes: -            - -              emptyDir: -              name: "influxdb-data"
\ No newline at end of file diff --git a/roles/openshift_cluster_metrics/tasks/main.yml b/roles/openshift_cluster_metrics/tasks/main.yml deleted file mode 100644 index 1fc8a074a..000000000 --- a/roles/openshift_cluster_metrics/tasks/main.yml +++ /dev/null @@ -1,49 +0,0 @@ ---- - -- name: Install cluster metrics templates -  copy: -    src: cluster-metrics -    dest: /etc/origin/ - -- name: Create InfluxDB Services -  command: > -    {{ openshift.common.client_binary }} create -f -    /etc/origin/cluster-metrics/influxdb.yaml -  register: oex_influxdb_services -  failed_when: "'already exists' not in oex_influxdb_services.stderr and oex_influxdb_services.rc != 0" -  changed_when: false - -- name: Create Heapster Service Account -  command: > -    {{ openshift.common.client_binary }} create -f -    /etc/origin/cluster-metrics/heapster-serviceaccount.yaml -  register: oex_heapster_serviceaccount -  failed_when: "'already exists' not in oex_heapster_serviceaccount.stderr and oex_heapster_serviceaccount.rc != 0" -  changed_when: false - -- name: Add cluster-reader role to Heapster -  command: > -    {{ openshift.common.admin_binary }} policy -    add-cluster-role-to-user -    cluster-reader -    system:serviceaccount:default:heapster -  register: oex_cluster_header_role -  failed_when: "'already exists' not in oex_cluster_header_role.stderr and oex_cluster_header_role.rc != 0" -  changed_when: false - -- name: Create Heapster Services -  command: > -    {{ openshift.common.client_binary }} create -f -    /etc/origin/cluster-metrics/heapster.yaml -  register: oex_heapster_services -  failed_when: "'already exists' not in oex_heapster_services.stderr and oex_heapster_services.rc != 0" -  changed_when: false - -- name: Create Grafana Services -  command: > -    {{ openshift.common.client_binary }} create -f -    /etc/origin/cluster-metrics/grafana.yaml -  register: oex_grafana_services -  failed_when: "'already exists' not in oex_grafana_services.stderr and oex_grafana_services.rc != 0" -  changed_when: false - diff --git a/roles/openshift_examples/README.md b/roles/openshift_examples/README.md index 6ddbe7017..8cc479c73 100644 --- a/roles/openshift_examples/README.md +++ b/roles/openshift_examples/README.md @@ -25,7 +25,7 @@ Role Variables  |-------------------------------------|-----------------------------------------------------|------------------------------------------|  | openshift_examples_load_centos      | true when openshift_deployment_typenot 'enterprise' | Load centos image streams                |  | openshift_examples_load_rhel        | true if openshift_deployment_type is 'enterprise'   | Load rhel image streams                  | -| openshift_examples_load_db_templates| true                                                | Loads databcase templates                | +| openshift_examples_load_db_templates| true                                                | Loads database templates                 |  | openshift_examples_load_quickstarts | true                                                | Loads quickstarts ie: nodejs, rails, etc |  | openshift_examples_load_xpaas       | false                                               | Loads xpass streams and templates        | diff --git a/roles/openshift_examples/examples-sync.sh b/roles/openshift_examples/examples-sync.sh index 7b4a8440e..ef2da946a 100755 --- a/roles/openshift_examples/examples-sync.sh +++ b/roles/openshift_examples/examples-sync.sh @@ -29,6 +29,7 @@ unzip cakephp-ex-master.zip  unzip application-templates-master.zip  cp origin-master/examples/db-templates/* ${EXAMPLES_BASE}/db-templates/  cp origin-master/examples/jenkins/jenkins-*template.json ${EXAMPLES_BASE}/quickstart-templates/ +cp origin-master/examples/jenkins/pipeline/jenkinstemplate.json ${EXAMPLES_BASE}/quickstart-templates/  cp origin-master/examples/image-streams/* ${EXAMPLES_BASE}/image-streams/  cp django-ex-master/openshift/templates/* ${EXAMPLES_BASE}/quickstart-templates/  cp rails-ex-master/openshift/templates/* ${EXAMPLES_BASE}/quickstart-templates/ diff --git a/roles/openshift_examples/files/examples/v1.3/image-streams/image-streams-centos7.json b/roles/openshift_examples/files/examples/v1.3/image-streams/image-streams-centos7.json index d971e5e7a..8aedf80fe 100644 --- a/roles/openshift_examples/files/examples/v1.3/image-streams/image-streams-centos7.json +++ b/roles/openshift_examples/files/examples/v1.3/image-streams/image-streams-centos7.json @@ -92,7 +92,7 @@              },              "from": {                "kind": "ImageStreamTag", -              "name": "0.10" +              "name": "4"              }            },            { @@ -109,6 +109,21 @@                "kind": "DockerImage",                "name": "openshift/nodejs-010-centos7:latest"              } +          }, +          { +            "name": "4", +            "annotations": { +              "description": "Build and run NodeJS 4 applications", +              "iconClass": "icon-nodejs", +              "tags": "builder,nodejs", +              "supports":"nodejs:4,nodejs", +              "version": "4", +              "sampleRepo": "https://github.com/openshift/nodejs-ex.git" +            }, +            "from": { +              "kind": "DockerImage", +              "name": "centos/nodejs-4-centos7:latest" +            }            }          ]        } diff --git a/roles/openshift_examples/files/examples/v1.3/quickstart-templates/dancer-mysql.json b/roles/openshift_examples/files/examples/v1.3/quickstart-templates/dancer-mysql.json index bc9c8e8fd..cc7920b7d 100644 --- a/roles/openshift_examples/files/examples/v1.3/quickstart-templates/dancer-mysql.json +++ b/roles/openshift_examples/files/examples/v1.3/quickstart-templates/dancer-mysql.json @@ -207,9 +207,9 @@                    }                  ],                  "resources": { -		      "limits": { -			  "memory": "${MEMORY_LIMIT}" -		      } +                  "limits": { +                    "memory": "${MEMORY_LIMIT}" +                  }                  }                }              ] diff --git a/roles/openshift_examples/files/examples/v1.3/quickstart-templates/django-postgresql.json b/roles/openshift_examples/files/examples/v1.3/quickstart-templates/django-postgresql.json index 0b7fd7cab..7d1dea11b 100644 --- a/roles/openshift_examples/files/examples/v1.3/quickstart-templates/django-postgresql.json +++ b/roles/openshift_examples/files/examples/v1.3/quickstart-templates/django-postgresql.json @@ -83,7 +83,7 @@              "from": {                "kind": "ImageStreamTag",                "namespace": "${NAMESPACE}", -              "name": "python:3.4" +              "name": "python:3.5"              },              "env": [                { @@ -273,7 +273,7 @@                "from": {                  "kind": "ImageStreamTag",                  "namespace": "${NAMESPACE}", -                "name": "postgresql:9.4" +                "name": "postgresql:9.5"                }              }            }, diff --git a/roles/openshift_examples/files/examples/v1.3/quickstart-templates/django.json b/roles/openshift_examples/files/examples/v1.3/quickstart-templates/django.json index 9e84e27e1..1c2e40d70 100644 --- a/roles/openshift_examples/files/examples/v1.3/quickstart-templates/django.json +++ b/roles/openshift_examples/files/examples/v1.3/quickstart-templates/django.json @@ -83,7 +83,7 @@              "from": {                "kind": "ImageStreamTag",                "namespace": "${NAMESPACE}", -              "name": "python:3.4" +              "name": "python:3.5"              },              "env": [                { diff --git a/roles/openshift_examples/files/examples/v1.3/quickstart-templates/jenkinstemplate.json b/roles/openshift_examples/files/examples/v1.3/quickstart-templates/jenkinstemplate.json new file mode 100644 index 000000000..325663313 --- /dev/null +++ b/roles/openshift_examples/files/examples/v1.3/quickstart-templates/jenkinstemplate.json @@ -0,0 +1,255 @@ +{ +  "kind": "Template", +  "apiVersion": "v1", +  "metadata": { +    "name": "jenkins", +    "creationTimestamp": null, +    "annotations": { +      "description": "Jenkins service, without persistent storage. WARNING: Any data stored will be lost upon pod destruction. Only use this template for testing", +      "iconClass": "icon-jenkins", +      "tags": "instant-app,jenkins" +    } +  }, +  "objects": [ +    { +      "kind": "Route", +      "apiVersion": "v1", +      "metadata": { +        "name": "jenkins", +        "creationTimestamp": null +      }, +      "spec": { +        "to": { +          "kind": "Service", +          "name": "${JENKINS_SERVICE_NAME}" +        }, +        "tls": { +          "termination": "edge", +          "insecureEdgeTerminationPolicy": "Redirect", +          "certificate": "-----BEGIN CERTIFICATE-----\nMIIDIjCCAgqgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBoTELMAkGA1UEBhMCVVMx\nCzAJBgNVBAgMAlNDMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0Rl\nZmF1bHQgQ29tcGFueSBMdGQxEDAOBgNVBAsMB1Rlc3QgQ0ExGjAYBgNVBAMMEXd3\ndy5leGFtcGxlY2EuY29tMSIwIAYJKoZIhvcNAQkBFhNleGFtcGxlQGV4YW1wbGUu\nY29tMB4XDTE1MDExMjE0MTk0MVoXDTE2MDExMjE0MTk0MVowfDEYMBYGA1UEAwwP\nd3d3LmV4YW1wbGUuY29tMQswCQYDVQQIDAJTQzELMAkGA1UEBhMCVVMxIjAgBgkq\nhkiG9w0BCQEWE2V4YW1wbGVAZXhhbXBsZS5jb20xEDAOBgNVBAoMB0V4YW1wbGUx\nEDAOBgNVBAsMB0V4YW1wbGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMrv\ngu6ZTTefNN7jjiZbS/xvQjyXjYMN7oVXv76jbX8gjMOmg9m0xoVZZFAE4XyQDuCm\n47VRx5Qrf/YLXmB2VtCFvB0AhXr5zSeWzPwaAPrjA4ebG+LUo24ziS8KqNxrFs1M\nmNrQUgZyQC6XIe1JHXc9t+JlL5UZyZQC1IfaJulDAgMBAAGjDTALMAkGA1UdEwQC\nMAAwDQYJKoZIhvcNAQEFBQADggEBAFCi7ZlkMnESvzlZCvv82Pq6S46AAOTPXdFd\nTMvrh12E1sdVALF1P1oYFJzG1EiZ5ezOx88fEDTW+Lxb9anw5/KJzwtWcfsupf1m\nV7J0D3qKzw5C1wjzYHh9/Pz7B1D0KthQRATQCfNf8s6bbFLaw/dmiIUhHLtIH5Qc\nyfrejTZbOSP77z8NOWir+BWWgIDDB2//3AkDIQvT20vmkZRhkqSdT7et4NmXOX/j\njhPti4b2Fie0LeuvgaOdKjCpQQNrYthZHXeVlOLRhMTSk3qUczenkKTOhvP7IS9q\n+Dzv5hqgSfvMG392KWh5f8xXfJNs4W5KLbZyl901MeReiLrPH3w=\n-----END CERTIFICATE-----", +          "key": "-----BEGIN PRIVATE KEY-----\nMIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAMrvgu6ZTTefNN7j\njiZbS/xvQjyXjYMN7oVXv76jbX8gjMOmg9m0xoVZZFAE4XyQDuCm47VRx5Qrf/YL\nXmB2VtCFvB0AhXr5zSeWzPwaAPrjA4ebG+LUo24ziS8KqNxrFs1MmNrQUgZyQC6X\nIe1JHXc9t+JlL5UZyZQC1IfaJulDAgMBAAECgYEAnxOjEj/vrLNLMZE1Q9H7PZVF\nWdP/JQVNvQ7tCpZ3ZdjxHwkvf//aQnuxS5yX2Rnf37BS/TZu+TIkK4373CfHomSx\nUTAn2FsLmOJljupgGcoeLx5K5nu7B7rY5L1NHvdpxZ4YjeISrRtEPvRakllENU5y\ngJE8c2eQOx08ZSRE4TkCQQD7dws2/FldqwdjJucYijsJVuUdoTqxP8gWL6bB251q\nelP2/a6W2elqOcWId28560jG9ZS3cuKvnmu/4LG88vZFAkEAzphrH3673oTsHN+d\nuBd5uyrlnGjWjuiMKv2TPITZcWBjB8nJDSvLneHF59MYwejNNEof2tRjgFSdImFH\nmi995wJBAMtPjW6wiqRz0i41VuT9ZgwACJBzOdvzQJfHgSD9qgFb1CU/J/hpSRIM\nkYvrXK9MbvQFvG6x4VuyT1W8mpe1LK0CQAo8VPpffhFdRpF7psXLK/XQ/0VLkG3O\nKburipLyBg/u9ZkaL0Ley5zL5dFBjTV2Qkx367Ic2b0u9AYTCcgi2DsCQQD3zZ7B\nv7BOm7MkylKokY2MduFFXU0Bxg6pfZ7q3rvg8gqhUFbaMStPRYg6myiDiW/JfLhF\nTcFT4touIo7oriFJ\n-----END PRIVATE KEY-----", +          "caCertificate": "-----BEGIN CERTIFICATE-----\nMIIEFzCCAv+gAwIBAgIJALK1iUpF2VQLMA0GCSqGSIb3DQEBBQUAMIGhMQswCQYD\nVQQGEwJVUzELMAkGA1UECAwCU0MxFTATBgNVBAcMDERlZmF1bHQgQ2l0eTEcMBoG\nA1UECgwTRGVmYXVsdCBDb21wYW55IEx0ZDEQMA4GA1UECwwHVGVzdCBDQTEaMBgG\nA1UEAwwRd3d3LmV4YW1wbGVjYS5jb20xIjAgBgkqhkiG9w0BCQEWE2V4YW1wbGVA\nZXhhbXBsZS5jb20wHhcNMTUwMTEyMTQxNTAxWhcNMjUwMTA5MTQxNTAxWjCBoTEL\nMAkGA1UEBhMCVVMxCzAJBgNVBAgMAlNDMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkx\nHDAaBgNVBAoME0RlZmF1bHQgQ29tcGFueSBMdGQxEDAOBgNVBAsMB1Rlc3QgQ0Ex\nGjAYBgNVBAMMEXd3dy5leGFtcGxlY2EuY29tMSIwIAYJKoZIhvcNAQkBFhNleGFt\ncGxlQGV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nw2rK1J2NMtQj0KDug7g7HRKl5jbf0QMkMKyTU1fBtZ0cCzvsF4CqV11LK4BSVWaK\nrzkaXe99IVJnH8KdOlDl5Dh/+cJ3xdkClSyeUT4zgb6CCBqg78ePp+nN11JKuJlV\nIG1qdJpB1J5O/kCLsGcTf7RS74MtqMFo96446Zvt7YaBhWPz6gDaO/TUzfrNcGLA\nEfHVXkvVWqb3gqXUztZyVex/gtP9FXQ7gxTvJml7UkmT0VAFjtZnCqmFxpLZFZ15\n+qP9O7Q2MpsGUO/4vDAuYrKBeg1ZdPSi8gwqUP2qWsGd9MIWRv3thI2903BczDc7\nr8WaIbm37vYZAS9G56E4+wIDAQABo1AwTjAdBgNVHQ4EFgQUugLrSJshOBk5TSsU\nANs4+SmJUGwwHwYDVR0jBBgwFoAUugLrSJshOBk5TSsUANs4+SmJUGwwDAYDVR0T\nBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaMJ33zAMV4korHo5aPfayV3uHoYZ\n1ChzP3eSsF+FjoscpoNSKs91ZXZF6LquzoNezbfiihK4PYqgwVD2+O0/Ty7UjN4S\nqzFKVR4OS/6lCJ8YncxoFpTntbvjgojf1DEataKFUN196PAANc3yz8cWHF4uvjPv\nWkgFqbIjb+7D1YgglNyovXkRDlRZl0LD1OQ0ZWhd4Ge1qx8mmmanoBeYZ9+DgpFC\nj9tQAbS867yeOryNe7sEOIpXAAqK/DTu0hB6+ySsDfMo4piXCc2aA/eI2DCuw08e\nw17Dz9WnupZjVdwTKzDhFgJZMLDqn37HQnT6EemLFqbcR0VPEnfyhDtZIQ==\n-----END CERTIFICATE-----" +        } +      } +    }, +    { +      "kind": "DeploymentConfig", +      "apiVersion": "v1", +      "metadata": { +        "name": "${JENKINS_SERVICE_NAME}", +        "creationTimestamp": null +      }, +      "spec": { +        "strategy": { +          "type": "Recreate" +        }, +        "triggers": [ +          { +            "type": "ImageChange", +            "imageChangeParams": { +              "automatic": true, +              "containerNames": [ +                "jenkins" +              ], +              "from": { +                "kind": "ImageStreamTag", +                "name": "jenkins:1", +                "namespace": "openshift" +              } +            } +          }, +          { +            "type": "ConfigChange" +          } +        ], +        "replicas": 1, +        "selector": { +          "name": "${JENKINS_SERVICE_NAME}" +        }, +        "template": { +          "metadata": { +            "creationTimestamp": null, +            "labels": { +              "name": "${JENKINS_SERVICE_NAME}" +            } +          }, +          "spec": { +            "serviceAccountName": "${JENKINS_SERVICE_NAME}", +            "containers": [ +              { +                "name": "jenkins", +                "image": " ", +                "readinessProbe": { +                  "timeoutSeconds": 3, +                  "initialDelaySeconds": 3, +                  "httpGet": { +                    "path": "/login", +                    "port": 8080 +                  } +                }, +                "livenessProbe": { +                    "timeoutSeconds": 3, +                    "initialDelaySeconds": 120, +                    "httpGet": { +                        "path": "/login", +                        "port": 8080 +                    } +                }, +                "env": [ +                  { +                    "name": "JENKINS_PASSWORD", +                    "value": "${JENKINS_PASSWORD}" +                  }, +                  { +                    "name": "KUBERNETES_MASTER", +                    "value": "https://kubernetes.default:443" +                  }, +                  { +                    "name": "KUBERNETES_TRUST_CERTIFICATES", +                    "value": "true" +                  } +                ], +                "resources": { +                  "limits": { +                    "memory": "${MEMORY_LIMIT}" +                  } +                }, +                "volumeMounts": [ +                  { +                    "name": "${JENKINS_SERVICE_NAME}-data", +                    "mountPath": "/var/lib/jenkins" +                  } +                ], +                "terminationMessagePath": "/dev/termination-log", +                "imagePullPolicy": "IfNotPresent", +                "capabilities": {}, +                "securityContext": { +                  "capabilities": {}, +                  "privileged": false +                } +              } +            ], +            "volumes": [ +              { +                "name": "${JENKINS_SERVICE_NAME}-data", +                "emptyDir": { +                  "medium": "" +                } +              } +            ], +            "restartPolicy": "Always", +            "dnsPolicy": "ClusterFirst" +          } +        } +      } +    }, +    { +      "kind": "ServiceAccount", +        "apiVersion": "v1", +        "metadata": { +            "name": "${JENKINS_SERVICE_NAME}" +        } +    }, +    { +      "kind": "RoleBinding", +      "apiVersion": "v1", +      "metadata": { +          "name": "${JENKINS_SERVICE_NAME}_edit" +      }, +      "groupNames": null, +      "subjects": [ +          { +              "kind": "ServiceAccount", +              "name": "${JENKINS_SERVICE_NAME}" +          } +      ], +      "roleRef": { +          "name": "edit" +      } +    }, +    { +      "kind": "Service", +      "apiVersion": "v1", +      "metadata": { +        "name": "jenkins-jnlp", +        "creationTimestamp": null +      }, +      "spec": { +        "ports": [ +          { +            "name": "agent", +            "protocol": "TCP", +            "port": 50000, +            "targetPort": 50000, +            "nodePort": 0 +          } +        ], +        "selector": { +          "name": "${JENKINS_SERVICE_NAME}" +        }, +        "portalIP": "", +        "type": "ClusterIP", +        "sessionAffinity": "None" +      } +    }, +    { +       "kind": "Service", +       "apiVersion": "v1", +       "metadata": { +         "name": "${JENKINS_SERVICE_NAME}", +         "annotations": { +           "service.alpha.openshift.io/dependencies": "[{\"name\": \"jenkins-jnlp\", \"namespace\": \"\", \"kind\": \"Service\"}]", +           "service.openshift.io/infrastructure": "true" +         }, +         "creationTimestamp": null +       }, +       "spec": { +         "ports": [ +           { +             "name": "web", +             "protocol": "TCP", +             "port": 80, +             "targetPort": 8080, +             "nodePort": 0 +           } +         ], +         "selector": { +           "name": "${JENKINS_SERVICE_NAME}" +         }, +         "portalIP": "", +         "type": "ClusterIP", +         "sessionAffinity": "None" +       } +    } +  ], +  "parameters": [ +    { +      "name": "MEMORY_LIMIT", +      "displayName": "Memory Limit", +      "description": "Maximum amount of memory the container can use.", +      "value": "512Mi" +    }, +    { +      "name": "NAMESPACE", +      "displayName": "Namespace", +      "description": "The OpenShift Namespace where the ImageStream resides.", +      "value": "openshift" +    }, +    { +      "name": "JENKINS_SERVICE_NAME", +      "displayName": "Jenkins Service Name", +      "description": "The name of the OpenShift Service exposed for the Jenkins container.", +      "value": "jenkins" +    }, +    { +      "name": "JENKINS_PASSWORD", +      "displayName": "Jenkins Password", +      "description": "Password for the Jenkins user.", +      "generate": "expression", +      "value": "password" +    } +  ], +  "labels": { +    "template": "jenkins-ephemeral-template" +  } +} diff --git a/roles/openshift_examples/files/examples/v1.3/quickstart-templates/nodejs-mongodb.json b/roles/openshift_examples/files/examples/v1.3/quickstart-templates/nodejs-mongodb.json index b2b9f2478..6ab4a1781 100644 --- a/roles/openshift_examples/files/examples/v1.3/quickstart-templates/nodejs-mongodb.json +++ b/roles/openshift_examples/files/examples/v1.3/quickstart-templates/nodejs-mongodb.json @@ -83,7 +83,7 @@              "from": {                "kind": "ImageStreamTag",                "namespace": "${NAMESPACE}", -              "name": "nodejs:0.10" +              "name": "nodejs:4"              },              "env":  [                { @@ -271,7 +271,7 @@                "from": {                  "kind": "ImageStreamTag",                  "namespace": "${NAMESPACE}", -                "name": "mongodb:2.6" +                "name": "mongodb:3.2"                }              }            }, @@ -322,7 +322,7 @@                    "timeoutSeconds": 1,                    "initialDelaySeconds": 3,                    "exec": { -                    "command": [ "/bin/sh", "-i", "-c", "mongostat --host 127.0.0.1 -u admin -p ${DATABASE_ADMIN_PASSWORD} -n 1 --noheaders"] +                    "command": [ "/bin/sh", "-i", "-c", "mongo 127.0.0.1:27017/$MONGODB_DATABASE -u $MONGODB_USER -p $MONGODB_PASSWORD --eval=\"quit()\""]                    }                  },                  "livenessProbe": { diff --git a/roles/openshift_examples/files/examples/v1.3/quickstart-templates/nodejs.json b/roles/openshift_examples/files/examples/v1.3/quickstart-templates/nodejs.json index 08c7d3106..ec262e4e8 100644 --- a/roles/openshift_examples/files/examples/v1.3/quickstart-templates/nodejs.json +++ b/roles/openshift_examples/files/examples/v1.3/quickstart-templates/nodejs.json @@ -83,7 +83,7 @@              "from": {                "kind": "ImageStreamTag",                "namespace": "${NAMESPACE}", -              "name": "nodejs:0.10" +              "name": "nodejs:4"              },              "env":  [                { diff --git a/roles/openshift_examples/files/examples/v1.3/quickstart-templates/rails-postgresql.json b/roles/openshift_examples/files/examples/v1.3/quickstart-templates/rails-postgresql.json index e64e2feeb..50d60f2bb 100644 --- a/roles/openshift_examples/files/examples/v1.3/quickstart-templates/rails-postgresql.json +++ b/roles/openshift_examples/files/examples/v1.3/quickstart-templates/rails-postgresql.json @@ -83,7 +83,7 @@              "from": {                "kind": "ImageStreamTag",                "namespace": "${NAMESPACE}", -              "name": "ruby:2.2" +              "name": "ruby:2.3"              },              "env": [                { @@ -300,7 +300,7 @@                "from": {                  "kind": "ImageStreamTag",                  "namespace": "${NAMESPACE}", -                "name": "postgresql:9.4" +                "name": "postgresql:9.5"                }              }            }, diff --git a/roles/openshift_examples/tasks/main.yml b/roles/openshift_examples/tasks/main.yml index 7ea39f51e..8d2248578 100644 --- a/roles/openshift_examples/tasks/main.yml +++ b/roles/openshift_examples/tasks/main.yml @@ -1,9 +1,46 @@  --- -- name: Copy openshift examples -  copy: -    src: "examples/{{ content_version }}/" +###################################################################### +# Copying Examples +# +# We used to use the copy module to transfer the openshift examples to +# the remote. Then it started taking more than a minute to transfer +# the files. As noted in the module: +# +#   "The 'copy' module recursively copy facility does not scale to +#   lots (>hundreds) of files." +# +# The `synchronize` module is suggested as an alternative, we can't +# use it either due to changes introduced in Ansible 2.x. +- name: Create local temp dir for OpenShift examples copy +  local_action: command mktemp -d /tmp/openshift-ansible-XXXXXXX +  become: False +  register: copy_examples_mktemp +  run_once: True + +- name: Create tar of OpenShift examples +  local_action: command tar -C "{{ role_path }}/files/examples/{{ content_version }}/" -cvf "{{ copy_examples_mktemp.stdout }}/openshift-examples.tar" . +  become: False +  register: copy_examples_tar + +- name: Create the remote OpenShift examples directory +  file: +    dest: "{{ examples_base }}" +    state: directory +    mode: 0755 + +- name: Unarchive the OpenShift examples on the remote +  unarchive: +    src: "{{ copy_examples_mktemp.stdout }}/openshift-examples.tar"      dest: "{{ examples_base }}/" +- name: Cleanup the OpenShift Examples temp dir +  become: False +  local_action: file dest="{{ copy_examples_mktemp.stdout }}" state=absent + +# Done copying examples +###################################################################### +# Begin image streams +  - name: Modify registry paths if registry_url is not registry.access.redhat.com    shell: >      find {{ examples_base }} -type f | xargs -n 1 sed -i 's|registry.access.redhat.com|{{ registry_host | quote }}|g' diff --git a/roles/openshift_facts/library/openshift_facts.py b/roles/openshift_facts/library/openshift_facts.py index 54bdbc775..659f4eba6 100755 --- a/roles/openshift_facts/library/openshift_facts.py +++ b/roles/openshift_facts/library/openshift_facts.py @@ -480,23 +480,6 @@ def set_selectors(facts):      return facts -def set_metrics_facts_if_unset(facts): -    """ Set cluster metrics facts if not already present in facts dict -            dict: the facts dict updated with the generated cluster metrics facts if -            missing -        Args: -            facts (dict): existing facts -        Returns: -            dict: the facts dict updated with the generated cluster metrics -            facts if they were not already present - -    """ -    if 'common' in facts: -        if 'use_cluster_metrics' not in facts['common']: -            use_cluster_metrics = False -            facts['common']['use_cluster_metrics'] = use_cluster_metrics -    return facts -  def set_dnsmasq_facts_if_unset(facts):      """ Set dnsmasq facts if not already present in facts      Args: @@ -1674,7 +1657,6 @@ class OpenShiftFacts(object):          facts = set_nuage_facts_if_unset(facts)          facts = set_node_schedulability(facts)          facts = set_selectors(facts) -        facts = set_metrics_facts_if_unset(facts)          facts = set_identity_providers_if_unset(facts)          facts = set_sdn_facts_if_unset(facts, self.system_facts)          facts = set_deployment_facts_if_unset(facts) diff --git a/roles/openshift_facts/tasks/main.yml b/roles/openshift_facts/tasks/main.yml index c3723672d..4dbbd7f45 100644 --- a/roles/openshift_facts/tasks/main.yml +++ b/roles/openshift_facts/tasks/main.yml @@ -1,9 +1,4 @@  --- -- name: Verify Ansible version is greater than or equal to 1.9.4 -  fail: -    msg: "Unsupported ansible version: {{ ansible_version }} found" -  when: not ansible_version.full | version_compare('1.9.4', 'ge') -  - name: Detecting Operating System    stat:      path: /run/ostree-booted diff --git a/roles/openshift_hosted/tasks/registry/registry.yml b/roles/openshift_hosted/tasks/registry/registry.yml index a242ce30f..a1edef132 100644 --- a/roles/openshift_hosted/tasks/registry/registry.yml +++ b/roles/openshift_hosted/tasks/registry/registry.yml @@ -9,7 +9,7 @@    when: openshift.hosted.registry.replicas | default(none) is none  - set_fact: -    replicas: "{{ openshift.hosted.registry.replicas | default(((openshift_hosted_registry_nodes_json.stdout | from_json)['items'] | length) if openshift.hosted.registry.storage.kind | default(none) is not none else 1) }}" +    replicas: "{{ openshift.hosted.registry.replicas | default(((openshift_hosted_registry_nodes_json.stdout | default('{\"items\":[]}') | from_json)['items'] | length) if openshift.hosted.registry.storage.kind | default(none) is not none else 1) }}"  - name: Create OpenShift registry    command: > diff --git a/roles/openshift_hosted/tasks/registry/storage/object_storage.yml b/roles/openshift_hosted/tasks/registry/storage/object_storage.yml index 9db67ecc6..7b1b3f6ff 100644 --- a/roles/openshift_hosted/tasks/registry/storage/object_storage.yml +++ b/roles/openshift_hosted/tasks/registry/storage/object_storage.yml @@ -24,10 +24,10 @@    failed_when: false  - set_fact: -    registry_config: "{{ lookup('template', '../templates/registry_config.j2') | b64encode }}" +    registry_config: "{{ lookup('template', 'registry_config.j2') | b64encode }}"  - set_fact: -    registry_config_secret: "{{ lookup('template', '../templates/registry_config_secret.j2') | from_yaml }}" +    registry_config_secret: "{{ lookup('template', 'registry_config_secret.j2') | from_yaml }}"  - set_fact:      same_storage_provider: "{{ (secrets.stdout|from_json)['metadata']['annotations']['provider'] | default(none) == openshift.hosted.registry.storage.provider }}" @@ -111,4 +111,4 @@      --config={{ openshift_hosted_kubeconfig }}      --namespace={{ openshift.hosted.registry.namespace | default('default') }}      deploy dc/docker-registry --latest -  when: secrets.rc == 0 and update_config_secret.rc == 0 and same_storage_provider | bool +  when: secrets.rc == 0 and not update_config_secret | skipped and update_config_secret.rc == 0 and same_storage_provider | bool diff --git a/roles/openshift_hosted/tasks/registry/storage/registry_config.j2 b/roles/openshift_hosted/tasks/registry/storage/registry_config.j2 new file mode 120000 index 000000000..f3e82ad4f --- /dev/null +++ b/roles/openshift_hosted/tasks/registry/storage/registry_config.j2 @@ -0,0 +1 @@ +../../../templates/registry_config.j2
\ No newline at end of file diff --git a/roles/openshift_hosted/tasks/registry/storage/registry_config_secret.j2 b/roles/openshift_hosted/tasks/registry/storage/registry_config_secret.j2 new file mode 120000 index 000000000..b9e82c1ea --- /dev/null +++ b/roles/openshift_hosted/tasks/registry/storage/registry_config_secret.j2 @@ -0,0 +1 @@ +../../../templates/registry_config_secret.j2
\ No newline at end of file diff --git a/roles/openshift_hosted/tasks/router/router.yml b/roles/openshift_hosted/tasks/router/router.yml index c011db762..7f3731c7d 100644 --- a/roles/openshift_hosted/tasks/router/router.yml +++ b/roles/openshift_hosted/tasks/router/router.yml @@ -9,10 +9,15 @@      module: slurp      src: "{{ item }}"    register: openshift_router_certificate_output +  # Defaulting dictionary keys to none to avoid deprecation warnings +  # (future fatal errors) during template evaluation. Dictionary keys +  # won't be accessed unless openshift_hosted_router_certificate is +  # defined and has all keys (certfile, keyfile, cafile) which we +  # check above.    with_items: -  - "{{ openshift_hosted_router_certificate.certfile }}" -  - "{{ openshift_hosted_router_certificate.keyfile }}" -  - "{{ openshift_hosted_router_certificate.cafile }}" +  - "{{ (openshift_hosted_router_certificate | default({'certfile':none})).certfile }}" +  - "{{ (openshift_hosted_router_certificate | default({'keyfile':none})).keyfile }}" +  - "{{ (openshift_hosted_router_certificate | default({'cafile':none})).cafile }}"    when: openshift_hosted_router_certificate is defined  - name: Persist certificate contents @@ -27,7 +32,7 @@      content: "{{ openshift.hosted.router.certificate.contents }}"      dest: "{{ openshift_master_config_dir }}/openshift-router.pem"      mode: 0600 -  when: openshift.hosted.router.certificate | default(none) is not none +  when: "'certificate' in openshift.hosted.router and 'contents' in openshift.hosted.router.certificate"  - name: Retrieve list of openshift nodes matching router selector    command: > @@ -39,7 +44,7 @@    when: openshift.hosted.router.replicas | default(none) is none  - set_fact: -    replicas: "{{ openshift.hosted.router.replicas | default((openshift_hosted_router_nodes_json.stdout | from_json)['items'] | length) }}" +    replicas: "{{ openshift.hosted.router.replicas | default((openshift_hosted_router_nodes_json.stdout | default('{\"items\":[]}') | from_json)['items'] | length) }}"  - name: Create OpenShift router    command: > @@ -48,7 +53,7 @@      {% if replicas > 1 -%}      --replicas={{ replicas }}      {% endif -%} -    {% if openshift.hosted.router.certificate | default(none) is not none -%} +    {% if 'certificate' in openshift.hosted.router and 'contents' in openshift.hosted.router.certificate -%}      --default-cert={{ openshift_master_config_dir }}/openshift-router.pem      {% endif -%}      --namespace={{ openshift.hosted.router.namespace | default('default') }} diff --git a/roles/openshift_master/meta/main.yml b/roles/openshift_master/meta/main.yml index 0a69b3eef..be70d9102 100644 --- a/roles/openshift_master/meta/main.yml +++ b/roles/openshift_master/meta/main.yml @@ -4,7 +4,7 @@ galaxy_info:    description: Master    company: Red Hat, Inc.    license: Apache License, Version 2.0 -  min_ansible_version: 1.7 +  min_ansible_version: 2.1    platforms:    - name: EL      versions: @@ -13,8 +13,7 @@ galaxy_info:    - cloud  dependencies:  - role: openshift_clock -- role: openshift_docker -- role: openshift_cli +- role: openshift_master_certificates  - role: openshift_cloud_provider  - role: openshift_builddefaults  - role: openshift_master_facts diff --git a/roles/openshift_master/tasks/main.yml b/roles/openshift_master/tasks/main.yml index 7a80ed8e3..0b87ae48c 100644 --- a/roles/openshift_master/tasks/main.yml +++ b/roles/openshift_master/tasks/main.yml @@ -30,6 +30,8 @@  - name: Pull master image    command: >      docker pull {{ openshift.master.master_image }}:{{ openshift_image_tag }} +  register: pull_result +  changed_when: "'Downloaded newer image' in pull_result.stdout"    when: openshift.common.is_containerized | bool  - name: Create openshift.common.data_dir @@ -210,6 +212,7 @@    until: api_available_output.stdout == 'ok'    retries: 120    delay: 1 +  run_once: true    changed_when: false    when: openshift_master_ha | bool and openshift.master.cluster_method == 'native' and master_api_service_status_changed | bool diff --git a/roles/openshift_master_ca/README.md b/roles/openshift_master_ca/README.md deleted file mode 100644 index 5b2d3601b..000000000 --- a/roles/openshift_master_ca/README.md +++ /dev/null @@ -1,34 +0,0 @@ -OpenShift Master CA -======================== - -TODO - -Requirements ------------- - -TODO - -Role Variables --------------- - -TODO - -Dependencies ------------- - -TODO - -Example Playbook ----------------- - -TODO - -License -------- - -Apache License Version 2.0 - -Author Information ------------------- - -Jason DeTiberus (jdetiber@redhat.com) diff --git a/roles/openshift_master_ca/tasks/main.yml b/roles/openshift_master_ca/tasks/main.yml deleted file mode 100644 index ae99467f0..000000000 --- a/roles/openshift_master_ca/tasks/main.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- - -- name: Install the base package for admin tooling -  action: "{{ ansible_pkg_mgr }} name={{ openshift.common.service_type }}{{ openshift_pkg_version | default('') | oo_image_tag_to_rpm_version(include_dash=True) }} state=present" -  when: not openshift.common.is_containerized | bool -  register: install_result - -- name: Reload generated facts -  openshift_facts: -  when: install_result | changed - -- name: Create openshift_master_config_dir if it doesn't exist -  file: -    path: "{{ openshift_master_config_dir }}" -    state: directory - -- name: Create the master certificates if they do not already exist -  command: > -    {{ openshift.common.admin_binary }} create-master-certs -      --hostnames={{ master_hostnames | join(',') }} -      --master={{ openshift.master.api_url }} -      --public-master={{ openshift.master.public_api_url }} -      --cert-dir={{ openshift_master_config_dir }} --overwrite=false -  when: master_certs_missing | bool diff --git a/roles/openshift_master_ca/vars/main.yml b/roles/openshift_master_ca/vars/main.yml deleted file mode 100644 index 1f6af808c..000000000 --- a/roles/openshift_master_ca/vars/main.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -openshift_master_config_dir: "{{ openshift.common.config_base }}/master" -openshift_master_ca_cert: "{{ openshift_master_config_dir }}/ca.crt" -openshift_master_ca_key: "{{ openshift_master_config_dir }}/ca.key" -openshift_master_ca_serial: "{{ openshift_master_config_dir }}/ca.serial.txt" diff --git a/roles/openshift_master_certificates/README.md b/roles/openshift_master_certificates/README.md index ba3d5f28c..a80d47040 100644 --- a/roles/openshift_master_certificates/README.md +++ b/roles/openshift_master_certificates/README.md @@ -1,27 +1,44 @@  OpenShift Master Certificates  ======================== -TODO +This role determines if OpenShift master certificates must be created, delegates certificate creation to the `openshift_ca_host` and then deploys those certificates to master hosts which this role is being applied to. If this role is applied to the `openshift_ca_host`, certificate deployment will be skipped.  Requirements  ------------ -TODO -  Role Variables  -------------- -TODO +From `openshift_ca`: + +| Name                                  | Default value                                                             | Description                                                                                                                   | +|---------------------------------------|---------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------| +| openshift_ca_host                     | None (Required)                                                           | The hostname of the system where the OpenShift CA will be (or has been) created.                                              | + +From this role: + +| Name                                  | Default value                                                             | Description                                                                                                                   | +|---------------------------------------|---------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------| +| openshift_generated_configs_dir       | `{{ openshift.common.config_base }}/generated-configs`                    | Directory in which per-master generated config directories will be created on the `openshift_ca_host`.                        | +| openshift_master_cert_subdir          | `master-{{ openshift.common.hostname }}`                                  | Directory within `openshift_generated_configs_dir` where per-master configurations will be placed on the `openshift_ca_host`. | +| openshift_master_config_dir           | `{{ openshift.common.config_base }}/master`                               | Master configuration directory in which certificates will be deployed on masters.                                             | +| openshift_master_generated_config_dir | `{{ openshift_generated_configs_dir }}/{{ openshift_master_cert_subdir }` | Full path to the per-master generated config directory.                                                                       |  Dependencies  ------------ -TODO +* openshift_ca  Example Playbook  ---------------- -TODO +``` +- name: Create OpenShift Master Certificates +  hosts: masters +  roles: +  - role: openshift_master_certificates +    openshift_ca_host: master1.example.com +```  License  ------- diff --git a/roles/openshift_master_certificates/meta/main.yml b/roles/openshift_master_certificates/meta/main.yml index fd7b73b0f..dd19c8ded 100644 --- a/roles/openshift_master_certificates/meta/main.yml +++ b/roles/openshift_master_certificates/meta/main.yml @@ -1,10 +1,10 @@  ---  galaxy_info:    author: Jason DeTiberus -  description: +  description: OpenShift Master Certificates    company: Red Hat, Inc.    license: Apache License, Version 2.0 -  min_ansible_version: 1.8 +  min_ansible_version: 2.1    platforms:    - name: EL      versions: @@ -13,4 +13,4 @@ galaxy_info:    - cloud    - system  dependencies: -- { role: openshift_master_ca } +- role: openshift_ca diff --git a/roles/openshift_master_certificates/tasks/main.yml b/roles/openshift_master_certificates/tasks/main.yml index 394f9d381..6fb5830cf 100644 --- a/roles/openshift_master_certificates/tasks/main.yml +++ b/roles/openshift_master_certificates/tasks/main.yml @@ -1,38 +1,123 @@  --- +- set_fact: +    openshift_master_certs_no_etcd: +    - admin.crt +    - master.kubelet-client.crt +    - "{{ 'master.proxy-client.crt' if openshift.common.version_gte_3_1_or_1_1 else omit }}" +    - master.server.crt +    - openshift-master.crt +    - openshift-registry.crt +    - openshift-router.crt +    - etcd.server.crt +    openshift_master_certs_etcd: +    - master.etcd-client.crt + +- set_fact: +    openshift_master_certs: "{{ (openshift_master_certs_no_etcd | union(openshift_master_certs_etcd )) if openshift_master_etcd_hosts | length > 0 else openshift_master_certs_no_etcd }}" + +- name: Check status of master certificates +  stat: +    path: "{{ openshift_master_config_dir }}/{{ item }}" +  with_items: +  - "{{ openshift_master_certs }}" +  register: g_master_cert_stat_result + +- set_fact: +    master_certs_missing: "{{ False in (g_master_cert_stat_result.results +                              | oo_collect(attribute='stat.exists') +                              | list) }}" +  - name: Ensure the generated_configs directory present    file: -    path: "{{ openshift_generated_configs_dir }}/{{ item.master_cert_subdir }}" +    path: "{{ openshift_master_generated_config_dir }}"      state: directory      mode: 0700 -  with_items: "{{ masters_needing_certs | default([]) }}" +  when: master_certs_missing | bool +  delegate_to: "{{ openshift_ca_host }}"  - file: -    src: "{{ openshift_master_config_dir }}/{{ item.1 }}" -    dest: "{{ openshift_generated_configs_dir }}/{{ item.0.master_cert_subdir }}/{{ item.1 }}" +    src: "{{ openshift_master_config_dir }}/{{ item }}" +    dest: "{{ openshift_master_generated_config_dir }}/{{ item }}"      state: hard -  with_nested: -  - "{{ masters_needing_certs | default([]) }}" -  - -    - ca.crt -    - ca.key -    - ca.serial.txt +  with_items: +  - ca.crt +  - ca.key +  - ca.serial.txt +  when: master_certs_missing | bool +  delegate_to: "{{ openshift_ca_host }}"  - name: Create the master certificates if they do not already exist    command: >      {{ openshift.common.admin_binary }} create-master-certs -      --hostnames={{ item.openshift.common.all_hostnames | join(',') }} -      --master={{ item.openshift.master.api_url }} -      --public-master={{ item.openshift.master.public_api_url }} -      --cert-dir={{ openshift_generated_configs_dir }}/{{ item.master_cert_subdir }} +      --hostnames={{ openshift.common.all_hostnames | join(',') }} +      --master={{ openshift.master.api_url }} +      --public-master={{ openshift.master.public_api_url }} +      --cert-dir={{ openshift_master_generated_config_dir }}        --overwrite=false -  when: item.master_certs_missing | bool -  with_items: "{{ masters_needing_certs | default([]) }}" +  when: master_certs_missing | bool +  delegate_to: "{{ openshift_ca_host }}"  - file: -    src: "{{ openshift_master_config_dir }}/{{ item.1 }}" -    dest: "{{ openshift_generated_configs_dir }}/{{ item.0.master_cert_subdir }}/{{ item.1 }}" +    src: "{{ openshift_master_config_dir }}/{{ item }}" +    dest: "{{ openshift_master_generated_config_dir }}/{{ item }}"      state: hard      force: true -  with_nested: -  - "{{ masters_needing_certs | default([]) }}" +  with_items:    - "{{ hostvars[inventory_hostname] | certificates_to_synchronize }}" +  when: master_certs_missing | bool +  delegate_to: "{{ openshift_ca_host }}" + +- name: Remove generated etcd client certs when using external etcd +  file: +    path: "{{ openshift_master_generated_config_dir }}/{{ item }}" +    state: absent +  when: openshift_master_etcd_hosts | length > 0 +  with_items: +  - master.etcd-client.crt +  - master.etcd-client.key +  delegate_to: "{{ openshift_ca_host }}" + +- name: Create local temp directory for syncing certs +  local_action: command mktemp -d /tmp/openshift-ansible-XXXXXXX +  register: g_master_mktemp +  changed_when: False +  when: master_certs_missing | bool +  delegate_to: localhost +  become: no + +- name: Create a tarball of the master certs +  command: > +    tar -czvf {{ openshift_master_generated_config_dir }}.tgz +      -C {{ openshift_master_generated_config_dir }} . +  args: +    creates: "{{ openshift_master_generated_config_dir }}.tgz" +  when: master_certs_missing | bool and inventory_hostname != openshift_ca_host +  delegate_to: "{{ openshift_ca_host }}" + +- name: Retrieve the master cert tarball from the master +  fetch: +    src: "{{ openshift_master_generated_config_dir }}.tgz" +    dest: "{{ g_master_mktemp.stdout }}/" +    flat: yes +    fail_on_missing: yes +    validate_checksum: yes +  when: master_certs_missing | bool and inventory_hostname != openshift_ca_host +  delegate_to: "{{ openshift_ca_host }}" + +- name: Ensure certificate directory exists +  file: +    path: "{{ openshift_master_config_dir }}" +    state: directory +  when: master_certs_missing | bool and inventory_hostname != openshift_ca_host + +- name: Unarchive the tarball on the master +  unarchive: +    src: "{{ g_master_mktemp.stdout }}/{{ openshift_master_cert_subdir }}.tgz" +    dest: "{{ openshift_master_config_dir }}" +  when: master_certs_missing | bool and inventory_hostname != openshift_ca_host + +- file: name={{ g_master_mktemp.stdout }} state=absent +  changed_when: False +  when: master_certs_missing | bool +  delegate_to: localhost +  become: no diff --git a/roles/openshift_master_certificates/vars/main.yml b/roles/openshift_master_certificates/vars/main.yml index 3f18ddc79..66f2e5162 100644 --- a/roles/openshift_master_certificates/vars/main.yml +++ b/roles/openshift_master_certificates/vars/main.yml @@ -1,3 +1,5 @@  ---  openshift_generated_configs_dir: "{{ openshift.common.config_base }}/generated-configs" +openshift_master_cert_subdir: "master-{{ openshift.common.hostname }}"  openshift_master_config_dir: "{{ openshift.common.config_base }}/master" +openshift_master_generated_config_dir: "{{ openshift_generated_configs_dir }}/{{ openshift_master_cert_subdir }}" diff --git a/roles/openshift_node/meta/main.yml b/roles/openshift_node/meta/main.yml index 97ab8241b..fd493340b 100644 --- a/roles/openshift_node/meta/main.yml +++ b/roles/openshift_node/meta/main.yml @@ -4,7 +4,7 @@ galaxy_info:    description: OpenShift Node    company: Red Hat, Inc.    license: Apache License, Version 2.0 -  min_ansible_version: 1.7 +  min_ansible_version: 2.1    platforms:    - name: EL      versions: @@ -14,6 +14,7 @@ galaxy_info:  dependencies:  - role: openshift_clock  - role: openshift_docker +- role: openshift_node_certificates  - role: openshift_cloud_provider  - role: openshift_common  - role: openshift_node_dnsmasq diff --git a/roles/openshift_node/tasks/main.yml b/roles/openshift_node/tasks/main.yml index 97a21544d..889541e25 100644 --- a/roles/openshift_node/tasks/main.yml +++ b/roles/openshift_node/tasks/main.yml @@ -41,11 +41,15 @@  - name: Pull node image    command: >      docker pull {{ openshift.node.node_image }}:{{ openshift_image_tag }} +  register: pull_result +  changed_when: "'Downloaded newer image' in pull_result.stdout"    when: openshift.common.is_containerized | bool  - name: Pull OpenVSwitch image    command: >      docker pull {{ openshift.node.ovs_image }}:{{ openshift_image_tag }} +  register: pull_result +  changed_when: "'Downloaded newer image' in pull_result.stdout"    when: openshift.common.is_containerized | bool and openshift.common.use_openshift_sdn | bool  - name: Install the systemd units @@ -129,12 +133,12 @@    service: name={{ openshift.common.service_type }}-node enabled=yes state=started    register: node_start_result    ignore_errors: yes -   +  - name: Wait 30 seconds for docker initialization whenever node has failed    pause:      seconds: 30    when: node_start_result | failed -   +  - name: Start and enable node again    service: name={{ openshift.common.service_type }}-node enabled=yes state=started    register: node_start_result diff --git a/roles/openshift_node/tasks/storage_plugins/glusterfs.yml b/roles/openshift_node/tasks/storage_plugins/glusterfs.yml index 8fc8497fa..4fd9cd10b 100644 --- a/roles/openshift_node/tasks/storage_plugins/glusterfs.yml +++ b/roles/openshift_node/tasks/storage_plugins/glusterfs.yml @@ -3,14 +3,30 @@    action: "{{ ansible_pkg_mgr }} name=glusterfs-fuse state=present"    when: not openshift.common.is_atomic | bool -- name: Set sebooleans to allow gluster storage plugin access from containers +- name: Check for existence of virt_use_fusefs seboolean +  command: getsebool virt_use_fusefs +  register: virt_use_fusefs_output +  when: ansible_selinux and ansible_selinux.status == "enabled" +  failed_when: false +  changed_when: false + +- name: Set seboolean to allow gluster storage plugin access from containers    seboolean: -    name: "{{ item }}" +    name: virt_use_fusefs      state: yes      persistent: yes +  when: ansible_selinux and ansible_selinux.status == "enabled" and virt_use_fusefs_output.rc == 0 + +- name: Check for existence of virt_sandbox_use_fusefs seboolean +  command: getsebool virt_sandbox_use_fusefs +  register: virt_sandbox_use_fusefs_output    when: ansible_selinux and ansible_selinux.status == "enabled" -  with_items: -  - virt_use_fusefs -  - virt_sandbox_use_fusefs -  register: sebool_result -  failed_when: "'state' not in sebool_result and 'msg' in sebool_result and 'SELinux boolean {{ item }} does not exist' not in sebool_result.msg" +  failed_when: false +  changed_when: false + +- name: Set seboolean to allow gluster storage plugin access from containers(sandbox) +  seboolean: +    name: virt_sandbox_use_fusefs +    state: yes +    persistent: yes +  when: ansible_selinux and ansible_selinux.status == "enabled" and virt_sandbox_use_fusefs_output.rc == 0 diff --git a/roles/openshift_node/tasks/storage_plugins/nfs.yml b/roles/openshift_node/tasks/storage_plugins/nfs.yml index 8380714d4..e384c1bd7 100644 --- a/roles/openshift_node/tasks/storage_plugins/nfs.yml +++ b/roles/openshift_node/tasks/storage_plugins/nfs.yml @@ -3,16 +3,30 @@    action: "{{ ansible_pkg_mgr }} name=nfs-utils state=present"    when: not openshift.common.is_atomic | bool +- name: Check for existence of virt_use_nfs seboolean +  command: getsebool virt_use_nfs +  register: virt_use_nfs_output +  when: ansible_selinux and ansible_selinux.status == "enabled" +  failed_when: false +  changed_when: false +  - name: Set seboolean to allow nfs storage plugin access from containers    seboolean:      name: virt_use_nfs      state: yes      persistent: yes +  when: ansible_selinux and ansible_selinux.status == "enabled" and virt_use_nfs_output.rc == 0 + +- name: Check for existence of virt_sandbox_use_nfs seboolean +  command: getsebool virt_sandbox_use_nfs +  register: virt_sandbox_use_nfs_output    when: ansible_selinux and ansible_selinux.status == "enabled" +  failed_when: false +  changed_when: false  - name: Set seboolean to allow nfs storage plugin access from containers(sandbox)    seboolean:      name: virt_sandbox_use_nfs      state: yes      persistent: yes -  when: ansible_selinux and ansible_selinux.status == "enabled" +  when: ansible_selinux and ansible_selinux.status == "enabled" and virt_sandbox_use_nfs_output.rc == 0 diff --git a/roles/openshift_node/templates/node.yaml.v1.j2 b/roles/openshift_node/templates/node.yaml.v1.j2 index 9ba1a01dd..a37770c4a 100644 --- a/roles/openshift_node/templates/node.yaml.v1.j2 +++ b/roles/openshift_node/templates/node.yaml.v1.j2 @@ -34,7 +34,6 @@ servingInfo:    clientCA: ca.crt    keyFile: server.key  volumeDirectory: {{ openshift.common.data_dir }}/openshift.local.volumes -{% include 'partials/kubeletArguments.j2' %}  proxyArguments:    proxy-mode:       - {{ openshift.node.proxy_mode }} diff --git a/roles/openshift_node/templates/partials/kubeletArguments.j2 b/roles/openshift_node/templates/partials/kubeletArguments.j2 deleted file mode 100644 index 6c3bd04c5..000000000 --- a/roles/openshift_node/templates/partials/kubeletArguments.j2 +++ /dev/null @@ -1,5 +0,0 @@ -{% if openshift.common.use_cluster_metrics | bool %} -kubeletArguments: -  "read-only-port": -    - "10255" -{% endif %}
\ No newline at end of file diff --git a/roles/openshift_node_certificates/README.md b/roles/openshift_node_certificates/README.md index 6264d253a..f56066b29 100644 --- a/roles/openshift_node_certificates/README.md +++ b/roles/openshift_node_certificates/README.md @@ -1,27 +1,44 @@ -OpenShift/Atomic Enterprise Node Certificates -============================================= +OpenShift Node Certificates +=========================== -TODO +This role determines if OpenShift node certificates must be created, delegates certificate creation to the `openshift_ca_host` and then deploys those certificates to node hosts which this role is being applied to.  Requirements  ------------ -TODO -  Role Variables  -------------- -TODO +From `openshift_ca`: + +| Name                                | Default value                                                           | Description                                                                                                               | +|-------------------------------------|-------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------| +| openshift_ca_host                   | None (Required)                                                         | The hostname of the system where the OpenShift CA will be (or has been) created.                                          | + +From this role: + +| Name                                | Default value                                                           | Description                                                                                                               | +|-------------------------------------|-------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------| +| openshift_generated_configs_dir     | `{{ openshift.common.config_base }}/generated-configs`                  | Directory in which per-node generated config directories will be created on the `openshift_ca_host`.                      | +| openshift_node_cert_subdir          | `node-{{ openshift.common.hostname }}`                                  | Directory within `openshift_generated_configs_dir` where per-node certificates will be placed on the `openshift_ca_host`. | +| openshift_node_config_dir           | `{{ openshift.common.config_base }}/node`                               | Node configuration directory in which certificates will be deployed on nodes.                                             | +| openshift_node_generated_config_dir | `{{ openshift_generated_configs_dir }}/{{ openshift_node_cert_subdir }` | Full path to the per-node generated config directory.                                                                     |  Dependencies  ------------ -TODO +* openshift_ca  Example Playbook  ---------------- -TODO +``` +- name: Create OpenShift Node Certificates +  hosts: nodes +  roles: +  - role: openshift_node_certificates +    openshift_ca_host: master1.example.com +```  License  ------- diff --git a/roles/openshift_node_certificates/meta/main.yml b/roles/openshift_node_certificates/meta/main.yml index f3236e850..50a862ee9 100644 --- a/roles/openshift_node_certificates/meta/main.yml +++ b/roles/openshift_node_certificates/meta/main.yml @@ -1,10 +1,10 @@  ---  galaxy_info:    author: Jason DeTiberus -  description: +  description: OpenShift Node Certificates    company: Red Hat, Inc.    license: Apache License, Version 2.0 -  min_ansible_version: 1.8 +  min_ansible_version: 2.1    platforms:    - name: EL      versions: @@ -13,4 +13,4 @@ galaxy_info:    - cloud    - system  dependencies: -- { role: openshift_facts } +- role: openshift_facts diff --git a/roles/openshift_node_certificates/tasks/main.yml b/roles/openshift_node_certificates/tasks/main.yml index 216c11093..0e69dc6f0 100644 --- a/roles/openshift_node_certificates/tasks/main.yml +++ b/roles/openshift_node_certificates/tasks/main.yml @@ -1,36 +1,117 @@  --- -- name: Create openshift_generated_configs_dir if it doesn\'t exist +- name: Ensure CA certificate exists on openshift_ca_host +  stat: +    path: "{{ openshift_ca_cert }}" +  register: g_ca_cert_stat_result +  delegate_to: "{{ openshift_ca_host }}" +  run_once: true + +- fail: +    msg: > +      CA certificate {{ openshift_ca_cert }} doesn't exist on CA host +      {{ openshift_ca_host }}. Apply 'openshift_ca' role to +      {{ openshift_ca_host }}. +  when: not g_ca_cert_stat_result.stat.exists | bool +  run_once: true + +- name: Check status of node certificates +  stat: +    path: "{{ openshift.common.config_base }}/node/{{ item }}" +  with_items: +  - "system:node:{{ openshift.common.hostname }}.crt" +  - "system:node:{{ openshift.common.hostname }}.key" +  - "system:node:{{ openshift.common.hostname }}.kubeconfig" +  - ca.crt +  - server.key +  - server.crt +  register: g_node_cert_stat_result + +- set_fact: +    node_certs_missing: "{{ False in (g_node_cert_stat_result.results +                            | oo_collect(attribute='stat.exists') +                            | list) }}" + +- name: Create openshift_generated_configs_dir if it does not exist    file:      path: "{{ openshift_generated_configs_dir }}"      state: directory      mode: 0700 -  when: nodes_needing_certs | length > 0 +  when: node_certs_missing | bool +  delegate_to: "{{ openshift_ca_host }}"  - name: Generate the node client config    command: >      {{ openshift.common.admin_binary }} create-api-client-config -      --certificate-authority={{ openshift_master_ca_cert }} -      --client-dir={{ openshift_generated_configs_dir }}/node-{{ item.openshift.common.hostname }} +      --certificate-authority={{ openshift_ca_cert }} +      --client-dir={{ openshift_node_generated_config_dir }}        --groups=system:nodes -      --master={{ openshift.master.api_url }} -      --signer-cert={{ openshift_master_ca_cert }} -      --signer-key={{ openshift_master_ca_key }} -      --signer-serial={{ openshift_master_ca_serial }} -      --user=system:node:{{ item.openshift.common.hostname }} +      --master={{ hostvars[openshift_ca_host].openshift.master.api_url }} +      --signer-cert={{ openshift_ca_cert }} +      --signer-key={{ openshift_ca_key }} +      --signer-serial={{ openshift_ca_serial }} +      --user=system:node:{{ openshift.common.hostname }}    args: -    creates: "{{ openshift_generated_configs_dir }}/node-{{ item.openshift.common.hostname }}" -  with_items: "{{ nodes_needing_certs | default([]) }}" +    creates: "{{ openshift_node_generated_config_dir }}" +  when: node_certs_missing | bool +  delegate_to: "{{ openshift_ca_host }}"  - name: Generate the node server certificate    command: >      {{ openshift.common.admin_binary }} ca create-server-cert -      --cert={{ openshift_generated_configs_dir }}/node-{{ item.openshift.common.hostname }}/server.crt -      --key={{ openshift_generated_configs_dir }}/node-{{ item.openshift.common.hostname }}/server.key +      --cert={{ openshift_node_generated_config_dir }}/server.crt +      --key={{ openshift_generated_configs_dir }}/node-{{ openshift.common.hostname }}/server.key        --overwrite=true -      --hostnames={{ item.openshift.common.all_hostnames |join(",") }} -      --signer-cert={{ openshift_master_ca_cert }} -      --signer-key={{ openshift_master_ca_key }} -      --signer-serial={{ openshift_master_ca_serial }} +      --hostnames={{ openshift.common.all_hostnames |join(",") }} +      --signer-cert={{ openshift_ca_cert }} +      --signer-key={{ openshift_ca_key }} +      --signer-serial={{ openshift_ca_serial }} +  args: +    creates: "{{ openshift_node_generated_config_dir }}/server.crt" +  when: node_certs_missing | bool +  delegate_to: "{{ openshift_ca_host}}" + +- name: Create local temp directory for syncing certs +  local_action: command mktemp -d /tmp/openshift-ansible-XXXXXXX +  register: node_cert_mktemp +  changed_when: False +  when: node_certs_missing | bool +  delegate_to: localhost +  become: no + +- name: Create a tarball of the node config directories +  command: > +    tar -czvf {{ openshift_node_generated_config_dir }}.tgz +    --transform 's|system:{{ openshift_node_cert_subdir }}|node|' +    -C {{ openshift_node_generated_config_dir }} .    args: -    creates: "{{ openshift_generated_configs_dir }}/node-{{ item.openshift.common.hostname }}/server.crt" -  with_items: "{{ nodes_needing_certs | default([]) }}" +    creates: "{{ openshift_node_generated_config_dir }}.tgz" +  when: node_certs_missing | bool +  delegate_to: "{{ openshift_ca_host }}" + +- name: Retrieve the node config tarballs from the master +  fetch: +    src: "{{ openshift_node_generated_config_dir }}.tgz" +    dest: "{{ node_cert_mktemp.stdout }}/" +    flat: yes +    fail_on_missing: yes +    validate_checksum: yes +  when: node_certs_missing | bool +  delegate_to: "{{ openshift_ca_host }}" + +- name: Ensure certificate directory exists +  file: +    path: "{{ openshift_node_cert_dir }}" +    state: directory +  when: node_certs_missing | bool + +- name: Unarchive the tarball on the node +  unarchive: +    src: "{{ node_cert_mktemp.stdout }}/{{ openshift_node_cert_subdir }}.tgz" +    dest: "{{ openshift_node_cert_dir }}" +  when: node_certs_missing | bool + +- file: name={{ node_cert_mktemp.stdout }} state=absent +  changed_when: False +  when: node_certs_missing | bool +  delegate_to: localhost +  become: no diff --git a/roles/openshift_node_certificates/vars/main.yml b/roles/openshift_node_certificates/vars/main.yml index 61fbb1e51..17ad8106d 100644 --- a/roles/openshift_node_certificates/vars/main.yml +++ b/roles/openshift_node_certificates/vars/main.yml @@ -1,7 +1,11 @@  --- -openshift_node_config_dir: "{{ openshift.common.config_base }}/node" -openshift_master_config_dir: "{{ openshift.common.config_base }}/master"  openshift_generated_configs_dir: "{{ openshift.common.config_base }}/generated-configs" -openshift_master_ca_cert: "{{ openshift_master_config_dir }}/ca.crt" -openshift_master_ca_key: "{{ openshift_master_config_dir }}/ca.key" -openshift_master_ca_serial: "{{ openshift_master_config_dir }}/ca.serial.txt" +openshift_node_cert_dir: "{{ openshift.common.config_base }}/node" +openshift_node_cert_subdir: "node-{{ openshift.common.hostname }}" +openshift_node_config_dir: "{{ openshift.common.config_base }}/node" +openshift_node_generated_config_dir: "{{ openshift_generated_configs_dir }}/{{ openshift_node_cert_subdir }}" + +openshift_ca_config_dir: "{{ openshift.common.config_base }}/master" +openshift_ca_cert: "{{ openshift_ca_config_dir }}/ca.crt" +openshift_ca_key: "{{ openshift_ca_config_dir }}/ca.key" +openshift_ca_serial: "{{ openshift_ca_config_dir }}/ca.serial.txt" diff --git a/roles/openshift_version/tasks/main.yml b/roles/openshift_version/tasks/main.yml index 0a134f557..6e5d2b22c 100644 --- a/roles/openshift_version/tasks/main.yml +++ b/roles/openshift_version/tasks/main.yml @@ -76,5 +76,12 @@  # We can't map an openshift_release to full rpm version like we can with containers, make sure  # the rpm version we looked up matches the release requested and error out if not.  - fail: -    msg: "Detected openshift version {{ openshift_version }} does not match requested openshift_release {{ openshift_release }}. You may need to adjust your yum repositories or specify an exact openshift_pkg_version." +    msg: "Detected OpenShift version {{ openshift_version }} does not match requested openshift_release {{ openshift_release }}. You may need to adjust your yum repositories, inventory, or run the appropriate OpenShift upgrade playbook."    when: not is_containerized | bool and openshift_release is defined and not openshift_version.startswith(openshift_release) | bool + +# The end result of these three variables is quite important so make sure they are displayed and logged: +- debug: var=openshift_release + +- debug: var=openshift_image_tag + +- debug: var=openshift_pkg_version | 
