This is an automated email from the ASF dual-hosted git repository. cbickel pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-openwhisk.git
The following commit(s) were added to refs/heads/master by this push: new 818cebf Refactor invoker roles (#3785) 818cebf is described below commit 818cebf941e66beef553e79831740f8632e78c68 Author: James Dubee <jwdu...@us.ibm.com> AuthorDate: Fri Jul 6 10:01:33 2018 -0400 Refactor invoker roles (#3785) * Refactor invoker roles * Make invoker environment variable name generic * Use base index for invoker name --- ansible/invoker.yml | 22 ++++++++++++++- ansible/roles/invoker/tasks/clean.yml | 19 ++++++++----- ansible/roles/invoker/tasks/deploy.yml | 51 ++++++++++++++++++++-------------- 3 files changed, 63 insertions(+), 29 deletions(-) diff --git a/ansible/invoker.yml b/ansible/invoker.yml index 479764d..9ab49e2 100644 --- a/ansible/invoker.yml +++ b/ansible/invoker.yml @@ -4,5 +4,25 @@ # This playbook deploys Openwhisk Invokers. - hosts: invokers + vars: + # + # host_group - usually "{{ groups['...'] }}" where '...' is what was used + # for 'hosts' above. The hostname of each host will be looked up in this + # group to assign a zero-based index. That index will be used in concert + # with 'name_prefix' below to assign a host/container name. + host_group: "{{ groups['invokers'] }}" + # + # name_prefix - a unique prefix for this set of invokers. The prefix + # will be used in combination with an index (determined using + # 'host_group' above) to name host/invokers. + name_prefix: "invoker" + # + # invoker_index_base - the deployment process allocates host docker + # ports to individual invokers based on their indices. This is an + # additional offset to prevent collisions between different invoker + # groups. Usually 0 if only one group is being deployed, otherwise + # something like "{{ groups['firstinvokergroup']|length }}" + invoker_index_base: 0 + roles: - - invoker + - invoker diff --git a/ansible/roles/invoker/tasks/clean.yml b/ansible/roles/invoker/tasks/clean.yml index d9b2db3..9df25e7 100644 --- a/ansible/roles/invoker/tasks/clean.yml +++ b/ansible/roles/invoker/tasks/clean.yml @@ -3,9 +3,14 @@ --- # Remove invoker containers. +- name: get invoker name and index + set_fact: + invoker_name: "{{ name_prefix ~ ((invoker_index_base | int) + host_group.index(inventory_hostname)) }}" + invoker_index: "{{ (invoker_index_base | int) + host_group.index(inventory_hostname) }}" + - name: remove invoker docker_container: - name: "invoker{{ groups['invokers'].index(inventory_hostname) }}" + name: "{{ invoker_name }}" image: "{{ docker_registry }}{{ docker.image.prefix }}/invoker:{{ docker.image.tag }}" state: absent stop_timeout: 60 @@ -15,9 +20,9 @@ # In case the invoker could not clean up completely in time. - name: pause/resume at runc-level to restore docker consistency shell: | - DOCKER_PAUSED=$(docker ps --filter status=paused --filter name=wsk{{ groups['invokers'].index(inventory_hostname) }} -q --no-trunc) + DOCKER_PAUSED=$(docker ps --filter status=paused --filter name=wsk{{ invoker_index }} -q --no-trunc) for C in $DOCKER_PAUSED; do docker-runc pause $C; done - DOCKER_RUNNING=$(docker ps --filter status=running --filter name=wsk{{ groups['invokers'].index(inventory_hostname) }} -q --no-trunc) + DOCKER_RUNNING=$(docker ps --filter status=running --filter name=wsk{{ invoker_index }} -q --no-trunc) for C2 in $DOCKER_RUNNING; do docker-runc resume $C2; done TOTAL=$(($(echo $DOCKER_PAUSED | wc -w)+$(echo $DOCKER_RUNNING | wc -w))) echo "Handled $TOTAL remaining actions." @@ -28,22 +33,22 @@ - debug: msg="{{ runc_output.stdout }}" - name: unpause remaining actions - shell: "docker unpause $(docker ps -aq --filter status=paused --filter name=wsk{{ groups['invokers'].index(inventory_hostname) }})" + shell: "docker unpause $(docker ps -aq --filter status=paused --filter name=wsk{{ invoker_index }})" failed_when: False - name: remove remaining actions - shell: "docker rm -f $(docker ps -aq --filter name=wsk{{ groups['invokers'].index(inventory_hostname) }})" + shell: "docker rm -f $(docker ps -aq --filter name=wsk{{ invoker_index }})" failed_when: False - name: remove invoker log directory file: - path: "{{ whisk_logs_dir }}/invoker{{ groups['invokers'].index(inventory_hostname) }}" + path: "{{ whisk_logs_dir }}/{{ invoker_name }}" state: absent become: "{{ logs.dir.become }}" - name: remove invoker conf directory file: - path: "{{ invoker.confdir }}/invoker{{ groups['invokers'].index(inventory_hostname) }}" + path: "{{ invoker.confdir }}/{{ invoker_name }}" state: absent become: "{{ invoker.dir.become }}" diff --git a/ansible/roles/invoker/tasks/deploy.yml b/ansible/roles/invoker/tasks/deploy.yml index d7afdce..65d741c 100644 --- a/ansible/roles/invoker/tasks/deploy.yml +++ b/ansible/roles/invoker/tasks/deploy.yml @@ -5,6 +5,11 @@ - import_tasks: docker_login.yml +- name: get invoker name and index + set_fact: + invoker_name: "{{ name_prefix ~ ((invoker_index_base | int) + host_group.index(inventory_hostname)) }}" + invoker_index: "{{ (invoker_index_base | int) + host_group.index(inventory_hostname) }}" + - name: "pull invoker image with tag {{docker.image.tag}}" shell: "docker pull {{docker_registry}}{{ docker.image.prefix }}/invoker:{{docker.image.tag}}" when: docker_registry != "" @@ -63,14 +68,14 @@ - name: ensure invoker log directory is created with permissions file: - path: "{{ whisk_logs_dir }}/invoker{{ groups['invokers'].index(inventory_hostname) }}" + path: "{{ whisk_logs_dir }}/{{ invoker_name }}" state: directory mode: 0777 become: "{{ logs.dir.become }}" - name: ensure invoker config directory is created with permissions file: - path: "{{ invoker.confdir }}/invoker{{ groups['invokers'].index(inventory_hostname) }}" + path: "{{ invoker.confdir }}/{{ invoker_name }}" state: directory mode: 0777 become: "{{ invoker.dir.become }}" @@ -79,7 +84,7 @@ when: kafka.protocol == 'SSL' copy: src: "{{ openwhisk_home }}/ansible/roles/kafka/files/{{ kafka.ssl.keystore.name }}" - dest: "{{ invoker.confdir }}/invoker{{ groups['invokers'].index(inventory_hostname) }}" + dest: "{{ invoker.confdir }}/{{ invoker_name }}" - name: check, that required databases exist include_tasks: "{{ openwhisk_home }}/ansible/tasks/db/checkDb.yml" @@ -124,20 +129,20 @@ fail: msg: "invoker index is invalid. expected: /invoker{{ groups['invokers'].index(inventory_hostname) }} found: {{ item.Names[0] }}" with_items: "{{ invokerInfo }}" - when: not invoker.allowMultipleInstances and item.Names[0] != "/invoker{{ groups['invokers'].index(inventory_hostname) }}" + when: not invoker.allowMultipleInstances and item.Names[0] != "/{{ invoker_name }}" - name: copy jmxremote password file when: jmx.enabled template: src: "jmxremote.password.j2" - dest: "{{ invoker.confdir }}/invoker{{ groups['invokers'].index(inventory_hostname) }}/jmxremote.password" + dest: "{{ invoker.confdir }}/{{ invoker_name }}/jmxremote.password" mode: 0777 - name: copy jmxremote access file when: jmx.enabled template: src: "jmxremote.access.j2" - dest: "{{ invoker.confdir }}/invoker{{ groups['invokers'].index(inventory_hostname) }}/jmxremote.access" + dest: "{{ invoker.confdir }}/{{ invoker_name }}/jmxremote.access" mode: 0777 - name: add additional jvm params if jmxremote is enabled @@ -147,20 +152,20 @@ - name: prepare invoker ports set_fact: - ports_to_expose: ["{{ invoker.port + groups['invokers'].index(inventory_hostname) }}:8080"] + ports_to_expose: ["{{ invoker.port + (invoker_index | int) }}:8080"] - name: expose additional ports if jmxremote is enabled when: jmx.enabled set_fact: - ports_to_expose: "{{ ports_to_expose }} + [ \"{{ jmx.basePortInvoker + groups['invokers'].index(inventory_hostname) }}:{{ jmx.basePortInvoker + groups['invokers'].index(inventory_hostname) }}\" ] + [ \"{{ jmx.rmiBasePortInvoker + groups['invokers'].index(inventory_hostname) }}:{{ jmx.rmiBasePortInvoker + groups['invokers'].index(inventory_hostname) }}\" ]" + ports_to_expose: "{{ ports_to_expose }} + [ \"{{ jmx.basePortInvoker + (invoker_index | int) }}:{{ jmx.basePortInvoker + (invoker_index | int) }}\" ] + [ \"{{ jmx.rmiBasePortInvoker + (invoker_index | int) }}:{{ jmx.rmiBasePortInvoker + (invoker_index | int) }}\" ]" -- name: prepare invoker env +- name: populate environment variables for invoker set_fact: - invoker_env: + env: "JAVA_OPTS": "-Xmx{{ invoker.heap }} -XX:+CrashOnOutOfMemoryError -XX:+UseGCOverheadLimit -XX:ErrorFile=/logs/java_error.log" "INVOKER_OPTS": "{{ invoker_args | default(invoker.arguments) }}" "JMX_REMOTE": "{{ jmx.enabled }}" - "COMPONENT_NAME": "invoker{{ groups['invokers'].index(inventory_hostname) }}" + "COMPONENT_NAME": "{{ invoker_name }}" "PORT": 8080 "KAFKA_HOSTS": "{{ kafka_connect_string }}" "CONFIG_whisk_kafka_replicationFactor": "{{ kafka.replicationFactor | default() }}" @@ -201,7 +206,7 @@ "CONFIG_whisk_containerPool_numCore": "{{ invoker.numcore }}" "CONFIG_whisk_containerPool_coreShare": "{{ invoker.coreshare }}" "CONFIG_whisk_docker_containerFactory_useRunc": "{{ invoker.useRunc }}" - "INVOKER_NAME": "{{ groups['invokers'].index(inventory_hostname) }}" + "INVOKER_NAME": "{{ invoker_index }}" "WHISK_LOGS_DIR": "{{ whisk_logs_dir }}" "METRICS_KAMON": "{{ metrics.kamon.enabled }}" "METRICS_KAMON_TAGS": "{{ metrics.kamon.tags }}" @@ -221,18 +226,22 @@ - name: extend invoker dns env set_fact: - invoker_env: "{{ invoker_env | default({}) | combine( {'CONFIG_whisk_containerFactory_containerArgs_dnsServers_' ~ item.0: item.1} ) }}" + env: "{{ env | default({}) | combine( {'CONFIG_whisk_containerFactory_containerArgs_dnsServers_' ~ item.0: item.1} ) }}" with_indexed_items: "{{ (invoker_container_network_dns_servers | default()).split(' ')}}" - name: merge extra env variables set_fact: - invoker_env: "{{ invoker_env | combine(invoker.extraEnv) }}" + env: "{{ env | combine(invoker.extraEnv) }}" + +- name: include plugins + include_tasks: "{{ item }}.yml" + with_items: "{{ invoker_plugins | default([]) }}" - name: set invoker volumes set_fact: volumes: "/sys/fs/cgroup:/sys/fs/cgroup,/run/runc:/run/runc,\ - {{ whisk_logs_dir }}/invoker{{ groups['invokers'].index(inventory_hostname) }}:/logs,\ - {{ invoker.confdir }}/invoker{{ groups['invokers'].index(inventory_hostname) }}:/conf,\ + {{ whisk_logs_dir }}/{{ invoker_name }}:/logs,\ + {{ invoker.confdir }}/{{ invoker_name }}:/conf,\ {{ dockerInfo['DockerRootDir'] }}/containers/:/containers,\ {{ docker_sock | default('/var/run/docker.sock') }}:/var/run/docker.sock" @@ -246,20 +255,20 @@ userns_mode: "host" pid_mode: "host" privileged: "yes" - name: invoker{{ groups['invokers'].index(inventory_hostname) }} - hostname: "invoker{{ groups['invokers'].index(inventory_hostname) }}" + name: "{{ invoker_name }}" + hostname: "{{ invoker_name }}" restart_policy: "{{ docker.restart.policy }}" image: "{{ docker_registry }}{{ docker.image.prefix }}/invoker:{{ docker.image.tag }}" state: started recreate: true - env: "{{ invoker_env }}" + env: "{{ env }}" volumes: "{{ volumes }}" ports: "{{ ports_to_expose }}" - command: /bin/sh -c "exec /init.sh {{ groups['invokers'].index(inventory_hostname) }} >> /logs/invoker{{ groups['invokers'].index(inventory_hostname) }}_logs.log 2>&1" + command: /bin/sh -c "exec /init.sh {{ invoker_index }} >> /logs/{{ invoker_name }}_logs.log 2>&1" - name: wait until Invoker is up and running uri: - url: "http://{{ ansible_host }}:{{ invoker.port + groups['invokers'].index(inventory_hostname) }}/ping" + url: "http://{{ ansible_host }}:{{ invoker.port + (invoker_index | int) }}/ping" register: result until: result.status == 200 retries: 12