blob: 8d18931b012d5562a97e832ff62af81e07d03be3 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
# license agreements; and to You under the Apache License, Version 2.0.
---
# This role will install Controller in group 'controllers' in the environment
# inventory
- import_tasks: docker_login.yml
- name: get controller name and index
set_fact:
controller_name: "{{ name_prefix ~ host_group.index(inventory_hostname) }}"
controller_index:
"{{ (controller_index_base|int) + host_group.index(inventory_hostname) }}"
- name: "pull the {{ docker.image.tag }} image of controller"
shell: "docker pull {{docker_registry}}{{ docker.image.prefix }}/controller:{{docker.image.tag}}"
when: docker_registry != ""
register: result
until: (result.rc == 0)
retries: "{{ docker.pull.retries }}"
delay: "{{ docker.pull.delay }}"
- name: ensure controller log directory is created with permissions
file:
path: "{{ whisk_logs_dir }}/{{ controller_name }}"
state: directory
mode: 0777
become: "{{ logs.dir.become }}"
- name: ensure controller config directory is created with permissions
file:
path: "{{ controller.confdir }}/{{ controller_name }}"
state: directory
mode: 0777
become: "{{ controller.dir.become }}"
- name: copy jmxremote password file
when: jmx.enabled
template:
src: "jmxremote.password.j2"
dest: "{{ controller.confdir }}/{{ controller_name }}/jmxremote.password"
mode: 0777
- name: copy jmxremote access file
when: jmx.enabled
template:
src: "jmxremote.access.j2"
dest: "{{ controller.confdir }}/{{ controller_name }}/jmxremote.access"
mode: 0777
- name: "copy kafka truststore/keystore"
when: kafka.protocol == 'SSL'
copy:
src:
"{{openwhisk_home~'/ansible/roles/kafka/files/'~kafka.ssl.keystore.name}}"
dest: "{{ controller.confdir }}/{{ controller_name }}"
- name: copy nginx certificate keystore
when: controller.protocol == 'https'
copy:
src: files/{{ controllerKeystoreName }}
mode: 0666
dest: "{{ controller.confdir }}/{{ controller_name }}"
become: "{{ controller.dir.become }}"
- name: copy certificates
when: controller.protocol == 'https'
copy:
src: "{{ openwhisk_home }}/ansible/roles/controller/files/{{ item }}"
mode: 0666
dest: "{{ controller.confdir }}/{{ controller_name }}"
with_items:
- "{{ controller.ssl.cert }}"
- "{{ controller.ssl.key }}"
become: "{{ controller.dir.become }}"
- name: check, that required databases exist
include_tasks: "{{ openwhisk_home }}/ansible/tasks/db/checkDb.yml"
vars:
dbName: "{{ item }}"
with_items:
- "{{ db.whisk.actions }}"
- "{{ db.whisk.auth }}"
- "{{ db.whisk.activations }}"
- name: prepare controller port
set_fact:
controller_port: "{{ controller.basePort + (controller_index | int) }}"
ports_to_expose:
- "{{ controller.basePort + (controller_index | int) }}:8080"
- name: expose additional ports if jmxremote is enabled
when: jmx.enabled
vars:
jmx_remote_port: "{{ jmx.basePortController + (controller_index|int) }}"
jmx_remote_rmi_port:
"{{ jmx.rmiBasePortController + (controller_index|int) }}"
set_fact:
ports_to_expose: >-
{{ ports_to_expose }} +
[ '{{ jmx_remote_port }}:{{ jmx_remote_port }}' ] +
[ '{{ jmx_remote_rmi_port }}:{{ jmx_remote_rmi_port }}' ]
controller_args: >-
{{ controller.arguments }}
{{ jmx.jvmCommonArgs }}
-Djava.rmi.server.hostname={{ inventory_hostname }}
-Dcom.sun.management.jmxremote.rmi.port={{ jmx_remote_rmi_port }}
-Dcom.sun.management.jmxremote.port={{ jmx_remote_port }}
- name: populate environment variables for controller
set_fact:
controller_env:
"JAVA_OPTS":
-Xmx{{ controller.heap }}
-XX:+CrashOnOutOfMemoryError
-XX:+UseGCOverheadLimit
-XX:ErrorFile=/logs/java_error.log
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/logs
"CONTROLLER_OPTS": "{{ controller_args | default(controller.arguments) }}"
"CONTROLLER_INSTANCES": "{{ controller.instances }}"
"JMX_REMOTE": "{{ jmx.enabled }}"
"COMPONENT_NAME": "{{ controller_name }}"
"PORT": 8080
"CONFIG_whisk_info_date": "{{ whisk.version.date }}"
"CONFIG_whisk_info_buildNo": "{{ docker.image.tag }}"
"KAFKA_HOSTS": "{{ kafka_connect_string }}"
"CONFIG_whisk_kafka_replicationFactor":
"{{ kafka.replicationFactor | default() }}"
"CONFIG_whisk_kafka_topics_cacheInvalidation_retentionBytes":
"{{ kafka_topics_cacheInvalidation_retentionBytes | default() }}"
"CONFIG_whisk_kafka_topics_cacheInvalidation_retentionMs":
"{{ kafka_topics_cacheInvalidation_retentionMS | default() }}"
"CONFIG_whisk_kafka_topics_cacheInvalidation_segmentBytes":
"{{ kafka_topics_cacheInvalidation_segmentBytes | default() }}"
"CONFIG_whisk_kafka_topics_completed_retentionBytes":
"{{ kafka_topics_completed_retentionBytes | default() }}"
"CONFIG_whisk_kafka_topics_completed_retentionMs":
"{{ kafka_topics_completed_retentionMS | default() }}"
"CONFIG_whisk_kafka_topics_completed_segmentBytes":
"{{ kafka_topics_completed_segmentBytes | default() }}"
"CONFIG_whisk_kafka_topics_health_retentionBytes":
"{{ kafka_topics_health_retentionBytes | default() }}"
"CONFIG_whisk_kafka_topics_health_retentionMs":
"{{ kafka_topics_health_retentionMS | default() }}"
"CONFIG_whisk_kafka_topics_health_segmentBytes":
"{{ kafka_topics_health_segmentBytes | default() }}"
"CONFIG_whisk_kafka_common_securityProtocol":
"{{ kafka.protocol }}"
"CONFIG_whisk_kafka_common_sslTruststoreLocation":
"/conf/{{ kafka.ssl.keystore.name }}"
"CONFIG_whisk_kafka_common_sslTruststorePassword":
"{{ kafka.ssl.keystore.password }}"
"CONFIG_whisk_kafka_common_sslKeystoreLocation":
"/conf/{{ kafka.ssl.keystore.name }}"
"CONFIG_whisk_kafka_common_sslKeystorePassword":
"{{ kafka.ssl.keystore.password }}"
"CONFIG_whisk_couchdb_protocol": "{{ db_protocol }}"
"CONFIG_whisk_couchdb_host": "{{ db_host }}"
"CONFIG_whisk_couchdb_port": "{{ db_port }}"
"CONFIG_whisk_couchdb_username": "{{ db_username }}"
"CONFIG_whisk_couchdb_password": "{{ db_password }}"
"CONFIG_whisk_couchdb_provider": "{{ db_provider }}"
"CONFIG_whisk_couchdb_databases_WhiskAuth": "{{ db.whisk.auth }}"
"CONFIG_whisk_couchdb_databases_WhiskEntity": "{{ db.whisk.actions }}"
"CONFIG_whisk_couchdb_databases_WhiskActivation":
"{{ db.whisk.activations }}"
"CONFIG_whisk_db_actionsDdoc": "{{ db_whisk_actions_ddoc | default() }}"
"CONFIG_whisk_db_activationsDdoc": "{{ db_whisk_activations_ddoc | default() }}"
"CONFIG_whisk_db_activationsFilterDdoc": "{{ db_whisk_activations_filter_ddoc | default() }}"
"CONFIG_whisk_userEvents_enabled": "{{ user_events }}"
"LIMITS_ACTIONS_INVOKES_PERMINUTE": "{{ limits.invocationsPerMinute }}"
"LIMITS_ACTIONS_INVOKES_CONCURRENT": "{{ limits.concurrentInvocations }}"
"LIMITS_ACTIONS_INVOKES_CONCURRENTINSYSTEM":
"{{ limits.concurrentInvocationsSystem }}"
"LIMITS_TRIGGERS_FIRES_PERMINUTE": "{{ limits.firesPerMinute }}"
"LIMITS_ACTIONS_SEQUENCE_MAXLENGTH": "{{ limits.sequenceMaxLength }}"
"CONFIG_whisk_memory_min": "{{ limit_action_memory_min | default() }}"
"CONFIG_whisk_memory_max": "{{ limit_action_memory_max | default() }}"
"CONFIG_whisk_memory_std": "{{ limit_action_memory_std | default() }}"
"CONFIG_whisk_timeLimit_min": "{{ limit_action_time_min | default() }}"
"CONFIG_whisk_timeLimit_max": "{{ limit_action_time_max | default() }}"
"CONFIG_whisk_timeLimit_std": "{{ limit_action_time_std | default() }}"
"CONFIG_whisk_activation_payload_max":
"{{ limit_activation_payload | default() }}"
"RUNTIMES_MANIFEST": "{{ runtimesManifest | to_json }}"
"CONFIG_whisk_runtimes_defaultImagePrefix":
"{{ runtimes_default_image_prefix | default() }}"
"CONFIG_whisk_runtimes_defaultImageTag":
"{{ runtimes_default_image_tag | default() }}"
"CONFIG_whisk_runtimes_bypassPullForLocalImages":
"{{ runtimes_bypass_pull_for_local_images | default() }}"
"CONFIG_whisk_runtimes_localImagePrefix":
"{{ runtimes_local_image_prefix | default() }}"
"METRICS_KAMON": "{{ metrics.kamon.enabled }}"
"METRICS_KAMON_TAGS": "{{ metrics.kamon.tags }}"
"METRICS_LOG": "{{ metrics.log.enabled }}"
"CONFIG_whisk_controller_protocol": "{{ controller.protocol }}"
"CONFIG_whisk_controller_https_keystorePath":
"{{ controller.ssl.keystore.path }}"
"CONFIG_whisk_controller_https_keystorePassword":
"{{ controller.ssl.keystore.password }}"
"CONFIG_whisk_controller_https_keystoreFlavor":
"{{ controller.ssl.storeFlavor }}"
"CONFIG_whisk_controller_https_truststorePath":
"{{ controller.ssl.truststore.path }}"
"CONFIG_whisk_controller_https_truststorePassword":
"{{ controller.ssl.truststore.password }}"
"CONFIG_whisk_controller_https_truststoreFlavor":
"{{ controller.ssl.storeFlavor }}"
"CONFIG_whisk_controller_https_clientAuth":
"{{ controller.ssl.clientAuth }}"
"CONFIG_whisk_loadbalancer_invokerBusyThreshold":
"{{ invoker.busyThreshold }}"
"CONFIG_whisk_loadbalancer_blackboxFraction":
"{{ controller.blackboxFraction }}"
"CONFIG_kamon_statsd_hostname": "{{ metrics.kamon.host }}"
"CONFIG_kamon_statsd_port": "{{ metrics.kamon.port }}"
"CONFIG_whisk_spi_LogStoreProvider": "{{ userLogs.spi }}"
"CONFIG_whisk_spi_LoadBalancerProvider":
"{{ controller.loadbalancer.spi }}"
"CONFIG_logback_log_level": "{{ controller.loglevel }}"
"CONFIG_whisk_transactions_header": "{{ transactions.header }}"
- name: merge extra env variables
set_fact:
controller_env: "{{ controller_env | combine(controller.extraEnv) }}"
- name: include plugins
include_tasks: "{{ item }}.yml"
with_items: "{{ controller_plugins | default([]) }}"
- name: (re)start controller
docker_container:
name: "{{ controller_name }}"
image:
"{{docker_registry~docker.image.prefix}}/controller:{{docker.image.tag}}"
state: started
recreate: true
restart_policy: "{{ docker.restart.policy }}"
hostname: "{{ controller_name }}"
env: "{{ controller_env }}"
volumes:
- "{{ whisk_logs_dir }}/{{ controller_name }}:/logs"
- "{{ controller.confdir }}/{{ controller_name }}:/conf"
ports: "{{ ports_to_expose }}"
command:
/bin/sh -c
"exec /init.sh {{ controller_index }}
>> /logs/{{ controller_name }}_logs.log 2>&1"
- name: wait until the Controller in this host is up and running
uri:
url:
"{{controller.protocol}}://{{ansible_host}}:{{controller_port}}/ping"
validate_certs: "no"
client_key:
"{{ controller.confdir }}/{{ controller_name }}/{{ controller.ssl.key }}"
client_cert:
"{{ controller.confdir }}/{{ controller_name }}/{{ controller.ssl.cert }}"
register: result
until: result.status == 200
retries: 12
delay: 5
# VIM: let b:syntastic_yaml_yamllint_args="-c '".expand('%:p:h')."../../../yamllint.yml'"