My Ansible playbook部署到数据库和Web服务器,我需要在它们之间使用一些共享变量。来自answer的question几乎可以满足我的需求:
---
- 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中是否有任何建议的机制可以在剧本中创建变量并让该剧本中的所有主机都可以访问它?
答案 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 }}"