Ansible Playbook同文件内跨Play变量共享失败问题咨询
Ansible跨Play共享变量的正确方法
针对你在Ansible core 2.12.0中遇到的跨Play(dump_db和Restore)共享now变量的问题,先明确你之前尝试的问题原因,再给出几种可靠的解决方法:
你之前尝试的问题解析
- Play的vars定义变量失败:Play的
vars块中定义的变量属于Play级别作用域,仅在当前Play的执行上下文有效,且hostvars['pay_server']仅当该主机在当前或之前的Play中被执行过任务时才会存在。如果Restore Play未针对pay_server执行任何操作,自然会出现hostvars['pay_server'] is undefined的错误。 - roles的vars定义变量值不一致:roles的
vars/main.yml中的变量会在每个Play启动时重新计算,如果now是动态生成的(比如基于当前时间),两个Play运行时间不同,变量值自然不一致。
可靠的跨Play变量共享方法
方法1:使用set_fact结合delegate_to存储到固定主机(推荐)
set_fact会将变量写入目标主机的facts中,只要后续Play能访问该主机的hostvars,就能获取变量。推荐将变量委托到localhost(控制节点,默认始终存在):
- name: dump_db Play hosts: pay_server tasks: - set_fact: now: "{{ ansible_date_time.iso8601 }}" delegate_to: localhost # 将变量存储到localhost的facts中 - name: Restore Play hosts: any_host # 可以是任意目标主机组 tasks: - debug: msg: "共享的时间变量: {{ hostvars['localhost'].now }}"
方法2:写入外部变量文件并加载
如果需要变量持久化(比如跨Playbook运行),可以将变量写入外部文件,后续Play通过vars_files加载:
- name: dump_db Play hosts: pay_server tasks: - copy: content: "now: {{ ansible_date_time.iso8601 }}" dest: ./shared_vars.yml # 在控制节点生成变量文件 delegate_to: localhost - name: Restore Play hosts: any_host vars_files: - ./shared_vars.yml # 加载外部变量文件 tasks: - debug: msg: "共享的时间变量: {{ now }}"
注意:确保控制节点上的文件路径可访问,多机器环境下避免文件被覆盖。
方法3:使用add_host创建临时共享主机
通过创建一个虚拟临时主机,将共享变量附加到该主机上,后续所有Play都可通过hostvars访问:
- name: dump_db Play hosts: pay_server tasks: - add_host: name: shared_vars_host # 自定义临时主机名 now: "{{ ansible_date_time.iso8601 }}" - name: Restore Play hosts: any_host tasks: - debug: msg: "共享的时间变量: {{ hostvars['shared_vars_host'].now }}"
这个方法不依赖现有目标主机,专门用于存储跨Play共享的变量。
内容的提问来源于stack exchange,提问作者L.T
相关产品推荐
相关产品推荐

