Ansible playbook,在主机之间生成和共享变量

Ansible playbook,在主机之间生成和共享变量,ansible,ansible-2.x,Ansible,Ansible 2.x,我的Ansible playbook同时部署到数据库和Web服务器,我需要在它们之间使用一些共享变量。这几乎给了我所需要的: --- - 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}} 但是,在我的例子中,变量是

我的Ansible playbook同时部署到数据库和Web服务器,我需要在它们之间使用一些共享变量。这几乎给了我所需要的:

---
- 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}}
但是,在我的例子中,变量是一个密码,由playbook在每次运行时随机生成,然后必须共享:

---
- 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}}
---
-主持人:全部
任务:
-名称:生成新密码
shell:“tr-dc[:alnum:
上述示例不起作用,因为密码现在已重新生成,并且在
所有
主机中的每个主机的密码都完全不同(除非您同时对数据库和web服务器使用相同的计算机/主机名)

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


Ansible中是否有任何建议的机制,用于在playbook中创建变量并使该playbook中的所有主机都可以访问该变量?

您可能希望尝试生成本地主机传递,然后将其复制到其他所有主机:

---
- 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}}
---
-主机:本地主机
任务:
-名称:生成新密码
shell:“tr-dc[:alnum:
我知道这是一个老问题,但我选择了另一种方法,将这里提供的两个答案结合起来,使用隐式localhost引用,在同一重头戏中执行所有操作。我觉得它更优雅一点。使用2.8.4进行测试

这是在我的环境中工作的解决方案,我希望在我的所有主机上都有一个通用的时间戳备份目录,以便以后恢复:

---
tasks:
  - name: Set local fact for the universal backup string
    set_fact:
      thisHostTimestamp: "{{ ansible_date_time.iso8601 }}"
    delegate_to: localhost
    delegate_facts: true

  - name: Distribute backup datestring to all hosts in group
     set_fact:
       backupsTimeString: "{{ hostvars['localhost']['thisHostTimestamp'] }}"
我认为这应该转化为OP的原始示例,如下所示,但我尚未对其进行测试:

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

  - name: Set password as fact
    set_fact:
      my_global_var: "{{ hostvars['localhost'].new_password.stdout }}"
---
-主持人:全部
任务:
-名称:生成新密码
shell:“tr-dc[:alnum: