2017-08-03 50 views
0

我的Ansible playbook部署到数据库和web服务器,我需要在它们之间使用一些共享变量。从这个questionanswer几乎给了我什么,我需要:Ansible playbook在主机之间生成和共享变量

--- 
- hosts: all 
    tasks: 
    - set_fact: my_global_var='hello' 

- hosts: db 
    tasks: 
    - debug: msg={{my_global_var}} 

- hosts: web 
    tasks: 
    - debug: msg={{my_global_var}} 

然而,在我的情况的变量是通过在每个运行的剧本随机生成一个密码,然后必须共享:

--- 
- hosts: all 
    tasks: 
    - name: Generate new password 
    shell: "tr -dc _[:alnum:] < /dev/urandom | head -c${1:-20}" 
    register: new_password  
    - name: Set password as fact 
    set_fact: 
     my_global_var: "{{ new_password.stdout }}" 

- hosts: db 
    tasks: 
    - debug: msg={{my_global_var}} 

- hosts: web 
    tasks: 
    - debug: msg={{my_global_var}} 

以上示例不起作用,因为现在重新生成密码,并且all主机中的每个主机完全不同(除非您巧妙地为您的db和web服务器使用相同的机器/主机名)。

理想情况下,我不希望有人不得不记得在命令行上使用--extra-vars传递一个好的随机密码,它应该由剧本生成和处理。

Ansible中是否有任何建议的机制来在剧本中创建变量,并让剧本中的所有主机都可以访问?

回答

1

你可能想尝试生成本地主机上的传球,然后将其复制到所有其他主机:

--- 
- hosts: localhost 
    tasks: 
    - name: Generate new password 
    shell: "tr -dc _[:alnum:] < /dev/urandom | head -c${1:-20}" 
    register: new_password  

- hosts: all 
    tasks: 
    - name: Set password as fact 
    set_fact: 
     my_global_var: "{{ hostvars['localhost'].new_password.stdout }}" 

- hosts: db 
    tasks: 
    - debug: msg={{my_global_var}} 

- hosts: web 
    tasks: 
    - debug: msg={{my_global_var}} 
1

只需设置run_once标志在你的任务:

- hosts: all 
    tasks: 
    - name: Generate new password 
    shell: "tr -dc _[:alnum:] < /dev/urandom | head -c${1:-20}" 
    run_once: True 
    register: new_password 

    - name: Set password as fact 
    set_fact: 
     my_global_var: "{{ new_password.stdout }}" 

然后此密码将只生成一次

+1

在这种情况下,'my_global_var'只能用于单个主机(首先在播放中)。 –

+0

你是对的,谢谢,我调整了'run_once'只在pw代中运行。 – ProfHase85