Как запустить play при использовании Ansible AWX на всех хостах в группе, используя localhost - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь создать playbook, который создает снимки EC2 некоторых AWS Windows серверов. У меня много проблем с пониманием того, как получить правильные директивы, чтобы убедиться, что все работает, как может. Что мне нужно сделать:

  • выполнить команды AWS локально, то есть на хосте AWX (так как это предпочтительнее, чем конфигурировать учетные данные на каждом сервере)
  • run команды для каждого хоста в инвентаре

В прошлом я делал это с другой группой Linux серверов без проблем. Но тот факт, что у меня возникают эти проблемы, заставляет меня думать, что это не работает так, как я думаю (я довольно новичок во всех вещах Ansible / AWX).

Первый шаг - мне нужно определить экземпляры, которые обычно выключены, и включить их, затем сделать снимки, а затем снова отключить их, если они обычно выключены. Итак, это мое main.yml:

---
- name: start the instance if the default state is stopped
  import_playbook: start-instance.yml
  when: default_state is defined and default_state == 'stopped'

- name: run the snapshot script
  import_playbook: instance-snapshot.yml

- name: stop the instance if the default state is stopped
  import_playbook: stop-instance.yml
  when: default_state is defined and default_state == 'stopped'

И это start-instance.yml

---
- name: make sure instances are running
  hosts: all
  gather_facts: false
  connection: local
  tasks:
    - name: start the instances
      ec2:
        instance_id: "{{ instance_id }}"
        region: "{{ aws_region }}"
        state: running
        wait: true
      register: ec2
    - name: pause for 120 seconds to allow the instance to start
      pause: seconds=120

Когда я запускаю это, я получаю следующую ошибку:

fatal: [myhost,mydomain.com]: UNREACHABLE! => {
    "changed": false,
    "msg": "ssl: HTTPSConnectionPool(host='myhost,mydomain.com', port=5986): Max retries exceeded with url: /wsman (Caused by ConnectTimeoutError(<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x7f99045e6bd0>, 'Connection to myhost,mydomain.com timed out. (connect timeout=30)'))",
    "unreachable": true

Я достаточно усвоил, чтобы понять, что это означает, что он пытается подключиться к каждому Windows хосту, а это не то, что мне нужно. Тем не менее, я подумал, что connection: local решил эту проблему, как мне показалось, с другим моим шаблоном, который использует и идентичный playbook.

Так что, если я вместо start-instance.yml изменится на "connection: localhost", то воспроизведение начнется - но пропускает шаги, потому что определяет, что ни одно из хостов не удовлетворяет условию (то есть default_state is defined and default_state == 'stopped'). Это говорит мне о том, что воспроизведение выполняется с использованием localhost для запуска воспроизведения, но также запускает его против localhost вместо списка хостов в инвентаре в AWX.

У моих хостов есть переменные, определенные в AWX, такие как ID экземпляра, регион, состояние по умолчанию. Я знаю, что при обычном Ansible использовании у нас были бы идентификаторы экземпляров в playbook, и именно так Ansible узнает, какие AWS экземпляры нужно запустить, но в этом случае мне нужно получить эту информацию из AWX.

Есть ли способ сделать это? Итак, запустите задачи (запустите экземпляры, сделайте паузу на 120 секунд) для всех хостов в моем инвентаре AWX, используя localhost?

1 Ответ

0 голосов
/ 26 февраля 2020

В конце концов я использовал delegate_to для этого. Я изменил код так:

---
- name: make sure instances are running
  hosts: all
  gather_facts: false
  tasks:
    - name: start the instances
      delegate_to: localhost
      ec2:
        instance_id: "{{ instance_id }}"
        region: "{{ aws_region }}"
        state: running
        wait: true
      register: ec2
    - name: pause for 120 seconds to allow the instance to start
      pause: seconds=120

И AWX правильно использовал localhost для запуска задач, в которые я добавил делегирование.

Стоит отметить, что я застрял на некоторое время, прежде чем реализовать свой шаблон, потребовалось два набора учетных данных - один пользователь IAM с правильными разрешениями для выполнения команд AWS и один для учетных данных компьютера для экземпляров Windows ,

...