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

时间:2017-08-03 12:39:25

标签: ansible ansible-2.x

My Ansible playbook部署到数据库和Web服务器,我需要在它们之间使用一些共享变量。来自answerquestion几乎可以满足我的需求:

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

上面的示例不起作用,因为现在为all主机中的每个主机重新生成密码并完全不同(除非您巧合地为数据库和Web服务器使用相同的计算机/主机名)。

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

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

3 个答案:

答案 0 :(得分:1)

您可能想尝试在localhost上生成传递,然后将其复制到其他所有主机:

---
- 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 :(得分: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 }}"

然后这个密码只会生成一次

答案 2 :(得分:0)

我知道这是一个古老的问题,但是我决定使用一种替代方法,该方法通过使用隐式localhost引用并在同一游戏中进行所有操作来组合此处提供的两个答案和this issue。我认为有点优雅。经过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 }}"