You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Ansible远程主机的facts.d脚本获取指定环境变量?

问题描述

我需要使用动态Facts,为此编写了一个位于/etc/ansible/facts.d/my_facts.fact的脚本。该脚本需从云服务商拉取部分信息,因此需要API令牌,出于安全考虑,不希望将令牌明文存储在服务器上。

触发Ansible的进程已在其环境中导出MY_SECRET_API_TOKEN变量,我的Ansible代码如下:

---
- name: do the things
  import_tasks: my_tasks.yml
  environment:
    MY_SECRET_API_TOKEN: "{{ lookup('env', 'MY_SECRET_TOKEN') }}"
  when: ansible_facts['os_family'] == "Debian"

而my_facts.fact bash脚本中有如下代码,当环境中不存在令牌时,会导致Facts收集失败并返回rc: 99:

[[ ${MY_SECRET_TOKEN} == '' ]] && { echo Secret not found && exit 99 ; }

curl --silent -XGET -H "Authorization: Bearer ${MY_SECRET_TOKEN}" https://web.site.com/api/lookup

我尝试在角色级别设置environment:块,但也无济于事。请问如何让远程主机的Facts收集过程获取到该环境变量?

解决方法
  • 统一变量名:你的Ansible代码传递的环境变量是MY_SECRET_API_TOKEN,但脚本中检查的是MY_SECRET_TOKEN,变量名不匹配会导致令牌无法被识别,先将两边变量名统一。
  • 为Facts收集阶段传递环境变量:常规的environment块仅作用于任务执行阶段,而Facts收集是独立的前置阶段,需要使用ansible_facts_environment配置来传递环境变量:
    1. 在Playbook中直接配置(推荐,仅作用于当前Play):
      ---
      - name: 执行任务并配置Facts环境变量
        hosts: all
        ansible_facts_environment:
          MY_SECRET_TOKEN: "{{ lookup('env', 'MY_SECRET_TOKEN') }}"
        tasks:
          - name: do the things
            import_tasks: my_tasks.yml
            when: ansible_facts['os_family'] == "Debian"
      
    2. 全局配置(适用于所有Play,按需使用):
      在ansible.cfg中添加以下配置:
      [defaults]
      ansible_facts_environment = {"MY_SECRET_TOKEN": "{{ lookup('env', 'MY_SECRET_TOKEN') }}"}
      
  • 验证环境变量传递:可临时修改my_facts.fact脚本,添加env | grep MY_SECRET_TOKEN语句,执行Facts收集后查看输出,确认变量是否正确传递。

内容的提问来源于stack exchange,提问作者TRex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 03:35:18