Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我不能提示输入将由多个重头戏共享的变量(ansible 1.6.5)_Ansible_Ansible Playbook - Fatal编程技术网

为什么我不能提示输入将由多个重头戏共享的变量(ansible 1.6.5)

为什么我不能提示输入将由多个重头戏共享的变量(ansible 1.6.5),ansible,ansible-playbook,Ansible,Ansible Playbook,我提炼了一本剧本,里面有三个剧本。目标是在一个重头戏中从提示符收集数据库密码,然后在其他两个重头戏中使用相同的密码 --- - name: database password hosts: - webservers - dbservers vars_prompt: - name: "db_password" prompt: "Enter Database Password for databse user root" default: "

我提炼了一本剧本,里面有三个剧本。目标是在一个重头戏中从提示符收集数据库密码,然后在其他两个重头戏中使用相同的密码

---

- 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   

我发现了以下解决方法,使用set_fact将用户输入的变量分配到具有playbook作用域的变量中。var_提示变量似乎不像事实和其他变量,它的范围在提示它们的剧本中受到限制,而不是在整个剧本中。我不确定这是一个特性还是一个bug

---

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

即兴使用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 }}

我最终接受了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
现在我所有的剧本都分享了

我在ansible>2上