Ansible - 从远程主机读取环境变量

3

我正在尝试使用Ansible playbook从目标Linux主机读取环境变量。根据文档,我尝试了以下所有任务,但没有结果。

   - name: Test1    
     debug: msg="{{ ansible_env.BULK }}"
     delegate_to: "{{ target_host }}"

   - name: Test2  
     shell: echo $BULK
     delegate_to: "{{ target_host }}"
     register: foo

   - debug: msg="{{ foo.stdout }}"

   - name: Test3 
     debug: msg="{{ lookup('env','BULK')}} is an environment variable"
     delegate_to: "{{ target_host }}"

我在执行playbook的本地主机上没有设置环境变量"BULK",所以我认为它不会返回任何值。如果我使用始终可用的"HOME"替代BULK,则会返回结果。如果我通过SSH登录到目标主机,则可以轻松运行echo $BULK

如何从远程主机获取环境变量?


为什么你在每个任务中都使用 delegate_to - techraf
@techraf:这个YAML文件中有多个任务。一些任务在本地主机上运行,另一些在目标主机上运行。这只是为了测试,所有三个任务执行相同的操作。如果我能够读取环境变量,我将删除另外两个任务。 - Prashanth_Ramanathan
3个回答

2
如果我SSH到目标主机,我可以轻松运行echo $BULK。很可能是因为BULK设置在rc文件中,在目标机器的shell交互会话中才被调用。而Ansible的gather_facts任务在非交互式会话中运行。
如何从远程主机获取环境变量?
将设置BULK变量的行移动到一个无论会话类型如何都会被调用的位置(具体位置取决于目标操作系统和shell)。
例如,请参见:https://unix.stackexchange.com/a/170499/133107以获取提示。

0

查看/etc/profile文件并使用grep命令搜索env

我的解决方案不是完美的,但通常有效。例如,我想检查远程主机是否有代理服务器的环境变量,我会执行以下操作:

作为临时的Ansible命令:

ansible remote_host -b -m shell -a '. /etc/profile && (env | grep -iP "proxy")'

解释:

  • 我更喜欢使用shell模块,因为它能够按照我的期望工作...就像在shell中执行一样
  • . /etc/profile会加载/etc/profile文件,并且该文件会加载其他位于/etc/profile.d目录下的文件。因此,在执行这个命令后,我就可以获得环境的固定部分。
  • env | grep -iP "proxy"会过滤出我所需要的变量在扩展环境中的值。

0

在ansible的“收集事实”任务期间,远程环境变量将被自动收集。

您可以像这样检查它们:

- name: inspect env vars
  debug:
    var: ansible_facts.env

针对你的情况,尝试这样做:

- name: Test4 
  debug: msg="{{ ansible_facts.env.BULK }} is the value of an environment variable"
  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接