如何通过Foreman Inventory插件将Foreman主机参数传入Ansible变量
我希望在GitLab CI中运行Ansible playbook,而非从Foreman/Satellite触发(例如调度体验不佳等原因)。为此我使用theforeman.foreman.foreman Inventory插件从Foreman/Satellite获取主机清单,但我的Ansible角色需要使用Foreman/Satellite中定义的主机参数变量,却无法通过该插件访问这些变量。
我的Inventory插件YAML配置如下:
plugin: theforeman.foreman.foreman url: https://whatever.url... user: rhs_inventory_reader password: ********** host_filters: 'last_checkin > "12 hours ago" and hypervisor = false' want_facts: true want_hostcollections: true want_params: true legacy_hostvars: true
根据文档说明,legacy_hostvars参数的作用是:
将主机变量放入包含
foreman、foreman_facts和foreman_params键的字典中
但我尝试通过如下任务打印变量时,发现这些变量在Ansible中并未定义:
tasks: - debug: var: foreman
请问此方法存在什么问题?如何在不通过Foreman触发运行的前提下,通过Foreman Inventory插件从Ansible中获取Foreman主机参数?
1. 排查插件版本与参数兼容性
legacy_hostvars: true是旧版theforeman.foreman集合的参数,在2.0及以上版本中已被弃用,改用hostvars_prefix替代。如果你的插件是新版本,这个旧参数不会生效,也就无法生成foreman这类顶层变量。
修改配置为:
plugin: theforeman.foreman.foreman # 保留原有url、user、password、host_filters等配置 want_facts: true want_hostcollections: true want_params: true hostvars_prefix: foreman_
此时主机参数会以foreman_params的形式存在,可通过debug: var: foreman_params查看。
2. 确认用户权限
确保rhs_inventory_reader用户拥有查看主机参数的权限(Foreman中的view_host_parameters权限)。如果权限不足,插件无法拉取参数数据,自然不会生成对应变量。
3. 定位变量实际路径
如果不确定变量位置,先打印当前主机的所有变量:
tasks: - debug: var: hostvars[inventory_hostname]
在输出中查找参数相关字段,新版本插件中,参数通常存放在foreman.params下,可通过debug: var: foreman.params访问。
4. 验证插件输出
在本地执行ansible-inventory -i your_inventory.yml --list,查看生成的主机变量结构。如果这里没有参数,说明插件配置或权限有问题;如果存在参数,再检查playbook中的变量引用路径是否正确。
内容的提问来源于stack exchange,提问作者Bvoid

