1

我正在尝试使用以下命令在工作主机的负载均衡器主机中查找文本模式:

- 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(此变量存在于负载平衡器主机中)可用于播放(它包含负载平衡器主机中的目录,我想从那里查看为了)。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 }}"

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

4

2 回答 2

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

此任务将使 $ENVIRONMENT_VARIABLE 在每个工作人员ansible_env var 中可用。如果您想让 $ENVIRONMENT_VARIABLE 在负载平衡器主机ansible_env中可用,只需将delegate_facts设置为 True。

ansible 文档中的更多信息

于 2017-08-10T07:47:39.003 回答
2

就我个人而言,我会通过$ENVIRONMENT_VARIABLE在 Ansible 中添加作为变量(可能在host_varsfor load-balancer-host 中)或针对 load-balancer-host 而不是使用delegate_to. 根据其他任务是什么,这可能没有意义。

不过,这是您问题的直接答案。

ansible_env只有当主机包含在剧本中时才会定义负载平衡器主机。您可以针对仅收集事实的“负载平衡器主机”添加另一个游戏。hostvars然后,您可以在随后与“工人”的比赛中参考“负载平衡器主机”中的事实。他就是它的样子。

- hosts: load-balancer-host
  tasks:
  - name: print debug message
    debug:
      msg: "this play is for gathering facts on the LB"

- name: A play
  hosts: workers
  tasks:
  - name: Look for text pattern in delegated host
    delegate_to: load-balancer-host
    find:
      paths: "{{ hostvars['load-balancer-host'].ansible_env.ENVIRONMENT_VARIABLE }}/subdir"
      file_type: file
      patterns: file.pattern
      contains: 'text pattern'
    register: aVariable
于 2017-08-09T18:29:13.780 回答