Ansible如何不使用清单文件直接以IP作为主机执行任务
问题根源
- Play级别的
hosts字段仅支持传入主机匹配模式的字符串或字符串列表,你传入了字典结构,Ansible会将该字典尝试作为缓存键使用,而字典属于不可哈希类型,直接触发unhashable type: 'AnsibleMapping'报错。 - 之前直接将IP填入
hosts字段触发忽略警告,是因为Ansible默认仅匹配已在当前清单中声明的主机,未录入的主机会被自动过滤。
解决方案
不需要维护静态清单文件,使用add_host模块将动态获取的VM IP添加到内存运行时清单即可,完整示例如下:
--- # 第一个Play:在控制节点执行,添加新VM到临时清单 - name: 动态注册新VM主机 hosts: localhost gather_facts: no vars: # 替换为你实际存储新VM IP的变量名 new_vm_dhcp_ip: 172.16.0.33 tasks: - name: 添加新VM到运行时清单 ansible.builtin.add_host: # 主机别名,可自定义 name: new_deploy_vm # 实际连接用的IP ansible_host: "{{ new_vm_dhcp_ip }}" # SSH连接用户名 ansible_user: user01 # 如有自定义SSH端口取消注释下行 # ansible_port: 5555 # 临时分组,后续Play直接匹配该分组即可 groups: temp_new_vms # 第二个Play:直接针对新VM执行操作 - name: 更新新VM系统包 hosts: temp_new_vms become: yes tasks: - name: 更新apt缓存并升级所有软件包 register: updatesys apt: name: "*" state: latest update_cache: yes
补充说明
add_host添加的主机仅在本次playbook运行周期内有效,运行结束后自动销毁,完全适配VM IP动态变化的场景。- 需提前确保控制节点到新VM的SSH连通性,建议将SSH公钥预置到VM模板中,避免手动输入密码。
内容的提问来源于stack exchange,提问作者Bryant
相关产品推荐
相关产品推荐

