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

如何将Ansible静态inventory变量导入add_host生成的动态inventory

问题修复方案

报错根因

  1. 语法错误:原when条件末尾多了一个多余的双引号,导致Jinja2模板解析失败
  2. 逻辑错误:hostvars[item + '*'] 写法不成立,Ansible的hostvars字典不支持通配符直接作为key查询主机变量
  3. 效率问题:原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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:27:03