Назад | Перейти на главную страницу

Как получить определенные данные из модуля, которые будут использоваться на другом хосте

Вот инструкция 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: ...