diff options
46 files changed, 572 insertions, 246 deletions
diff --git a/inventory/byo/hosts.origin.example b/inventory/byo/hosts.origin.example index c54d6bca7..c8c60bb60 100644 --- a/inventory/byo/hosts.origin.example +++ b/inventory/byo/hosts.origin.example @@ -539,7 +539,7 @@ openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true',  # Defaults to https://hawkular-metrics.{{openshift_master_default_subdomain}}/hawkular/metrics  # Currently, you may only alter the hostname portion of the url, alterting the  # `/hawkular/metrics` path will break installation of metrics. -#openshift_metrics_hawkular_hostname=https://hawkular-metrics.example.com/hawkular/metrics +#openshift_metrics_hawkular_hostname=hawkular-metrics.example.com  # Configure the prefix and version for the component images  #openshift_metrics_image_prefix=docker.io/openshift/origin-  #openshift_metrics_image_version=v3.7.0 diff --git a/inventory/byo/hosts.ose.example b/inventory/byo/hosts.ose.example index 7c637b3cb..30987fa38 100644 --- a/inventory/byo/hosts.ose.example +++ b/inventory/byo/hosts.ose.example @@ -547,7 +547,7 @@ openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true',  # Defaults to https://hawkular-metrics.{{openshift_master_default_subdomain}}/hawkular/metrics  # Currently, you may only alter the hostname portion of the url, alterting the  # `/hawkular/metrics` path will break installation of metrics. -#openshift_metrics_hawkular_hostname=https://hawkular-metrics.example.com/hawkular/metrics +#openshift_metrics_hawkular_hostname=hawkular-metrics.example.com  # Configure the prefix and version for the component images  #openshift_metrics_image_prefix=registry.example.com:8888/openshift3/  #openshift_metrics_image_version=3.7.0 diff --git a/playbooks/aws/README.md b/playbooks/aws/README.md index 2b3d4329e..816cb35b4 100644 --- a/playbooks/aws/README.md +++ b/playbooks/aws/README.md @@ -87,11 +87,6 @@ masters  nodes  etcd -[OSEv3:children] -masters -nodes -etcd -  [OSEv3:vars]  ################################################################################  # Ensure these variables are set for bootstrap diff --git a/playbooks/byo/openshift-master/certificates.yml b/playbooks/byo/openshift-master/certificates.yml index 26b964034..e147dcba1 100644 --- a/playbooks/byo/openshift-master/certificates.yml +++ b/playbooks/byo/openshift-master/certificates.yml @@ -3,6 +3,4 @@  - include: ../../common/openshift-cluster/std_include.yml -- include: ../../common/openshift-master/ca.yml -  - include: ../../common/openshift-master/certificates.yml diff --git a/playbooks/byo/openshift-node/scaleup.yml b/playbooks/byo/openshift-node/scaleup.yml index 9f992cca6..e0c36fb69 100644 --- a/playbooks/byo/openshift-node/scaleup.yml +++ b/playbooks/byo/openshift-node/scaleup.yml @@ -16,6 +16,4 @@  - include: ../../common/openshift-cluster/std_include.yml -- include: ../../common/openshift-node/certificates.yml -  - include: ../../common/openshift-node/config.yml diff --git a/playbooks/common/openshift-cluster/config.yml b/playbooks/common/openshift-cluster/config.yml index 4ca0d48e4..96a43230d 100644 --- a/playbooks/common/openshift-cluster/config.yml +++ b/playbooks/common/openshift-cluster/config.yml @@ -18,10 +18,6 @@        - docker_image_availability        - docker_storage -- include: ../openshift-etcd/ca.yml - -- include: ../openshift-etcd/certificates.yml -  - include: ../openshift-etcd/config.yml  - include: ../openshift-nfs/config.yml @@ -30,16 +26,10 @@  - include: ../openshift-loadbalancer/config.yml    when: groups.oo_lb_to_config | default([]) | count > 0 -- include: ../openshift-master/ca.yml - -- include: ../openshift-master/certificates.yml -  - include: ../openshift-master/config.yml  - include: ../openshift-master/additional_config.yml -- include: ../openshift-node/certificates.yml -  - include: ../openshift-node/config.yml  - include: ../openshift-glusterfs/config.yml diff --git a/playbooks/common/openshift-cluster/initialize_openshift_version.yml b/playbooks/common/openshift-cluster/initialize_openshift_version.yml index 6100c36e1..e6400ea61 100644 --- a/playbooks/common/openshift-cluster/initialize_openshift_version.yml +++ b/playbooks/common/openshift-cluster/initialize_openshift_version.yml @@ -19,8 +19,8 @@  # NOTE: We set this even on etcd hosts as they may also later run as masters,  # and we don't want to install wrong version of docker and have to downgrade  # later. -- name: Set openshift_version for all hosts -  hosts: oo_all_hosts:!oo_first_master +- name: Set openshift_version for etcd, node, and master hosts +  hosts: oo_etcd_to_config:oo_nodes_to_config:oo_masters_to_config:!oo_first_master    vars:      openshift_version: "{{ hostvars[groups.oo_first_master.0].openshift_version }}"    pre_tasks: diff --git a/playbooks/common/openshift-cluster/redeploy-certificates/openshift-ca.yml b/playbooks/common/openshift-cluster/redeploy-certificates/openshift-ca.yml index 12cd209d2..e4193a00e 100644 --- a/playbooks/common/openshift-cluster/redeploy-certificates/openshift-ca.yml +++ b/playbooks/common/openshift-cluster/redeploy-certificates/openshift-ca.yml @@ -114,12 +114,18 @@      register: g_new_openshift_ca_mktemp      changed_when: false -- include: ../../openshift-master/ca.yml +- name: Create OpenShift CA +  hosts: oo_first_master    vars:      # Set openshift_ca_config_dir to a temporary directory where CA      # will be created. We'll replace the existing CA with the CA      # created in the temporary directory.      openshift_ca_config_dir: "{{ hostvars[groups.oo_first_master.0].g_new_openshift_ca_mktemp.stdout }}" +  roles: +  - role: openshift_master_facts +  - role: openshift_named_certificates +  - role: openshift_ca +    openshift_ca_host: "{{ groups.oo_first_master.0 }}"  - name: Create temp directory for syncing certs    hosts: localhost diff --git a/playbooks/common/openshift-etcd/config.yml b/playbooks/common/openshift-etcd/config.yml index 2cae231b4..82539dac8 100644 --- a/playbooks/common/openshift-etcd/config.yml +++ b/playbooks/common/openshift-etcd/config.yml @@ -10,6 +10,10 @@          installer_phase_etcd: "In Progress"        aggregate: false +- include: ca.yml + +- include: certificates.yml +  - name: Configure etcd    hosts: oo_etcd_to_config    any_errors_fatal: true diff --git a/playbooks/common/openshift-master/ca.yml b/playbooks/common/openshift-master/ca.yml deleted file mode 100644 index 5bb796fa3..000000000 --- a/playbooks/common/openshift-master/ca.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -- name: Create OpenShift CA -  hosts: oo_masters_to_config -  roles: -  - role: openshift_master_facts -  - role: openshift_named_certificates -  - role: openshift_ca -    openshift_ca_host: "{{ groups.oo_first_master.0 }}" diff --git a/playbooks/common/openshift-master/config.yml b/playbooks/common/openshift-master/config.yml index 766e0e501..bc1fee982 100644 --- a/playbooks/common/openshift-master/config.yml +++ b/playbooks/common/openshift-master/config.yml @@ -10,6 +10,8 @@          installer_phase_master: "In Progress"        aggregate: false +- include: certificates.yml +  - name: Disable excluders    hosts: oo_masters_to_config    gather_facts: no diff --git a/playbooks/common/openshift-master/scaleup.yml b/playbooks/common/openshift-master/scaleup.yml index d007fac85..f4dc9df8a 100644 --- a/playbooks/common/openshift-master/scaleup.yml +++ b/playbooks/common/openshift-master/scaleup.yml @@ -47,8 +47,6 @@  - include: ../openshift-etcd/certificates.yml -- include: ../openshift-master/certificates.yml -  - include: ../openshift-master/config.yml  - include: ../openshift-loadbalancer/config.yml diff --git a/playbooks/common/openshift-node/config.yml b/playbooks/common/openshift-node/config.yml index 6fd8aa6f1..700aab48c 100644 --- a/playbooks/common/openshift-node/config.yml +++ b/playbooks/common/openshift-node/config.yml @@ -10,6 +10,8 @@          installer_phase_node: "In Progress"        aggregate: false +- include: certificates.yml +  - include: setup.yml  - include: containerized_nodes.yml diff --git a/roles/ansible_service_broker/defaults/main.yml b/roles/ansible_service_broker/defaults/main.yml index 9eb9db316..fa982d533 100644 --- a/roles/ansible_service_broker/defaults/main.yml +++ b/roles/ansible_service_broker/defaults/main.yml @@ -6,6 +6,14 @@ ansible_service_broker_log_level: info  ansible_service_broker_output_request: false  ansible_service_broker_recovery: true  ansible_service_broker_bootstrap_on_startup: true -# Recommended you do not enable this for now  ansible_service_broker_dev_broker: false +ansible_service_broker_refresh_interval: 600s +# Recommended you do not enable this for now  ansible_service_broker_launch_apb_on_bind: false + +ansible_service_broker_image_pull_policy: IfNotPresent +ansible_service_broker_sandbox_role: edit +ansible_service_broker_auto_escalate: true +ansible_service_broker_registry_tag: latest +ansible_service_broker_registry_whitelist: +  - '.*-apb$' diff --git a/roles/ansible_service_broker/tasks/install.yml b/roles/ansible_service_broker/tasks/install.yml index b3797ef96..0f4b71124 100644 --- a/roles/ansible_service_broker/tasks/install.yml +++ b/roles/ansible_service_broker/tasks/install.yml @@ -17,16 +17,24 @@      ansible_service_broker_etcd_image_etcd_path: "{{ ansible_service_broker_etcd_image_etcd_path | default(__ansible_service_broker_etcd_image_etcd_path) }}"      ansible_service_broker_registry_type: "{{ ansible_service_broker_registry_type | default(__ansible_service_broker_registry_type) }}" +    ansible_service_broker_registry_name: "{{ ansible_service_broker_registry_name | default(__ansible_service_broker_registry_name) }}"      ansible_service_broker_registry_url: "{{ ansible_service_broker_registry_url | default(__ansible_service_broker_registry_url) }}"      ansible_service_broker_registry_user: "{{ ansible_service_broker_registry_user | default(__ansible_service_broker_registry_user) }}"      ansible_service_broker_registry_password: "{{ ansible_service_broker_registry_password | default(__ansible_service_broker_registry_password) }}"      ansible_service_broker_registry_organization: "{{ ansible_service_broker_registry_organization | default(__ansible_service_broker_registry_organization) }}" +    ansible_service_broker_certs_dir: "{{ openshift.common.config_base }}/service-catalog" +  - name: set ansible-service-broker image facts using set prefix and tag    set_fact:      ansible_service_broker_image: "{{ ansible_service_broker_image_prefix }}ansible-service-broker:{{ ansible_service_broker_image_tag }}"      ansible_service_broker_etcd_image: "{{ ansible_service_broker_etcd_image_prefix }}etcd:{{ ansible_service_broker_etcd_image_tag }}" +- slurp: +    src: "{{ ansible_service_broker_certs_dir }}/ca.crt" +  register: catalog_ca + +  - include: validate_facts.yml @@ -42,53 +50,119 @@      namespace: openshift-ansible-service-broker      state: present -- name: Set SA cluster-role +- name: create ansible-service-broker client serviceaccount +  oc_serviceaccount: +    name: asb-client +    namespace: openshift-ansible-service-broker +    state: present + +- name: Create asb-auth cluster role +  oc_clusterrole: +    state: present +    name: asb-auth +    rules: +      - apiGroups: [""] +        resources: ["namespaces"] +        verbs: ["create", "delete"] +      - apiGroups: ["authorization.openshift.io"] +        resources: ["subjectrulesreview"] +        verbs: ["create"] +      - apiGroups: ["authorization.k8s.io"] +        resources: ["subjectaccessreviews"] +        verbs: ["create"] +      - apiGroups: ["authentication.k8s.io"] +        resources: ["tokenreviews"] +        verbs: ["create"] + +- name: Create asb-access cluster role +  oc_clusterrole: +    state: present +    name: asb-access +    rules: +      - nonResourceURLs: ["/ansible-service-broker", "ansible-service-broker/*"] +        verbs: ["get", "post", "put", "patch", "delete"] + +- name: Bind admin cluster-role to asb serviceaccount    oc_adm_policy_user:      state: present -    namespace: "openshift-ansible-service-broker" +    namespace: openshift-ansible-service-broker      resource_kind: cluster-role      resource_name: admin      user: "system:serviceaccount:openshift-ansible-service-broker:asb" -- name: create ansible-service-broker service -  oc_service: -    name: asb +- name: Bind auth cluster role to asb service account +  oc_adm_policy_user: +    state: present      namespace: openshift-ansible-service-broker +    resource_kind: cluster-role +    resource_name: asb-auth +    user: "system:serviceaccount:openshift-ansible-service-broker:asb" + +- name: Bind asb-access role to asb-client service account +  oc_adm_policy_user:      state: present -    labels: -      app: openshift-ansible-service-broker -      service: asb -    ports: -      - name: port-1338 -        port: 1338 -    selector: -      app: openshift-ansible-service-broker -      service: asb +    namespace: openshift-ansible-service-broker +    resource_kind: cluster-role +    resource_name: asb-access +    user: "system:serviceaccount:openshift-ansible-service-broker:asb-client" -- name: create etcd service -  oc_service: -    name: etcd +- name: create asb-client token secret +  oc_obj: +    name: asb-client +    state: present +    kind: Secret +    content: +      path: /tmp/asbclientsecretout +      data: +        apiVersion: v1 +        kind: Secret +        metadata: +          name: asb-client +          annotations: +            kubernetes.io/service-account.name: asb-client +        type: kubernetes.io/service-account-token + +# Using oc_obj because oc_service doesn't seem to allow annotations +# TODO: Extend oc_service to allow annotations +- name: create ansible-service-broker service +  oc_obj: +    name: asb      namespace: openshift-ansible-service-broker      state: present -    ports: -      - name: etcd-advertise -        port: 2379 -    selector: -      app: openshift-ansible-service-broker -      service: etcd +    kind: Service +    content: +      path: /tmp/asbsvcout +      data: +        apiVersion: v1 +        kind: Service +        metadata: +          name: asb +          labels: +            app: openshift-ansible-service-broker +            service: asb +          annotations: +            service.alpha.openshift.io/serving-cert-secret-name: asb-tls +        spec: +          ports: +            - name: port-1338 +              port: 1338 +              targetPort: 1338 +              protocol: TCP +          selector: +            app: openshift-ansible-service-broker +            service: asb  - name: create route for ansible-service-broker service    oc_route:      name: asb-1338      namespace: openshift-ansible-service-broker      state: present +    labels: +      app: openshift-ansible-service-broker +      service: asb      service_name: asb      port: 1338 -  register: asb_route_out - -- name: get ansible-service-broker route name -  set_fact: -    ansible_service_broker_route: "{{ asb_route_out.results.results[0].spec.host }}" +    tls_termination: Reencrypt  - name: create persistent volume claim for etcd    oc_obj: @@ -97,7 +171,7 @@      state: present      kind: PersistentVolumeClaim      content: -      path: /tmp/dcout +      path: /tmp/pvcout        data:          apiVersion: v1          kind: PersistentVolumeClaim @@ -111,50 +185,61 @@              requests:                storage: 1Gi -- name: create etcd deployment +- name: Create Ansible Service Broker deployment config    oc_obj: -    name: etcd +    name: asb      namespace: openshift-ansible-service-broker      state: present -    kind: Deployment +    kind: DeploymentConfig      content:        path: /tmp/dcout        data: -        apiVersion: extensions/v1beta1 -        kind: Deployment +        apiVersion: v1 +        kind: DeploymentConfig          metadata: -          name: etcd -          namespace: openshift-ansible-service-broker +          name: asb            labels:              app: openshift-ansible-service-broker -            service: etcd +            service: asb          spec: +          replicas: 1            selector: -            matchLabels: -              app: openshift-ansible-service-broker -              service: etcd +            app: openshift-ansible-service-broker            strategy: -            type: RollingUpdate -            rollingUpdate: -              maxSurge: 1 -              maxUnavailable: 1 -          replicas: 1 +            type: Rolling            template:              metadata:                labels:                  app: openshift-ansible-service-broker -                service: etcd +                service: asb              spec: -              restartPolicy: Always +              serviceAccount: asb                containers: +                - image: "{{ ansible_service_broker_image }}" +                  name: asb +                  imagePullPolicy: IfNotPresent +                  volumeMounts: +                    - name: config-volume +                      mountPath: /etc/ansible-service-broker +                    - name: asb-tls +                      mountPath: /etc/tls/private +                  ports: +                    - containerPort: 1338 +                      protocol: TCP +                  env: +                    - name: BROKER_CONFIG +                      value: /etc/ansible-service-broker/config.yaml +                  resources: {} +                  terminationMessagePath: /tmp/termination-log +                  - image: "{{ ansible_service_broker_etcd_image }}"                    name: etcd                    imagePullPolicy: IfNotPresent                    terminationMessagePath: /tmp/termination-log                    workingDir: /etcd                    args: -                    - '{{ ansible_service_broker_etcd_image_etcd_path }}' -                    - --data-dir=/data +                    - "{{ ansible_service_broker_etcd_image_etcd_path }}" +                    - "--data-dir=/data"                      - "--listen-client-urls=http://0.0.0.0:2379"                      - "--advertise-client-urls=http://0.0.0.0:2379"                    ports: @@ -170,57 +255,15 @@                  - name: etcd                    persistentVolumeClaim:                      claimName: etcd - -- name: create ansible-service-broker deployment -  oc_obj: -    name: asb -    namespace: openshift-ansible-service-broker -    state: present -    kind: Deployment -    content: -      path: /tmp/dcout -      data: -        apiVersion: extensions/v1beta1 -        kind: Deployment -        metadata: -          name: asb -          namespace: openshift-ansible-service-broker -          labels: -            app: openshift-ansible-service-broker -            service: asb -        spec: -          strategy: -            type: Recreate -          replicas: 1 -          template: -            metadata: -              labels: -                app: openshift-ansible-service-broker -                service: asb -            spec: -              serviceAccount: asb -              restartPolicy: Always -              containers: -                - image: "{{ ansible_service_broker_image }}" -                  name: asb -                  imagePullPolicy: IfNotPresent -                  volumeMounts: -                    - name: config-volume -                      mountPath: /etc/ansible-service-broker -                  ports: -                    - containerPort: 1338 -                      protocol: TCP -                  env: -                    - name: BROKER_CONFIG -                      value: /etc/ansible-service-broker/config.yaml -                  terminationMessagePath: /tmp/termination-log -              volumes:                  - name: config-volume                    configMap:                      name: broker-config                      items:                        - key: broker-config                          path: config.yaml +                - name: asb-tls +                  secret: +                    secretName: asb-tls  # TODO: saw a oc_configmap in the library, but didn't understand how to get it to do the following: @@ -239,42 +282,65 @@            name: broker-config            namespace: openshift-ansible-service-broker            labels: -            app: ansible-service-broker +            app: openshift-ansible-service-broker          data:            broker-config: |              registry: -              name: "{{ ansible_service_broker_registry_type }}" -              url:  "{{ ansible_service_broker_registry_url }}" -              user: "{{ ansible_service_broker_registry_user }}" -              pass: "{{ ansible_service_broker_registry_password }}" -              org:  "{{ ansible_service_broker_registry_organization }}" +              - type: {{ ansible_service_broker_registry_type }} +                name: {{ ansible_service_broker_registry_name }} +                url:  {{ ansible_service_broker_registry_url }} +                user: {{ ansible_service_broker_registry_user }} +                pass: {{ ansible_service_broker_registry_password }} +                org:  {{ ansible_service_broker_registry_organization }} +                tag:  {{ ansible_service_broker_registry_tag }} +                white_list: {{ ansible_service_broker_registry_whitelist }}              dao: -              etcd_host: etcd +              etcd_host: 0.0.0.0                etcd_port: 2379              log:                logfile: /var/log/ansible-service-broker/asb.log                stdout: true -              level: "{{ ansible_service_broker_log_level }}" +              level: {{ ansible_service_broker_log_level }}                color: true -            openshift: {} +            openshift: +              host: "" +              ca_file: "" +              bearer_token_file: "" +              sandbox_role: {{ ansible_service_broker_sandbox_role }} +              image_pull_policy: {{ ansible_service_broker_image_pull_policy }}              broker:                dev_broker: {{ ansible_service_broker_dev_broker | bool | lower }} +              bootstrap_on_startup: {{ ansible_service_broker_bootstrap_on_startup | bool | lower }} +              refresh_interval: {{ ansible_service_broker_refresh_interval }}                launch_apb_on_bind: {{ ansible_service_broker_launch_apb_on_bind | bool | lower }} -              recovery: {{ ansible_service_broker_recovery | bool | lower }}                output_request: {{ ansible_service_broker_output_request | bool | lower }} -              bootstrap_on_startup: {{ ansible_service_broker_bootstrap_on_startup | bool | lower }} +              recovery: {{ ansible_service_broker_recovery | bool | lower }} +              ssl_cert_key: /etc/tls/private/tls.key +              ssl_cert: /etc/tls/private/tls.crt +              auto_escalate: {{ ansible_service_broker_auto_escalate }} +              auth: +                - type: basic +                  enabled: false +  - name: Create the Broker resource in the catalog    oc_obj:      name: ansible-service-broker      state: present -    kind: Broker +    kind: ServiceBroker      content:        path: /tmp/brokerout        data:          apiVersion: servicecatalog.k8s.io/v1alpha1 -        kind: Broker +        kind: ServiceBroker          metadata:            name: ansible-service-broker          spec: -          url: http://asb.openshift-ansible-service-broker.svc:1338 +          url: http://asb.openshift-ansible-service-broker.svc:1338/ansible-service-broker +          authInfo: +            bearer: +              secretRef: +                name: asb-client +                namespace: openshift-ansible-service-broker +                kind: Secret +          caBundle: "{{ catalog_ca.content }}" diff --git a/roles/ansible_service_broker/tasks/remove.yml b/roles/ansible_service_broker/tasks/remove.yml index 2519f9f4c..f0a6be226 100644 --- a/roles/ansible_service_broker/tasks/remove.yml +++ b/roles/ansible_service_broker/tasks/remove.yml @@ -1,16 +1,57 @@  --- -- name: remove openshift-ansible-service-broker project -  oc_project: -    name: openshift-ansible-service-broker -    state: absent -  - name: remove ansible-service-broker serviceaccount    oc_serviceaccount:      name: asb      namespace: openshift-ansible-service-broker      state: absent +- name: remove ansible-service-broker client serviceaccount +  oc_serviceaccount: +    name: asb-client +    namespace: openshift-ansible-service-broker +    state: absent + +- name: remove asb-auth cluster role +  oc_clusterrole: +    state: absent +    name: asb-auth + +- name: remove asb-access cluster role +  oc_clusterrole: +    state: absent +    name: asb-access + +- name: Unbind admin cluster-role to asb serviceaccount +  oc_adm_policy_user: +    state: absent +    namespace: openshift-ansible-service-broker +    resource_kind: cluster-role +    resource_name: admin +    user: "system:serviceaccount:openshift-ansible-service-broker:asb" + +- name: Unbind auth cluster role to asb service account +  oc_adm_policy_user: +    state: absent +    namespace: openshift-ansible-service-broker +    resource_kind: cluster-role +    resource_name: asb-auth +    user: "system:serviceaccount:openshift-ansible-service-broker:asb" + +- name: Unbind asb-access role to asb-client service account +  oc_adm_policy_user: +    state: absent +    namespace: openshift-ansible-service-broker +    resource_kind: cluster-role +    resource_name: asb-access +    user: "system:serviceaccount:openshift-ansible-service-broker:asb-client" + +- name: remove asb-client token secret +  oc_secret: +    state: absent +    name: asb-client +    namespace: openshift-ansible-service-broker +  - name: remove ansible-service-broker service    oc_service:      name: asb @@ -35,19 +76,19 @@      namespace: openshift-ansible-service-broker      state: absent -- name: remove etcd deployment +- name: remove Ansible Service Broker deployment config    oc_obj: -    name: etcd +    name: asb      namespace: openshift-ansible-service-broker +    kind: DeploymentConfig      state: absent -    kind: Deployment -- name: remove ansible-service-broker deployment +- name: remove secret for broker auth    oc_obj: -    name: asb +    name: asb-auth-secret      namespace: openshift-ansible-service-broker +    kind: Broker      state: absent -    kind: Deployment  # TODO: saw a oc_configmap in the library, but didn't understand how to get it to do the following:  - name: remove config map for ansible-service-broker @@ -62,4 +103,9 @@    oc_obj:      name: ansible-service-broker      state: absent -    kind: Broker +    kind: ServiceBroker + +- name: remove openshift-ansible-service-broker project +  oc_project: +    name: openshift-ansible-service-broker +    state: absent diff --git a/roles/ansible_service_broker/vars/default_images.yml b/roles/ansible_service_broker/vars/default_images.yml index 15e448515..3e9639adf 100644 --- a/roles/ansible_service_broker/vars/default_images.yml +++ b/roles/ansible_service_broker/vars/default_images.yml @@ -8,6 +8,7 @@ __ansible_service_broker_etcd_image_tag: latest  __ansible_service_broker_etcd_image_etcd_path: /usr/local/bin/etcd  __ansible_service_broker_registry_type: dockerhub +__ansible_service_broker_registry_name: dh  __ansible_service_broker_registry_url: null  __ansible_service_broker_registry_user: null  __ansible_service_broker_registry_password: null diff --git a/roles/ansible_service_broker/vars/openshift-enterprise.yml b/roles/ansible_service_broker/vars/openshift-enterprise.yml index ce2ae8365..9c576cb76 100644 --- a/roles/ansible_service_broker/vars/openshift-enterprise.yml +++ b/roles/ansible_service_broker/vars/openshift-enterprise.yml @@ -7,7 +7,9 @@ __ansible_service_broker_etcd_image_prefix: rhel7/  __ansible_service_broker_etcd_image_tag: latest  __ansible_service_broker_etcd_image_etcd_path: /bin/etcd +  __ansible_service_broker_registry_type: rhcc +__ansible_service_broker_registry_name: rh  __ansible_service_broker_registry_url: "https://registry.access.redhat.com"  __ansible_service_broker_registry_user: null  __ansible_service_broker_registry_password: null diff --git a/roles/docker/tasks/package_docker.yml b/roles/docker/tasks/package_docker.yml index a35335937..eab5c3bb1 100644 --- a/roles/docker/tasks/package_docker.yml +++ b/roles/docker/tasks/package_docker.yml @@ -137,18 +137,6 @@    notify:    - restart docker -- name: Check for credentials file for registry auth -  stat: -    path: "{{ docker_cli_auth_config_path }}/config.json" -  when: oreg_auth_user is defined -  register: docker_cli_auth_credentials_stat - -- name: Create credentials for docker cli registry auth -  command: "docker --config={{ docker_cli_auth_config_path }} login -u {{ oreg_auth_user }} -p {{ oreg_auth_password }} {{ oreg_host }}" -  when: -  - oreg_auth_user is defined -  - (not docker_cli_auth_credentials_stat.stat.exists or oreg_auth_credentials_replace) | bool -  - name: Start the Docker service    systemd:      name: docker @@ -163,4 +151,16 @@  - set_fact:      docker_service_status_changed: "{{ r_docker_package_docker_start_result | changed }}" +- name: Check for credentials file for registry auth +  stat: +    path: "{{ docker_cli_auth_config_path }}/config.json" +  when: oreg_auth_user is defined +  register: docker_cli_auth_credentials_stat + +- name: Create credentials for docker cli registry auth +  command: "docker --config={{ docker_cli_auth_config_path }} login -u {{ oreg_auth_user }} -p {{ oreg_auth_password }} {{ oreg_host }}" +  when: +  - oreg_auth_user is defined +  - (not docker_cli_auth_credentials_stat.stat.exists or oreg_auth_credentials_replace) | bool +  - meta: flush_handlers diff --git a/roles/lib_openshift/library/oc_adm_registry.py b/roles/lib_openshift/library/oc_adm_registry.py index 5d6fa1f80..0771aa5a5 100644 --- a/roles/lib_openshift/library/oc_adm_registry.py +++ b/roles/lib_openshift/library/oc_adm_registry.py @@ -1886,13 +1886,15 @@ class SecretConfig(object):                   namespace,                   kubeconfig,                   secrets=None, -                 stype=None): +                 stype=None, +                 annotations=None):          ''' constructor for handling secret options '''          self.kubeconfig = kubeconfig          self.name = sname          self.type = stype          self.namespace = namespace          self.secrets = secrets +        self.annotations = annotations          self.data = {}          self.create_dict() @@ -1909,6 +1911,8 @@ class SecretConfig(object):          if self.secrets:              for key, value in self.secrets.items():                  self.data['data'][key] = value +        if self.annotations: +            self.data['metadata']['annotations'] = self.annotations  # pylint: disable=too-many-instance-attributes  class Secret(Yedit): diff --git a/roles/lib_openshift/library/oc_adm_router.py b/roles/lib_openshift/library/oc_adm_router.py index ffea14766..146f71f68 100644 --- a/roles/lib_openshift/library/oc_adm_router.py +++ b/roles/lib_openshift/library/oc_adm_router.py @@ -2230,13 +2230,15 @@ class SecretConfig(object):                   namespace,                   kubeconfig,                   secrets=None, -                 stype=None): +                 stype=None, +                 annotations=None):          ''' constructor for handling secret options '''          self.kubeconfig = kubeconfig          self.name = sname          self.type = stype          self.namespace = namespace          self.secrets = secrets +        self.annotations = annotations          self.data = {}          self.create_dict() @@ -2253,6 +2255,8 @@ class SecretConfig(object):          if self.secrets:              for key, value in self.secrets.items():                  self.data['data'][key] = value +        if self.annotations: +            self.data['metadata']['annotations'] = self.annotations  # pylint: disable=too-many-instance-attributes  class Secret(Yedit): diff --git a/roles/lib_openshift/library/oc_route.py b/roles/lib_openshift/library/oc_route.py index b46fd5495..e003770d8 100644 --- a/roles/lib_openshift/library/oc_route.py +++ b/roles/lib_openshift/library/oc_route.py @@ -90,6 +90,12 @@ options:      required: false      default: str      aliases: [] +  labels: +    description: +    - The labels to apply on the route +    required: false +    default: None +    aliases: []    tls_termination:      description:      - The options for termination. e.g. reencrypt @@ -1469,6 +1475,7 @@ class RouteConfig(object):                   sname,                   namespace,                   kubeconfig, +                 labels=None,                   destcacert=None,                   cacert=None,                   cert=None, @@ -1483,6 +1490,7 @@ class RouteConfig(object):          self.kubeconfig = kubeconfig          self.name = sname          self.namespace = namespace +        self.labels = labels          self.host = host          self.tls_termination = tls_termination          self.destcacert = destcacert @@ -1508,6 +1516,8 @@ class RouteConfig(object):          self.data['metadata'] = {}          self.data['metadata']['name'] = self.name          self.data['metadata']['namespace'] = self.namespace +        if self.labels: +            self.data['metadata']['labels'] = self.labels          self.data['spec'] = {}          self.data['spec']['host'] = self.host @@ -1715,6 +1725,7 @@ class OCRoute(OpenShiftCLI):          rconfig = RouteConfig(params['name'],                                params['namespace'],                                params['kubeconfig'], +                              params['labels'],                                files['destcacert']['value'],                                files['cacert']['value'],                                files['cert']['value'], @@ -1819,6 +1830,7 @@ def main():              state=dict(default='present', type='str',                         choices=['present', 'absent', 'list']),              debug=dict(default=False, type='bool'), +            labels=dict(default=None, type='dict'),              name=dict(default=None, required=True, type='str'),              namespace=dict(default=None, required=True, type='str'),              tls_termination=dict(default=None, type='str'), diff --git a/roles/lib_openshift/library/oc_secret.py b/roles/lib_openshift/library/oc_secret.py index 19c7fde78..0614f359d 100644 --- a/roles/lib_openshift/library/oc_secret.py +++ b/roles/lib_openshift/library/oc_secret.py @@ -90,6 +90,12 @@ options:      required: false      default: default      aliases: [] +  annotations: +    description: +    - Annotations to apply to the object +    required: false +    default: None +    aliases: []    files:      description:      - A list of files provided for secrets @@ -1464,13 +1470,15 @@ class SecretConfig(object):                   namespace,                   kubeconfig,                   secrets=None, -                 stype=None): +                 stype=None, +                 annotations=None):          ''' constructor for handling secret options '''          self.kubeconfig = kubeconfig          self.name = sname          self.type = stype          self.namespace = namespace          self.secrets = secrets +        self.annotations = annotations          self.data = {}          self.create_dict() @@ -1487,6 +1495,8 @@ class SecretConfig(object):          if self.secrets:              for key, value in self.secrets.items():                  self.data['data'][key] = value +        if self.annotations: +            self.data['metadata']['annotations'] = self.annotations  # pylint: disable=too-many-instance-attributes  class Secret(Yedit): @@ -1698,8 +1708,7 @@ class OCSecret(OpenShiftCLI):              elif params['contents']:                  files = Utils.create_tmp_files_from_contents(params['contents'])              else: -                return {'failed': True, -                        'msg': 'Either specify files or contents.'} +                files = [{'name': 'null', 'path': os.devnull}]              ########              # Create @@ -1783,6 +1792,7 @@ def main():              debug=dict(default=False, type='bool'),              namespace=dict(default='default', type='str'),              name=dict(default=None, type='str'), +            annotations=dict(default=None, type='dict'),              type=dict(default=None, type='str'),              files=dict(default=None, type='list'),              delete_after=dict(default=False, type='bool'), diff --git a/roles/lib_openshift/src/ansible/oc_route.py b/roles/lib_openshift/src/ansible/oc_route.py index f2f5c5095..969cf8bcd 100644 --- a/roles/lib_openshift/src/ansible/oc_route.py +++ b/roles/lib_openshift/src/ansible/oc_route.py @@ -13,6 +13,7 @@ def main():              state=dict(default='present', type='str',                         choices=['present', 'absent', 'list']),              debug=dict(default=False, type='bool'), +            labels=dict(default=None, type='dict'),              name=dict(default=None, required=True, type='str'),              namespace=dict(default=None, required=True, type='str'),              tls_termination=dict(default=None, type='str'), diff --git a/roles/lib_openshift/src/ansible/oc_secret.py b/roles/lib_openshift/src/ansible/oc_secret.py index faa7c1772..ee2827e69 100644 --- a/roles/lib_openshift/src/ansible/oc_secret.py +++ b/roles/lib_openshift/src/ansible/oc_secret.py @@ -15,6 +15,7 @@ def main():              debug=dict(default=False, type='bool'),              namespace=dict(default='default', type='str'),              name=dict(default=None, type='str'), +            annotations=dict(default=None, type='dict'),              type=dict(default=None, type='str'),              files=dict(default=None, type='list'),              delete_after=dict(default=False, type='bool'), diff --git a/roles/lib_openshift/src/class/oc_route.py b/roles/lib_openshift/src/class/oc_route.py index 3a1bd732f..dc2f7977b 100644 --- a/roles/lib_openshift/src/class/oc_route.py +++ b/roles/lib_openshift/src/class/oc_route.py @@ -118,6 +118,7 @@ class OCRoute(OpenShiftCLI):          rconfig = RouteConfig(params['name'],                                params['namespace'],                                params['kubeconfig'], +                              params['labels'],                                files['destcacert']['value'],                                files['cacert']['value'],                                files['cert']['value'], diff --git a/roles/lib_openshift/src/class/oc_secret.py b/roles/lib_openshift/src/class/oc_secret.py index 4ee6443e9..5322d6241 100644 --- a/roles/lib_openshift/src/class/oc_secret.py +++ b/roles/lib_openshift/src/class/oc_secret.py @@ -142,8 +142,7 @@ class OCSecret(OpenShiftCLI):              elif params['contents']:                  files = Utils.create_tmp_files_from_contents(params['contents'])              else: -                return {'failed': True, -                        'msg': 'Either specify files or contents.'} +                files = [{'name': 'null', 'path': os.devnull}]              ########              # Create diff --git a/roles/lib_openshift/src/doc/route b/roles/lib_openshift/src/doc/route index a12999c9e..f0d38ab5f 100644 --- a/roles/lib_openshift/src/doc/route +++ b/roles/lib_openshift/src/doc/route @@ -39,6 +39,12 @@ options:      required: false      default: str      aliases: [] +  labels: +    description: +    - The labels to apply on the route +    required: false +    default: None +    aliases: []    tls_termination:      description:      - The options for termination. e.g. reencrypt diff --git a/roles/lib_openshift/src/doc/secret b/roles/lib_openshift/src/doc/secret index 76b147f6f..a27f90f38 100644 --- a/roles/lib_openshift/src/doc/secret +++ b/roles/lib_openshift/src/doc/secret @@ -39,6 +39,12 @@ options:      required: false      default: default      aliases: [] +  annotations: +    description: +    - Annotations to apply to the object +    required: false +    default: None +    aliases: []    files:      description:      - A list of files provided for secrets diff --git a/roles/lib_openshift/src/lib/route.py b/roles/lib_openshift/src/lib/route.py index 3b54a24fb..b106866cb 100644 --- a/roles/lib_openshift/src/lib/route.py +++ b/roles/lib_openshift/src/lib/route.py @@ -11,6 +11,7 @@ class RouteConfig(object):                   sname,                   namespace,                   kubeconfig, +                 labels=None,                   destcacert=None,                   cacert=None,                   cert=None, @@ -25,6 +26,7 @@ class RouteConfig(object):          self.kubeconfig = kubeconfig          self.name = sname          self.namespace = namespace +        self.labels = labels          self.host = host          self.tls_termination = tls_termination          self.destcacert = destcacert @@ -50,6 +52,8 @@ class RouteConfig(object):          self.data['metadata'] = {}          self.data['metadata']['name'] = self.name          self.data['metadata']['namespace'] = self.namespace +        if self.labels: +            self.data['metadata']['labels'] = self.labels          self.data['spec'] = {}          self.data['spec']['host'] = self.host diff --git a/roles/lib_openshift/src/lib/secret.py b/roles/lib_openshift/src/lib/secret.py index a1c202442..ad4b6aa36 100644 --- a/roles/lib_openshift/src/lib/secret.py +++ b/roles/lib_openshift/src/lib/secret.py @@ -10,13 +10,15 @@ class SecretConfig(object):                   namespace,                   kubeconfig,                   secrets=None, -                 stype=None): +                 stype=None, +                 annotations=None):          ''' constructor for handling secret options '''          self.kubeconfig = kubeconfig          self.name = sname          self.type = stype          self.namespace = namespace          self.secrets = secrets +        self.annotations = annotations          self.data = {}          self.create_dict() @@ -33,6 +35,8 @@ class SecretConfig(object):          if self.secrets:              for key, value in self.secrets.items():                  self.data['data'][key] = value +        if self.annotations: +            self.data['metadata']['annotations'] = self.annotations  # pylint: disable=too-many-instance-attributes  class Secret(Yedit): diff --git a/roles/lib_openshift/src/test/unit/test_oc_route.py b/roles/lib_openshift/src/test/unit/test_oc_route.py index afdb5e4dc..5699f123b 100755 --- a/roles/lib_openshift/src/test/unit/test_oc_route.py +++ b/roles/lib_openshift/src/test/unit/test_oc_route.py @@ -39,6 +39,7 @@ class OCRouteTest(unittest.TestCase):              'debug': False,              'name': 'test',              'namespace': 'default', +            'labels': {'route': 'route'},              'tls_termination': 'passthrough',              'dest_cacert_path': None,              'cacert_path': None, @@ -64,7 +65,10 @@ class OCRouteTest(unittest.TestCase):                  "selfLink": "/oapi/v1/namespaces/default/routes/test",                  "uid": "1b127c67-ecd9-11e6-96eb-0e0d9bdacd26",                  "resourceVersion": "439182", -                "creationTimestamp": "2017-02-07T01:59:48Z" +                "creationTimestamp": "2017-02-07T01:59:48Z", +                "labels": { +                    "route": "route" +                }              },              "spec": {                  "host": "test.example", @@ -141,6 +145,7 @@ class OCRouteTest(unittest.TestCase):              'debug': False,              'name': 'test',              'namespace': 'default', +            'labels': {'route': 'route'},              'tls_termination': 'edge',              'dest_cacert_path': None,              'cacert_path': None, @@ -166,7 +171,8 @@ class OCRouteTest(unittest.TestCase):                      "namespace": "default",                      "resourceVersion": "517745",                      "selfLink": "/oapi/v1/namespaces/default/routes/test", -                    "uid": "b6f25898-ed77-11e6-9755-0e737db1e63a" +                    "uid": "b6f25898-ed77-11e6-9755-0e737db1e63a", +                    "labels": {"route": "route"}                  },                  "spec": {                      "host": "test.openshift.com", @@ -250,6 +256,7 @@ metadata:          self.assertTrue(results['changed'])          self.assertEqual(results['state'], 'present')          self.assertEqual(results['results']['results'][0]['metadata']['name'], 'test') +        self.assertEqual(results['results']['results'][0]['metadata']['labels']['route'], 'route')          # Making sure our mock was called as we expected          mock_cmd.assert_has_calls([ diff --git a/roles/openshift_logging/filter_plugins/openshift_logging.py b/roles/openshift_logging/filter_plugins/openshift_logging.py index eac086e81..330e7e59a 100644 --- a/roles/openshift_logging/filter_plugins/openshift_logging.py +++ b/roles/openshift_logging/filter_plugins/openshift_logging.py @@ -45,6 +45,21 @@ def map_from_pairs(source, delim="="):      return dict(item.split(delim) for item in source.split(",")) +def serviceaccount_name(qualified_sa): +    ''' Returns the simple name from a fully qualified name ''' +    return qualified_sa.split(":")[-1] + + +def serviceaccount_namespace(qualified_sa, default=None): +    ''' Returns the namespace from a fully qualified name ''' +    seg = qualified_sa.split(":") +    if len(seg) > 1: +        return seg[-2] +    if default: +        return default +    return seg[-1] + +  # pylint: disable=too-few-public-methods  class FilterModule(object):      ''' OpenShift Logging Filters ''' @@ -56,5 +71,7 @@ class FilterModule(object):              'random_word': random_word,              'entry_from_named_pair': entry_from_named_pair,              'map_from_pairs': map_from_pairs, -            'es_storage': es_storage +            'es_storage': es_storage, +            'serviceaccount_name': serviceaccount_name, +            'serviceaccount_namespace': serviceaccount_namespace          } diff --git a/roles/openshift_logging/tasks/delete_logging.yaml b/roles/openshift_logging/tasks/delete_logging.yaml index 3040d15ca..ffed956a4 100644 --- a/roles/openshift_logging/tasks/delete_logging.yaml +++ b/roles/openshift_logging/tasks/delete_logging.yaml @@ -92,6 +92,7 @@    with_items:      - rolebinding-reader      - daemonset-admin +    - prometheus-metrics-viewer  # delete our configmaps  - name: delete configmaps diff --git a/roles/openshift_logging/tasks/generate_certs.yaml b/roles/openshift_logging/tasks/generate_certs.yaml index 9c8f0986a..f526fd734 100644 --- a/roles/openshift_logging/tasks/generate_certs.yaml +++ b/roles/openshift_logging/tasks/generate_certs.yaml @@ -139,10 +139,10 @@  # TODO: make idempotent  - name: Generate proxy session -  set_fact: session_secret={{'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'|random_word(200)}} +  set_fact: session_secret={{ 200 | oo_random_word}}    check_mode: no  # TODO: make idempotent  - name: Generate oauth client secret -  set_fact: oauth_secret={{'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'|random_word(64)}} +  set_fact: oauth_secret={{ 64 | oo_random_word}}    check_mode: no diff --git a/roles/openshift_logging/tasks/install_logging.yaml b/roles/openshift_logging/tasks/install_logging.yaml index 2695ef030..a3e653cb8 100644 --- a/roles/openshift_logging/tasks/install_logging.yaml +++ b/roles/openshift_logging/tasks/install_logging.yaml @@ -74,8 +74,6 @@      openshift_logging_elasticsearch_replica_count: "{{ openshift_logging_es_cluster_size | int }}"      openshift_logging_elasticsearch_storage_type: "{{ elasticsearch_storage_type }}" -    openshift_logging_elasticsearch_pvc_size: "{{ openshift_logging_es_pvc_size }}" -    openshift_logging_elasticsearch_pvc_dynamic: "{{ openshift_logging_es_pvc_dynamic }}"      openshift_logging_elasticsearch_pvc_pv_selector: "{{ openshift_logging_es_pv_selector }}"    with_together: @@ -95,8 +93,6 @@      openshift_logging_elasticsearch_replica_count: "{{ openshift_logging_es_cluster_size | int }}"      openshift_logging_elasticsearch_storage_type: "{{ elasticsearch_storage_type }}" -    openshift_logging_elasticsearch_pvc_size: "{{ openshift_logging_es_pvc_size }}" -    openshift_logging_elasticsearch_pvc_dynamic: "{{ openshift_logging_es_pvc_dynamic }}"      openshift_logging_elasticsearch_pvc_pv_selector: "{{ openshift_logging_es_pv_selector }}"    with_sequence: count={{ openshift_logging_es_cluster_size | int - openshift_logging_facts.elasticsearch.deploymentconfigs.keys() | count }} diff --git a/roles/openshift_logging/vars/openshift-enterprise.yml b/roles/openshift_logging/vars/openshift-enterprise.yml index 49e8a18af..f60fa8d7d 100644 --- a/roles/openshift_logging/vars/openshift-enterprise.yml +++ b/roles/openshift_logging/vars/openshift-enterprise.yml @@ -1,3 +1,3 @@  ---  __openshift_logging_image_prefix: "{{ openshift_hosted_logging_deployer_prefix | default('registry.access.redhat.com/openshift3/') }}" -__openshift_logging_image_version: "{{ openshift_hosted_logging_deployer_version | default ('v3.6') }}" +__openshift_logging_image_version: "{{ openshift_hosted_logging_deployer_version | default ('v3.7') }}" diff --git a/roles/openshift_logging_elasticsearch/defaults/main.yml b/roles/openshift_logging_elasticsearch/defaults/main.yml index 75bd479be..72d5cab96 100644 --- a/roles/openshift_logging_elasticsearch/defaults/main.yml +++ b/roles/openshift_logging_elasticsearch/defaults/main.yml @@ -6,7 +6,7 @@ openshift_logging_elasticsearch_image_pull_secret: "{{ openshift_hosted_logging_  openshift_logging_elasticsearch_namespace: logging  openshift_logging_elasticsearch_nodeselector: "{{ openshift_logging_es_nodeselector | default('') }}" -openshift_logging_elasticsearch_cpu_limit: 1000m +openshift_logging_elasticsearch_cpu_limit: "{{ openshift_logging_es_cpu_limit | default('1000m') }}"  openshift_logging_elasticsearch_memory_limit: "{{ openshift_logging_es_memory_limit | default('1Gi') }}"  openshift_logging_elasticsearch_recover_after_time: "{{ openshift_logging_es_recover_after_time | default('5m') }}" @@ -40,6 +40,12 @@ openshift_logging_es_pvc_prefix: "{{ openshift_hosted_logging_elasticsearch_pvc_  # config the es plugin to write kibana index based on the index mode  openshift_logging_elasticsearch_kibana_index_mode: 'unique' +openshift_logging_elasticsearch_proxy_image_prefix: "openshift/oauth-proxy" +openshift_logging_elasticsearch_proxy_image_version: "v1.0.0" +openshift_logging_elasticsearch_proxy_cpu_limit: "100m" +openshift_logging_elasticsearch_proxy_memory_limit: "64Mi" +openshift_logging_elasticsearch_prometheus_sa: "system:serviceaccount:{{openshift_prometheus_namespace | default('prometheus')}}:prometheus" +  # this is used to determine if this is an operations deployment or a non-ops deployment  # simply used for naming purposes  openshift_logging_elasticsearch_ops_deployment: false diff --git a/roles/openshift_logging_elasticsearch/tasks/main.yaml b/roles/openshift_logging_elasticsearch/tasks/main.yaml index 1e800b1d6..e0049998c 100644 --- a/roles/openshift_logging_elasticsearch/tasks/main.yaml +++ b/roles/openshift_logging_elasticsearch/tasks/main.yaml @@ -37,6 +37,7 @@  # we want to make sure we have all the necessary components here  # service account +  - name: Create ES service account    oc_serviceaccount:      state: present @@ -77,6 +78,38 @@      resource_name: rolebinding-reader      user: "system:serviceaccount:{{ openshift_logging_elasticsearch_namespace }}:aggregated-logging-elasticsearch" +- oc_adm_policy_user: +    state: present +    namespace: "{{ openshift_logging_elasticsearch_namespace }}" +    resource_kind: cluster-role +    resource_name: system:auth-delegator +    user: "system:serviceaccount:{{ openshift_logging_elasticsearch_namespace}}:aggregated-logging-elasticsearch" + +# logging-metrics-reader role +- template: +    src: logging-metrics-role.j2 +    dest: "{{mktemp.stdout}}/templates/logging-metrics-role.yml" +  vars: +    namespace: "{{ openshift_logging_elasticsearch_namespace }}" +    role_namespace: "{{ openshift_logging_elasticsearch_prometheus_sa | serviceaccount_namespace(openshift_logging_elasticsearch_namespace) }}" +    role_user: "{{ openshift_logging_elasticsearch_prometheus_sa | serviceaccount_name }}" + +- name: Create logging-metrics-reader-role +  command: > +    {{ openshift.common.client_binary }} +    --config={{ openshift.common.config_base }}/master/admin.kubeconfig +    -n "{{ openshift_logging_elasticsearch_namespace }}" +    create -f "{{mktemp.stdout}}/templates/logging-metrics-role.yml" +  register: prometheus_out +  check_mode: no +  ignore_errors: yes + +- fail: +    msg: "There was an error creating the logging-metrics-role and binding: {{prometheus_out}}" +  when: +  - "prometheus_out.stderr | length > 0" +  - "'already exists' not in prometheus_out.stderr" +  # View role and binding  - name: Generate logging-elasticsearch-view-role    template: @@ -206,6 +239,32 @@      - port: 9200        targetPort: "restapi" +- name: Set logging-{{ es_component}}-prometheus service +  oc_service: +    state: present +    name: "logging-{{es_component}}-prometheus" +    namespace: "{{ openshift_logging_elasticsearch_namespace }}" +    labels: +      logging-infra: 'support' +    ports: +    - name: proxy +      port: 443 +      targetPort: 4443 +    selector: +      component: "{{ es_component }}-prometheus" +      provider: openshift + +- oc_edit: +    kind: service +    name: "logging-{{es_component}}-prometheus" +    namespace: "{{ openshift_logging_elasticsearch_namespace }}" +    separator: '#' +    content: +      metadata#annotations#service.alpha.openshift.io/serving-cert-secret-name: "prometheus-tls" +      metadata#annotations#prometheus.io/scrape: "true" +      metadata#annotations#prometheus.io/scheme: "https" +      metadata#annotations#prometheus.io/path: "_prometheus/metrics" +  - name: Check to see if PVC already exists    oc_obj:      state: list @@ -260,7 +319,7 @@        delete_after: true  - set_fact: -    es_deploy_name: "logging-{{ es_component }}-{{ openshift_logging_elasticsearch_deployment_type }}-{{ 'abcdefghijklmnopqrstuvwxyz0123456789' | random_word(8) }}" +    es_deploy_name: "logging-{{ es_component }}-{{ openshift_logging_elasticsearch_deployment_type }}-{{ 8 | oo_random_word('abcdefghijklmnopqrstuvwxyz0123456789') }}"    when: openshift_logging_elasticsearch_deployment_name == ""  - set_fact: diff --git a/roles/openshift_logging_elasticsearch/templates/es.j2 b/roles/openshift_logging_elasticsearch/templates/es.j2 index 3c8f390c4..cca5bf8a3 100644 --- a/roles/openshift_logging_elasticsearch/templates/es.j2 +++ b/roles/openshift_logging_elasticsearch/templates/es.j2 @@ -37,6 +37,40 @@ spec:  {% endfor %}  {% endif %}        containers: +        - name: proxy +          image: {{openshift_logging_elasticsearch_proxy_image_prefix}}:{{openshift_logging_elasticsearch_proxy_image_version}} +          imagePullPolicy: Always +          args: +           - --upstream-ca=/etc/elasticsearch/secret/admin-ca +           - --https-address=:4443 +           - -provider=openshift +           - -client-id={{openshift_logging_elasticsearch_prometheus_sa}} +           - -client-secret-file=/var/run/secrets/kubernetes.io/serviceaccount/token +           - -cookie-secret={{ 16 | oo_random_word | b64encode }} +           - -upstream=https://localhost:9200 +           - '-openshift-sar={"namespace": "{{ openshift_logging_elasticsearch_namespace}}", "verb": "view", "resource": "prometheus", "group": "metrics.openshift.io"}' +           - '-openshift-delegate-urls={"/": {"resource": "prometheus", "verb": "view", "group": "metrics.openshift.io", "namespace": "{{ openshift_logging_elasticsearch_namespace}}"}}' +           - --tls-cert=/etc/tls/private/tls.crt +           - --tls-key=/etc/tls/private/tls.key +           - -pass-access-token +           - -pass-user-headers +          ports: +          - containerPort: 4443 +            name: proxy +            protocol: TCP +          volumeMounts: +          - mountPath: /etc/tls/private +            name: proxy-tls +            readOnly: true +          - mountPath: /etc/elasticsearch/secret +            name: elasticsearch +            readOnly: true +          resources: +            limits: +              cpu: "{{openshift_logging_elasticsearch_proxy_cpu_limit }}" +              memory: "{{openshift_logging_elasticsearch_proxy_memory_limit }}" +            requests: +              memory: "{{openshift_logging_elasticsearch_proxy_memory_limit }}"          -            name: "elasticsearch"            image: {{image}} @@ -94,7 +128,7 @@ spec:                value: "30"              -                name: "POD_LABEL" -              value: "component={{component}}"  +              value: "component={{component}}"              -                name: "IS_MASTER"                value: "{% if deploy_type in ['data-master', 'master'] %}true{% else %}false{% endif %}" @@ -102,6 +136,9 @@ spec:              -                name: "HAS_DATA"                value: "{% if deploy_type in ['data-master', 'data-client'] %}true{% else %}false{% endif %}" +            - +              name: "PROMETHEUS_USER" +              value: "{{openshift_logging_elasticsearch_prometheus_sa}}"            volumeMounts:              - name: elasticsearch @@ -120,6 +157,9 @@ spec:              timeoutSeconds: 30              periodSeconds: 5        volumes: +        - name: proxy-tls +          secret: +            secretName: prometheus-tls          - name: elasticsearch            secret:              secretName: logging-elasticsearch diff --git a/roles/openshift_logging_elasticsearch/templates/logging-metrics-role.j2 b/roles/openshift_logging_elasticsearch/templates/logging-metrics-role.j2 new file mode 100644 index 000000000..d9800e5a5 --- /dev/null +++ b/roles/openshift_logging_elasticsearch/templates/logging-metrics-role.j2 @@ -0,0 +1,31 @@ +--- +apiVersion: v1 +kind: List +items: +- apiVersion: rbac.authorization.k8s.io/v1beta1 +  kind: Role +  metadata: +    annotations: +      rbac.authorization.kubernetes.io/autoupdate: "true" +    name: prometheus-metrics-viewer +    namespace: {{ namespace }} +  rules: +  - apiGroups: +    - metrics.openshift.io +    resources: +    - prometheus +    verbs: +    - view +- apiVersion: rbac.authorization.k8s.io/v1beta1 +  kind: RoleBinding +  metadata: +    name: prometheus-metrics-viewer +    namespace: {{ namespace }} +  roleRef: +    apiGroup: rbac.authorization.k8s.io +    kind: Role +    name: prometheus-metrics-viewer +  subjects: +  - kind: ServiceAccount +    namespace: {{ role_namespace }} +    name: {{ role_user }} diff --git a/roles/openshift_metrics/vars/openshift-enterprise.yml b/roles/openshift_metrics/vars/openshift-enterprise.yml index 68cdf06fe..5a1728de5 100644 --- a/roles/openshift_metrics/vars/openshift-enterprise.yml +++ b/roles/openshift_metrics/vars/openshift-enterprise.yml @@ -1,3 +1,3 @@  ---  __openshift_metrics_image_prefix: "registry.access.redhat.com/openshift3/" -__openshift_metrics_image_version: "v3.6" +__openshift_metrics_image_version: "v3.7" diff --git a/roles/openshift_named_certificates/tasks/named_certificates.yml b/roles/openshift_named_certificates/tasks/named_certificates.yml deleted file mode 100644 index 7b097b443..000000000 --- a/roles/openshift_named_certificates/tasks/named_certificates.yml +++ /dev/null @@ -1,32 +0,0 @@ ---- -- name: Clear named certificates -  file: -    path: "{{ named_certs_dir }}" -    state: absent -  when: overwrite_named_certs | bool - -- name: Ensure named certificate directory exists -  file: -    path: "{{ named_certs_dir }}" -    state: directory -    mode: 0700 - -- name: Land named certificates -  copy: -    src: "{{ item.certfile }}" -    dest: "{{ named_certs_dir }}" -  with_items: "{{ openshift_master_named_certificates | default([]) }}" - -- name: Land named certificate keys -  copy: -    src: "{{ item.keyfile }}" -    dest: "{{ named_certs_dir }}" -    mode: 0600 -  with_items: "{{ openshift_master_named_certificates | default([]) }}" - -- name: Land named CA certificates -  copy: -    src: "{{ item }}" -    dest: "{{ named_certs_dir }}" -    mode: 0600 -  with_items: "{{ openshift_master_named_certificates | default([]) | oo_collect('cafile') }}" diff --git a/roles/openshift_sanitize_inventory/filter_plugins/openshift_logging.py b/roles/openshift_sanitize_inventory/filter_plugins/openshift_logging.py deleted file mode 100644 index d42c9bdb9..000000000 --- a/roles/openshift_sanitize_inventory/filter_plugins/openshift_logging.py +++ /dev/null @@ -1,25 +0,0 @@ -''' - Openshift Logging class that provides useful filters used in Logging. - - This should be removed after map_from_pairs is no longer used in __deprecations_logging.yml -''' - - -def map_from_pairs(source, delim="="): -    ''' Returns a dict given the source and delim delimited ''' -    if source == '': -        return dict() - -    return dict(item.split(delim) for item in source.split(",")) - - -# pylint: disable=too-few-public-methods -class FilterModule(object): -    ''' OpenShift Logging Filters ''' - -    # pylint: disable=no-self-use, too-few-public-methods -    def filters(self): -        ''' Returns the names of the filters provided by this class ''' -        return { -            'map_from_pairs': map_from_pairs -        } diff --git a/roles/openshift_sanitize_inventory/filter_plugins/openshift_sanitize_inventory.py b/roles/openshift_sanitize_inventory/filter_plugins/openshift_sanitize_inventory.py new file mode 100644 index 000000000..72c47b8ee --- /dev/null +++ b/roles/openshift_sanitize_inventory/filter_plugins/openshift_sanitize_inventory.py @@ -0,0 +1,44 @@ +''' + Openshift Sanitize inventory class that provides useful filters used in Logging. +''' + + +import re + + +# This should be removed after map_from_pairs is no longer used in __deprecations_logging.yml +def map_from_pairs(source, delim="="): +    ''' Returns a dict given the source and delim delimited ''' +    if source == '': +        return dict() + +    return dict(item.split(delim) for item in source.split(",")) + + +def vars_with_pattern(source, pattern=""): +    ''' Returns a list of variables whose name matches the given pattern ''' +    if source == '': +        return list() + +    var_list = list() + +    var_pattern = re.compile(pattern) + +    for item in source: +        if var_pattern.match(item): +            var_list.append(item) + +    return var_list + + +# pylint: disable=too-few-public-methods +class FilterModule(object): +    ''' OpenShift Logging Filters ''' + +    # pylint: disable=no-self-use, too-few-public-methods +    def filters(self): +        ''' Returns the names of the filters provided by this class ''' +        return { +            'map_from_pairs': map_from_pairs, +            'vars_with_pattern': vars_with_pattern +        } diff --git a/roles/openshift_sanitize_inventory/tasks/unsupported.yml b/roles/openshift_sanitize_inventory/tasks/unsupported.yml index 24e44ea85..39bf1780a 100644 --- a/roles/openshift_sanitize_inventory/tasks/unsupported.yml +++ b/roles/openshift_sanitize_inventory/tasks/unsupported.yml @@ -10,3 +10,25 @@        Starting in 3.6 openshift_use_dnsmasq must be true or critical features        will not function. This also means that NetworkManager must be installed        enabled and responsible for management of the primary interface. + +- set_fact: +    __using_dynamic: True +  when: +  - hostvars[inventory_hostname][item] in ['dynamic'] +  with_items: +  - "{{ hostvars[inventory_hostname] | vars_with_pattern(pattern='openshift_.*_storage_kind') }}" + +- name: Ensure that dynamic provisioning is set if using dynamic storage +  when: +  - dynamic_volumes_check | default(true) | bool +  - not openshift_master_dynamic_provisioning_enabled | default(false) | bool +  - not openshift_cloudprovider_kind is defined +  - __using_dynamic is defined and __using_dynamic | bool +  fail: +    msg: |- +      Using a storage kind of 'dynamic' without enabling dynamic provisioning nor +      setting a cloud provider will cause generated PVCs to not be able to bind as +      intended. Either update to not use a dynamic storage or set +      openshift_master_dynamic_provisioning_enabled to True and set an +      openshift_cloudprovider_kind. You can disable this check with +      'dynamic_volumes_check=False'.  | 
