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

Ansible: передать переменную, созданную в роли host1, в другую роль host2.

Я пытаюсь использовать переменную, созданную в роли для host1, и использовать ее в другой роли для host2.

Это общий макет:

|   # Group variables
+-- group_vars
|   +-- all  # variables set on all hosts 

|   # Collection of playbooks divided by *role*
+-- roles
   - role-nfs.yml   # playbook for role `role-nfs`
|  - role-app.yml  # playbook for role `role-app`
|  - role-app      # directory containing stuff used by `role-app`
|  - role-nfs       # directory containing stuff used by `role-nfs`   
|
+-- site.yml
|   # This is the main playbook.

Переменная создается для host1: nfs в role-nfs/task/main.yml

- name: Export nfs_server_ip to a host-fact type variable
  set_fact:
    nfs_server_ip: "{{ ansible_default_ipv4.address }}"
    cacheable: True

Затем захватил host2: app в role-app.yml учебник:


- name: Deploy app
  tags:
    - app
  hosts: app
  roles:
    - role: role-app
      nfs: True
      nfs_ip: "{{hostvars['nfs_server_ip']}}"

И перешел в role-app/task/main.yml. Но отладочная информация говорит мне, что я получаю пустую строку:

- debug:
    msg: "This is nfs_ip: {{nfs_ip}} "

вне:

TASK [app : debug] *********************************************************************************
task path: /home/ubuntu/playbooks/roles/role-app/tasks/main.yml:26
ok: [app001] => {
"msg": "This is nfs_ip:  "
}

Я не совсем уверен, что делаю не так. Любая помощь?

РЕДАКТИРОВАТЬ

Так что мне удалось получить то, что мне нужно, т.е. nfs_ip таким образом:

      group_name_nfs: "{{hostvars[inventory_hostname]['groups']['nfs-server'][0]}}"
      nfs_ip: "{{hostvars[inventory_hostname]['cluster']['nodes'][group_name_nfs]['ips'][0]}}"

Может быть лучший способ сделать это ..

Вы можете попробовать использовать инвентаризация в памяти.

- name: Add nfs_server_ip to in-memory inventory.
  add_host:
    hostname: nfs-server
    public_ip: {{ ansible_default_ipv4.address }}

А позже используйте что-то вроде следующего

- name: Deploy app
  tags:
    - app
  hosts: app
  roles:
    - role: role-app
      nfs: True
      nfs_ip: "{{ hostvars['nfs-server']['public_ip'] }}"