Ansible - 使用 delegate_to 并从委托主机访问环境变量

Ansible - use delegate_to and access environment variable from delegated host

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

- 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 仅适用于 worker 但不适用于 load-balancer-host

我试过了...

- 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 }}"

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

就我个人而言,我会通过在 Ansible 中添加 $ENVIRONMENT_VARIABLE 作为变量(可能在负载均衡器主机的 host_vars 中)或 运行 来简化你的剧本load-balancer-host 而不是使用 delegate_to。根据其他任务的不同,它可能没有意义。

这里是对您问题的直接回答。

load-balancer-host 的 ansible_env 仅当主机包含在剧本中时才会定义。您可以添加另一个针对 'load-balancer-host' 的游戏,它只会收集事实。然后,您可以在与 'workers' 的后续比赛中使用 hostvars 参考 'load-balancer-host' 中的事实。他就是它的样子。

- 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

对于用户 运行 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 在 load-balancer-host ansible_env 中可用,只需设置 delegate_facts 为真。

更多信息见ansible docs