Я пытаюсь создать 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?