20

我提炼了一本包含三个剧本的剧本。目标是在一场比赛中从提示中收集数据库密码,然后在其他两场比赛中使用相同的密码。

---

- 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   
4

3 回答 3

30

我发现以下解决方法使用 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 }}
于 2014-06-27T06:04:22.407 回答
14

即兴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 }}
于 2016-03-08T08:15:45.740 回答
1

我最终为我的 localhost sudo 密码问题选择了 user3037143 答案:

---
- 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

现在它在我拥有的每个包含剧本之间共享。

我在 ansible > 2。

于 2016-07-25T20:23:38.117 回答