Почему я не могу запросить переменную, которая будет использоваться несколькими играми (возможно, 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
Ответы
Ответ 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.