如何将Ansible静态inventory变量导入add_host生成的动态inventory
问题修复方案
报错根因
- 语法错误:原
when条件末尾多了一个多余的双引号,导致Jinja2模板解析失败 - 逻辑错误:
hostvars[item + '*']写法不成立,Ansible的hostvars字典不支持通配符直接作为key查询主机变量 - 效率问题:原Play指定
hosts: all会触发Ansible连接所有200台 inventory 主机,完全没必要,动态生成分组的逻辑在本地执行即可
修正后代码
- name: Play 1 - 生成目标主机动态分组 hosts: localhost gather_facts: no tasks: - name: 匹配目标主机并添加到dest_nodes分组 add_host: name: "{{ matched_host }}" groups: dest_nodes ansible_user: "{{ hostvars[matched_host].ansible_user }}" ORACLE_HOME: "{{ hostvars[matched_host].ORACLE_HOME }}" loop: "{{ hostnames.split() }}" vars: # 匹配以用户输入短名开头的完整inventory主机名,避免短名误匹配(如myhost1匹配到myhost11) matched_host: "{{ groups['all'] | select('search', '^' + item + '\\.') | first }}" # 仅当匹配到对应主机时才执行,避免无匹配时报错 when: groups['all'] | select('search', '^' + item + '\\.') | list | length > 0
后续使用示例
生成dest_nodes分组后,后续操作直接针对该分组执行即可:
- name: Play 2 - 执行CPU补丁相关操作 hosts: dest_nodes gather_facts: yes tasks: # 此处编写你的补丁检查、安装等逻辑
自定义调整说明
- 若需要模糊匹配(只要主机名包含用户输入的字符串就算匹配),将正则
'^' + item + '\\.'替换为item即可 - 若单个短名可能匹配到多台主机,将
first去掉后新增一层循环遍历所有匹配到的主机即可
内容的提问来源于stack exchange,提问作者Ashar
相关产品推荐
相关产品推荐

