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 <[email protected]>
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