我尝试使用以下方法在工作人员主机的负载均衡器主机中查找文本模式:
- 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 }}"
...也是,但它会打印一个空字符串。
答案 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。
中的更多信息答案 1 :(得分:2)
我个人会通过在Ansible中添加env:
作为变量(可能在负载均衡器主机的$ENVIRONMENT_VARIABLE
中)或者在负载均衡器主机上运行游戏来简化您的游戏手册而不是使用host_vars
。根据其他任务的不同,它可能没有意义。
这是你问题的直接答案。
只有当主机包含在剧本中时,才会定义 load-balancer-host的delegate_to
。您可以针对只会收集事实的'load-balancer-host'添加另一个游戏。然后,您可以在随后的“工人”游戏中使用ansible_env
从'load-balancer-host'中引用事实。他就是这样的样子。
hostvars