Использование переменной Ansible для разных ролей в разных файлах - PullRequest
0 голосов
/ 07 мая 2020

Здесь я пытаюсь выполнить перечисленные ниже действия

  1. Отменить регистрацию экземпляра в балансировщике нагрузки приложения
  2. Развернуть приложение

Вариант использования - добавить обратно снятый с регистрации экземпляр в те же целевые группы ALB, откуда он был удален. При отмене регистрации экземпляра я сохраняю ARN целевой группы в {{ my_target_arn }}, а позже использую его в другой роли, чтобы зарегистрировать тот же экземпляр в целевых группах.

Ниже приведен код для отмены регистрации экземпляра из ALB :

---
- name: Get EC2 instance ID
  ec2_instance_info:
    filters:
      private-ip-address: "{{ ansible_host }}"
  register: ec2_details

- name: Get list of target groups with the EC2
  delegate_to: localhost
  elb_target_info:
    instance_id: "{{ ec2_details.instances[0].instance_id }}"
  register: target_info

- name: Deregister the EC2
  delegate_to: localhost
  elb_target:
    target_group_arn: "{{ item.target_group_arn }}"
    target_id: "{{ ec2_details.instances[0].instance_id }}"
    deregister_unused: yes
    target_status_timeout: 10
    state: absent
  with_items: "{{ target_info.instance_target_groups }}"
  register: detached_details
  when: target_info != ""

- set_fact:
    my_target_arn: "{{ item.target_group_arn }}"
  with_items: "{{ target_info.instance_target_groups }}"
  when: target_info != ""

Ниже приведен код для обратного добавления экземпляра:

---
- name: Get EC2 instance ID
  ec2_instance_info:
    filters:
      private-ip-address: "{{ ansible_host }}"
  register: ec2_details

- name: Register the EC2
  delegate_to: localhost
  elb_target:
    target_group_arn: "{{ item }}"
    target_id: "{{ ec2_details.instances[0].instance_id }}"
    deregister_unused: yes
    target_status_timeout: 10
    state: present
  with_items: "{{ my_target_arn }}"
  register: attached_details
  when: my_target_arn != ""

Код Playbook:

---
- name: Check EC2 details
  hosts: appserver

  roles:
    - roles/ec2_deregister
    - roles/deploy_application
    - roles/ec2_register

Проблема в том, что мой {{ ansible_host }} связан с несколькими целевыми группами. Таким образом, при отмене регистрации экземпляра он отменяет регистрацию экземпляра в этих нескольких целевых группах. Однако при повторной регистрации экземпляра он только добавляет его обратно в одну целевую группу (первую, которую он получает).

Так что в основном я хочу set_fact с переменной списка, которая может или может не иметь нескольких значений (это может быть одно значение или список значений). Подскажите, пожалуйста, как set_fact со списком переменных.

Ответы [ 2 ]

1 голос
/ 09 мая 2020

какую версию ansible вы используете?

Я пытался установить факт в одной роли и передать его другой, похоже, все работает нормально.

Я использую ansible 2.9.6

role1:

- set_fact:
    my_fact: test

role2:

- debug:
    var: my_fact

playbook:

---
- hosts: localhost
  gather_facts: no
  become: no
  roles:
    - ./roles/role1
    - ./roles/role2

и вывод:

TASK [./roles/role1 : set_fact] 
ok: [localhost]

TASK [./roles/role2 : debug] 
ok: [localhost] => {
    "my_fact": "test1234"
}
0 голосов
/ 10 мая 2020

Удалось получить список с помощью указанного ниже кода

Отмена регистрации экземпляра

---
- name: Get EC2 instance ID
  ec2_instance_info:
    filters:
      private-ip-address: "{{ ansible_host }}"
  register: ec2_details

- name: Get list of target groups with the EC2
  delegate_to: localhost
  elb_target_info:
    instance_id: "{{ ec2_details.instances[0].instance_id }}"
  register: target_info

- set_fact:
    my_target_arn: "{{ my_target_arn|default([]) + [{'target_group_arn': item}] }}"
  loop: "{{ target_info.instance_target_groups|map(attribute='target_group_arn')|list }}"
  when: target_info != ""

- name: Deregister the EC2
  delegate_to: localhost
  elb_target:
    target_group_arn: "{{ item.target_group_arn }}"
    target_id: "{{ ec2_details.instances[0].instance_id }}"
    deregister_unused: yes
    target_status_timeout: 10
    state: absent
  with_items: "{{ target_info.instance_target_groups }}"
  register: detached_details
  when: target_info != ""

Зарегистрируйте тот же экземпляр

---
- name: Get EC2 instance ID
  ec2_instance_info:
    filters:
      private-ip-address: "{{ ansible_host }}"
  register: ec2_details
  when: my_target_arn is defined

- name: Register the EC2
  delegate_to: localhost
  elb_target:
    target_group_arn: "{{ item.target_group_arn }}"
    target_id: "{{ ec2_details.instances[0].instance_id }}"
    deregister_unused: yes
    target_status_timeout: 10
    state: present
  with_items: "{{ my_target_arn }}"
  register: attached_details
  when: my_target_arn is defined
...