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

У меня есть 2 пьесы в playbook. Один из них запрашивает ввод данных от пользователя, и я хочу использовать эту переменную в другой игре. Пожалуйста, предложите мне, как это сделать

---
- hosts: workers
  gather_facts: false
  sudo: true
  vars_prompt:
     - name: "server_ip"
       prompt: "Enter the Server IP"
       private: no

  roles:
    - client-setup-worker

- hosts: master
  gather_facts: false
  sudo: true
  vars:
    server: "{{ hostvars['workers']['server_ip'] }}"

  roles:
    - client-setup-master

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

Я сталкиваюсь с ошибкой «Ошибка была: \"hostvars['workers']\" is undefined" при этом

Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
1
0
491
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

I am facing the error "The error was: \"hostvars['workers']\" is undefined" while doing so

Это потому, что workers, очевидно, является группой, а не хозяин, единственное, что можно найти объявленным в хозяинvars.

Вам нужно будет случайным образом захватить один из хостов из группы workers, а затем извлечь его факт; Я считаю, что это сделает это:

обновить, увидев в основном правильный ответ от @VladimirBotka

- hosts: workers
  vars_prompt:
  # as before ...
  pre_tasks:
  - name: re-export the vars_prompt for cross playbook visibility
    set_fact:
      server_ip: '{{ server_ip }}'
  roles:
  # as before

- hosts: masters
  vars:
    server: '{{ hostvars[(groups.workers|first)].server_ip }}'

Проблема в область действия vars_prompt.

Vladimir Botka 28.05.2019 08:42

@VladimirBotka Я печатал исправление, пока вы печатали свой комментарий :-) Я рад, что узнал об этом, спасибо!

mdaniel 28.05.2019 08:44

объем переменных, объявленных в vars_prompt, является играть.

Такая переменная может быть помещена в хоствары с помощью set_facts «для использования этой переменной в другом воспроизведении». Например, пьеса ниже

- hosts: test_01
  gather_facts: false
  vars_prompt:
     - name: "server_ip"
       prompt: "Enter the Server IP"
       private: no
  tasks:
    - set_fact:
        stored_server_ip: "{{ server_ip }}"
    - debug:
        var: stored_server_ip

- hosts: test_02
  gather_facts: false
  vars:
    server: "{{ hostvars.test_01.stored_server_ip }}"
  tasks:
    - debug:
        var: server

дает (сокращенно):

ok: [test_01] => {
    "stored_server_ip": "10.1.0.10"
}
ok: [test_02] => {
    "server": "10.1.0.10"
}

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

mdaniel 28.05.2019 08:45

Хорошо, что вы упомянули о разнице в использовании хоста и группы. Спасибо :)

Bhavani Prasad 28.05.2019 09:29

Другие вопросы по теме