Ansible - 使用委托主机中的delegate_to和访问环境变量

时间:2017-08-09 16:02:16

标签: ansible ansible-2.x ansible-facts

我尝试使用以下方法在工作人员主机的负载均衡器主机中查找文本模式:

- name: A play
  hosts: workers
  tasks:
    - name: Look for text pattern in delegated host
      delegate_to: load-balancer-host
      find:
        paths: "$ENVIRONMENT_VARIABLE/subdir"
        file_type: file
        patterns: file.pattern
        contains: 'text pattern'
      register: aVariable

问题在于,我无法找到任何方法可以为播放提供$ ENVIRONMENT_VARIABLE(此变量存在于load-balancer-host中)(它包含目录,在load-balancer-host中,来自在哪里我想寻找)。 ansible_env仅适用于工作人员,但不适用于负载均衡器主机

我试过......

- name: A play
  hosts: workers
  tasks:
    - name: set fact
      set_fact:
        env_var: "{{ lookup('env', 'ENVIRONMENT_VARIABLE') }}"
      delegate_to: load-balancer-host

    - name: debug
      debug:
        msg: "{{ env_var }}"

...也是,但它会打印一个空字符串。

2 个答案:

答案 0 :(得分:3)

对于运行Ansible 1.x的用户,请参阅kfreezy的回答。

对于运行Ansible 2.x的用户,我找到了以下解决方案:

- hosts: workers
  tasks:
    - name: gather facts from lb
      setup:
      delegate_to: load-balancer-host
      delegate_facts: false

此任务将使每个工作人员 ansible_env var中的$ ENVIRONMENT_VARIABLE可用。如果您想在load-balancer-host ansible_env 中使$ ENVIRONMENT_VARIABLE可用,只需将 delegate_facts 设置为True。

ansible docs

中的更多信息

答案 1 :(得分:2)

我个人会通过在Ansible中添加env:作为变量(可能在负载均衡器主机的$ENVIRONMENT_VARIABLE中)或者在负载均衡器主机上运行游戏来简化您的游戏手册而不是使用host_vars。根据其他任务的不同,它可能没有意义。

这是你问题的直接答案。

只有当主机包含在剧本中时,才会定义

load-balancer-host的delegate_to。您可以针对只会收集事实的'load-balancer-host'添加另一个游戏。然后,您可以在随后的“工人”游戏中使用ansible_env从'load-balancer-host'中引用事实。他就是这样的样子。

hostvars