Skip to content
Snippets Groups Projects
  • Hui Kang's avatar
    790bf336
    Fix bootstrap for services · 790bf336
    Hui Kang authored
    
    The bootstrap tasks could be started on any node listed in the
    site.yml
    
    The issue is that all the tasks must run on the same node, and the
    only node that all the tasks can run on is the 'api' node due to
    needing to start the bootstrap container which binds in the configs.
    
    delegate_to is required to ensure that the proper node gets the task.
    
    Co-Authored-By: default avatarSam Yaple <sam@yaple.net>
    Change-Id: Ica04ab366777a571a92212ac22c482f1881d4ecd
    Closes-Bug: #1513598
    Related-Bug: #1513439
    790bf336
    History
    Fix bootstrap for services
    Hui Kang authored
    
    The bootstrap tasks could be started on any node listed in the
    site.yml
    
    The issue is that all the tasks must run on the same node, and the
    only node that all the tasks can run on is the 'api' node due to
    needing to start the bootstrap container which binds in the configs.
    
    delegate_to is required to ensure that the proper node gets the task.
    
    Co-Authored-By: default avatarSam Yaple <sam@yaple.net>
    Change-Id: Ica04ab366777a571a92212ac22c482f1881d4ecd
    Closes-Bug: #1513598
    Related-Bug: #1513439
bootstrap.yml 2.88 KiB
---
- name: Creating Nova database
  command: docker exec -t kolla_ansible /usr/bin/ansible localhost
    -m mysql_db
    -a "login_host='{{ database_address }}'
        login_user='{{ database_user }}'
        login_password='{{ database_password }}'
        name='{{ nova_database_name }}'"
  register: database
  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
  failed_when: database.stdout.split()[2] != 'SUCCESS'
  run_once: True
  delegate_to: "{{ groups['nova-api'][0] }}"

- name: Creating Nova database user and setting permissions
  command: docker exec -t kolla_ansible /usr/bin/ansible localhost
    -m mysql_user
    -a "login_host='{{ database_address }}'
        login_user='{{ database_user }}'
        login_password='{{ database_password }}'
        name='{{ nova_database_name }}'
        password='{{ nova_database_password }}'
        host='%'
        priv='{{ nova_database_name }}.*:ALL'
        append_privs='yes'"
  register: database_user_create
  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
  run_once: True
  delegate_to: "{{ groups['nova-api'][0] }}"

- name: Starting Nova bootstrap container
  docker:
    tty: True
    detach: False
    net: host
    pull: "{{ docker_pull_policy }}"
    restart_policy: "no"
    state: reloaded
    registry: "{{ docker_registry }}"
    username: "{{ docker_registry_username }}"
    password: "{{ docker_registry_password }}"
    insecure_registry: "{{ docker_insecure_registry }}"
    name: bootstrap_nova
    image: "{{ nova_api_image_full }}"
    volumes: "{{ node_config_directory }}/nova-api/:{{ container_config_directory }}/:ro"
    env:
      KOLLA_BOOTSTRAP:
      KOLLA_CONFIG_STRATEGY: "{{ config_strategy }}"
  run_once: True
  delegate_to: "{{ groups['nova-api'][0] }}"
  when: database.stdout.find('localhost | SUCCESS => ') != -1 and (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed

# https://github.com/ansible/ansible-modules-core/pull/1031
- name: Waiting for bootstrap container to exit
  command: docker wait bootstrap_nova
  register: bootstrap_result
  run_once: True
  failed_when: bootstrap_result.stdout != "0"
  delegate_to: "{{ groups['nova-api'][0] }}"
  when: database.stdout.find('localhost | SUCCESS => ') != -1 and (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed

- name: Cleaning up Nova bootstrap container
  docker:
    tty: True
    name: bootstrap_nova
    image: "{{ nova_api_image_full }}"
    state: absent
  delegate_to: "{{ groups['nova-api'][0] }}"
  when: database.stdout.find('localhost | SUCCESS => ') != -1 and (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed