Ansible: как перебрать несколько переменных в playbook?

Я пытаюсь написать сценарий для реализации аварийного сигнала проверки состояния AWS Cloudwatch во всех экземплярах EC2. Я попытался жестко закодировать 3 значения (AWS_Name, Instance_ID и Instance_IP — Private), и у меня это отлично работает. Однако мне нужно решение, позволяющее работать с циклом, чтобы получить все переменные и создать сигнал проверки состояния Cloudwatch для каждого экземпляра один за другим.

- 
hosts: localhost

  tasks:

    - name: Create Alarm
      ec2_metric_alarm:
         state: present
         region: us-east-1
         name: "Status Check Failed - $AWS_Name - $Instance_IP"
         metric: "StatusCheckFailed"
         namespace: "AWS/EC2"
         statistic: "Minimum"
         comparison: ">="
         threshold: 1
         period: 60
         evaluation_periods: 2
         description: "This will alarm when the instance status check fails"
         dimensions: {'InstanceId': '$Instance_ID'}
         alarm_actions: ["arn:aws:sns:us-east-1:XXXXXXXXXXXX:Cloudwatch-Notifications"]

Допустим, у меня есть 2 экземпляра AWS, я могу получить три переменные, о которых я упоминал выше, с помощью запроса AWS CLI или вручную. Теперь я хочу запустить playbook только один раз, чтобы создать сигнал тревоги для всех двух экземпляров.

найти примерные переменные

  var1:
    AWS_Name: NAME1
    Instance_ID: i-01b8e4534wt811af4
    Instance_IP: "10.75.169.21"
  var2:
    AWS_Name: NAME2
    Instance_ID: i-4566eftuiw93045
    Instance_IP: "10.75.169.16"

Кто-нибудь, пожалуйста, помогите мне подняться.


person cinny    schedule 19.09.2017    source источник


Ответы (1)


Вместо запуска задачи для hosts: localhost запустите ее для hosts: all_ec2_hosts и делегируйте задание на localhost. Таким образом, вы можете использовать переменные целевых хостов в ec2_metric_alarm и вам не нужно запускать задачу в цикле: hosts: all_ec2_hosts распространит задачу на все хосты.

...
hosts: all_ec2_hosts
become: no
tasks:
  - name: Create Alarm
    delegate_to: localhost
    ec2_metric_alarm:
     name: "Status Check Failed - {{ inventory_hostname }}"
     state: present
     region: us-east-1
     ...
     dimensions: "{'InstanceId': '{{ ec2_id }}' }"

Очевидно, вы бы заменили all_ec2_hosts списком целевых хостов или группой хостов.

ec2_id — это переменная, возвращаемая сценарием динамической инвентаризации EC2 и содержащая идентификатор экземпляра EC2.

person Pasi H    schedule 19.09.2017
comment
Спасибо за ваше ценное обновление. Существуют ли какие-либо ограничения для сценария динамической инвентаризации EC2 для перечисления экземпляров в регионе ap-south-1 (Мумбаи). Вы пробовали это раньше? Потому что я не могу перечислить экземпляры в том же регионе. - person cinny; 20.09.2017
comment
Это уже немного не по теме, но на самом деле нет никаких ограничений для регионов AWS. Проверьте свойства region и region_exclude в файле inventory/ec2.ini. - person Pasi H; 21.09.2017