From b694408abc377cdb8723c43babd7fac2dcf49be0 Mon Sep 17 00:00:00 2001 From: Jeffrey Zhang Date: Tue, 1 Mar 2016 00:45:55 +0800 Subject: [PATCH] Add kolla_docker action for reconfigure add three actions used for reconfigure * restart_container * get_container_env * get_container_state Partially-implements: bp kolla-reconfig Change-Id: I63609ce47f044926ff276ab1188b10f44270a0b5 --- ansible/library/kolla_docker.py | 40 +++++++++++ .../roles/keystone/tasks/do_reconfigure.yml | 67 +++++++++++++------ 2 files changed, 86 insertions(+), 21 deletions(-) diff --git a/ansible/library/kolla_docker.py b/ansible/library/kolla_docker.py index 3b1e9bd612..08306c2bd4 100644 --- a/ansible/library/kolla_docker.py +++ b/ansible/library/kolla_docker.py @@ -35,9 +35,12 @@ options: choices: - compare_image - create_volume + - get_container_env + - get_container_state - pull_image - remove_container - remove_volume + - restart_container - start_container - stop_container api_version: @@ -500,6 +503,30 @@ class DockerWorker(object): if self.params.get('remove_on_exit'): self.remove_container() + def get_container_env(self): + name = self.params.get('name') + info = self.get_container_info() + if not info: + self.module.fail_json(msg="No such container: {}".format(name)) + else: + envs = dict() + for env in info['Config']['Env']: + if '=' in env: + key, value = env.split('=', 1) + else: + key, value = env, '' + envs[key] = value + + self.module.exit_json(**envs) + + def get_container_state(self): + name = self.params.get('name') + info = self.get_container_info() + if not info: + self.module.fail_json(msg="No such container: {}".format(name)) + else: + self.module.exit_json(**info['State']) + def stop_container(self): name = self.params.get('name') container = self.check_container() @@ -507,6 +534,16 @@ class DockerWorker(object): self.changed = True self.dc.stop(name) + def restart_container(self): + name = self.params.get('name') + info = self.get_container_info() + if not info: + self.module.fail_json( + msg="No such container: {}".format(name)) + else: + self.changed = True + self.dc.restart(name) + def create_volume(self): if not self.check_volume(): self.changed = True @@ -533,9 +570,12 @@ def generate_module(): common_options=dict(required=False, type='dict', default=dict()), action=dict(requried=True, type='str', choices=['compare_image', 'create_volume', + 'get_container_env', + 'get_container_state', 'pull_image', 'remove_container', 'remove_volume', + 'restart_container', 'start_container', 'stop_container']), api_version=dict(required=False, type='str', default='auto'), diff --git a/ansible/roles/keystone/tasks/do_reconfigure.yml b/ansible/roles/keystone/tasks/do_reconfigure.yml index 8974a35586..1a7d1650b7 100644 --- a/ansible/roles/keystone/tasks/do_reconfigure.yml +++ b/ansible/roles/keystone/tasks/do_reconfigure.yml @@ -1,39 +1,64 @@ --- +- name: Ensuring the containers up + kolla_docker: + name: "{{ item.name }}" + action: "get_container_state" + register: container_state + failed_when: container_state.Running == false + when: inventory_hostname in groups[item.group] + with_items: + - { name: keystone, group: keystone } + - include: config.yml - name: Check the configs - command: docker exec keystone /usr/local/bin/kolla_set_configs --check + command: docker exec {{ item.name }} /usr/local/bin/kolla_set_configs --check changed_when: false failed_when: false - register: check_result + register: check_results + when: inventory_hostname in groups[item.group] + with_items: + - { name: keystone, group: keystone } # NOTE(jeffrey4l): when config_strategy == 'COPY_ALWAYS' # and container env['KOLLA_CONFIG_STRATEGY'] == 'COPY_ONCE', # just remove the container and start again -- name: Container config strategy - command: docker exec keystone printenv KOLLA_CONFIG_STRATEGY - changed_when: false - failed_when: false - register: container_config_strategy - -- name: Remove the keystone container +- name: Containers config strategy kolla_docker: - name: "keystone" + name: "{{ item.name }}" + action: "get_container_env" + register: container_envs + when: inventory_hostname in groups[item.group] + with_items: + - { name: keystone, group: keystone } + +- name: Remove the containers + kolla_docker: + name: "{{ item[0]['name'] }}" action: "remove_container" + register: remove_containers when: - - config_strategy == "COPY_ONCE" or container_config_strategy.stdout == 'COPY_ONCE' - - check_result.rc == 1 + - config_strategy == "COPY_ONCE" or item[1]['KOLLA_CONFIG_STRATEGY'] == 'COPY_ONCE' + - item[2]['rc'] == 1 + - inventory_hostname in groups[item[0]['group']] + with_together: + - [{ name: keystone, group: keystone }] + - container_envs.results + - check_results.results - include: start.yml - when: - - config_strategy == "COPY_ONCE" or container_config_strategy.stdout == 'COPY_ONCE' - - check_result.rc == 1 + when: remove_containers.changed -- name: Restart keystone service - # TODO(jeffrey4l): move to the kolla_docker module when - # it has restart_container action - command: docker restart keystone +- name: Restart containers + kolla_docker: + name: "{{ item[0]['name'] }}" + action: "restart_container" when: - config_strategy == 'COPY_ALWAYS' - - container_config_strategy.stdout != 'COPY_ONCE' - - check_result.rc == 1 + - item[1]['KOLLA_CONFIG_STRATEGY'] != 'COPY_ONCE' + - item[2]['rc'] == 1 + - inventory_hostname in groups[item[0]['group']] + with_together: + - [{ name: keystone, group: keystone }] + - container_envs.results + - check_results.results