Вот инструкция Linode для создания экземпляра облачного сервера:
---
- hosts: 127.0.0.1
connection: local
tasks:
- name: Create Linode Machine
linode:
api_key: 'blablabla'
name: test
plan: 1
datacenter: 7
distribution: 124
password: 'blabla'
swap: 768
wait: yes
wait_timeout: 600
state: started
register: result
Если я это сделаю, экземпляр будет создан, однако это не такое уж большое преимущество, если я не могу получить IP-адрес из вывода для перехода в другой playbook и полностью автоматизировать сборку.
Когда вы запускаете вышеупомянутый модуль, модуль не выдает никаких результатов, однако, если вы запустите playbook с параметром -v, вы увидите, что отображается следующий результат. Как мне получить это
changed: [127.0.0.1] => {"changed": true, "instance": {"fqdn": "xxxx.members.linode.com", "id": 2342234, "ipv4": "185.x.x.x", "name": "1902695_test", "password": "blabla", "private": [], "public": [{"fqdn": "xxxx.members.linode.com", "ip_id": 324324, "ipv4": "185.x.x.x"}], "status": "Running"}}
Как я могу просто сохранить ipv4 в переменной, чтобы использовать ее в другом сборнике игр или что-то еще?
РЕДАКТИРОВАТЬ: я добавил следующий код под приведенным выше, чтобы проверить полученный ответ, но он не сработал:
- hosts: "{{ result['instance']['ipv4'] }}"
remote_user: root
tasks:
- name: "test"
command: ls -la
- apt: upgrade=dist update_cache=yes
Я получаю следующее сообщение об ошибке:
ERROR! 'result' is undefined
Айв также пробовал set_fact, но это тоже не сработало.
Ты можешь регистрировать вывод любой задачи как переменную вот так:
- name: Create Linode Machine
linode:
api_key: 'blablabla'
...
register: result
Теперь у вас есть результат задачи, сохраненный в переменной result
и должен иметь доступ к IP через result['instance']['ipv4']
.
Если нет, то модуль отладки - ваш друг, и вы можете проверить содержимое переменной:
- debug: var=result
Если вы действительно хотите сделать его доступным для другого playbook, который не является частью текущего выполнения, кеширование фактов может быть вариантом для вас. С включенным кешированием фактов вы можете использовать set_fact
:
- set_fact:
myInstanceIp: "{{ result['instance']['ipv4'] }}"
Еще одна сложность заключается в том, что переменные / факты хранятся для каждого хоста. В приведенном выше случае вы сохранили переменную для localhost. Таким образом, он будет напрямую доступен только для задач, которые выполняются в контексте localhost.
Однако раздел hosts в playbook не оценивается в контексте какого-либо хоста, поэтому вы не можете напрямую получить доступ к этой переменной.
Я вижу три возможных варианта:
1) Выполните вторую игру также на локальном хосте, а затем делегируйте задачи другому хосту. Поскольку теперь задача выполняется в контексте localhost, вы должны иметь доступ к зарегистрированному result
.
- hosts: localhost
delegate_to: "{{ result['instance']['ipv4'] }}"
remote_user: root
tasks:
...
Согласно документы delegate_to
будет работать над задачами, но я думаю, он должен работать и на уровне игры, который затем передаст его каждой содержащейся задаче. Если нет, тогда вам нужно будет добавить его в каждую задачу.
- hosts: localhost
remote_user: root
tasks:
- name: "test"
command: ls -la
delegate_to: "{{ result['instance']['ipv4'] }}"
- apt: upgrade=dist update_cache=yes
delegate_to: "{{ result['instance']['ipv4'] }}"
2) Даже если это не выполняется в контексте localhost, вы должны иметь доступ к соответствующим переменным через hostvars dict:
- hosts: "{{ hostvars['localhost']['result']['instance']['ipv4'] }}"
remote_user: root
...
3) Динамически создайте новую группу с модуль add_host:
- add_host:
name: "{{ result['instance']['ipv4'] }}"
groups: just_created
А затем используйте группу just_created
в следующем спектакле:
- hosts: just_created
tasks: ...