如何让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配置来传递环境变量:- 在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" - 全局配置(适用于所有Play,按需使用):
在ansible.cfg中添加以下配置:[defaults] ansible_facts_environment = {"MY_SECRET_TOKEN": "{{ lookup('env', 'MY_SECRET_TOKEN') }}"}
- 在Playbook中直接配置(推荐,仅作用于当前Play):
- 验证环境变量传递:可临时修改
my_facts.fact脚本,添加env | grep MY_SECRET_TOKEN语句,执行Facts收集后查看输出,确认变量是否正确传递。
内容的提问来源于stack exchange,提问作者TRex
相关产品推荐
相关产品推荐

