Подтвердить что ты не робот

Почему я не могу запросить переменную, которая будет использоваться несколькими играми (возможно, 1.6.5)

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

---

- name: database password
  hosts:
    - webservers
    - dbservers
  vars_prompt:
    - name: "db_password"
      prompt: "Enter Database Password for databse user root"
      default: "root"

- hosts: dbservers
  tasks:
    - command: echo {{db_password | mandatory }}


- hosts: webservers
  tasks:
    - command: echo {{db_password | mandatory }}

Он не работает, как показано ниже.

Enter Database Password for databse user root [root]: 

PLAY [database password] ****************************************************** 

GATHERING FACTS *************************************************************** 
ok: [vc-dev-1]

PLAY [dbservers] ************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [vc-dev-1]

TASK: [command echo {{db_password | mandatory}}] *************************** 
fatal: [vc-dev-1] => One or more undefined variables: 'db_password' is undefined

FATAL: all hosts have already failed -- aborting

PLAY RECAP ******************************************************************** 
           to retry, use: --limit @.../playbook2.retry

vc-dev-1                   : ok=3    changed=0    unreachable=1    failed=0   
4b9b3361

Ответ 1

Я нашел следующее обходное решение, использующее set_fact, чтобы назначить переменную, введенную пользователем, в переменную с областью воспроизведения. Кажется, что переменные var_prompt не похожи на факты и другие переменные, его объем ограничен в игре, которая запрашивает у них не всю книгу. Я не уверен, что это особенность или ошибка.

---

- name: database password
  hosts:
    - webservers
    - dbservers
  vars_prompt:
    - name: "db_password"
      prompt: "Enter Database Password for databse user root"
      default: "root"
  tasks:
    - set_fact:
        db_root_password: "{{db_password}}"

- hosts: dbservers
  tasks:
    - command: echo {{db_root_password | mandatory }}


- hosts: webservers
  tasks:
    - command: echo {{db_root_password | mandatory }}

Ответ 2

Импровизирующий gae123 ответ, в случае динамического добавления ваших хостов невозможно будет установить и установить факт на существующей группе серверов, и в этом случае localhost может использоваться для установки и получения.

---
- name: database password
  hosts: localhost
  vars_prompt:
    - name: "db_password"
      prompt: "Enter Database Password for databse user root"
      default: "root"
  tasks:
    - set_fact:
        db_root_password: "{{db_password}}"

- hosts: dbservers
  vars:
    - db_root_password: "{{ hostvars['localhost']['db_root_password'] }}"
  tasks:
    - command: echo {{db_root_password | mandatory }}


- hosts: webservers
  vars:
    - db_root_password: "{{ hostvars['localhost']['db_root_password'] }}"
  tasks:
    - command: echo {{db_root_password | mandatory }}

Ответ 3

В итоге я получил ответ user3037143 для моей проблемы с паролем localhost sudo:

---
- hosts: localhost
  tags:
    - always
  vars_prompt:
    - name: sudo_password
      prompt: "Sudo password for localhost ONLY"
  tasks:
    - set_fact: ansible_become_password={{ sudo_password }}
      no_log: true

Теперь он делится между всеми включенными в него игровыми книгами.

Я на свободе > 2.