You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ansible:如何从动态Inventory标签获取主机并执行Playbook

解决VMware动态Inventory返回UUID无法解析的问题

作为Ansible新手碰到这种动态Inventory的坑确实挺闹心的,我给你整理几个实用的解决思路,帮你顺利针对activedirectory-devops组执行Playbook:

1. 调整动态Inventory配置,直接返回可解析的主机名

这是最根本的解决办法,让VMware动态Inventory直接输出能被DNS解析的主机名,而不是UUID。你只需要在vmware.yml配置文件里添加hostname_pattern参数,指定用VM的名称、FQDN或者IP作为主机标识:

plugin: vmware_vm_inventory
strict: False
hostname: your_vcenter_hostname  # 替换成你的vCenter地址
username: your_vcenter_username  # 替换成你的vCenter账号
password: your_vcenter_password  # 替换成你的vCenter密码
validate_certs: False  # 如果没配置证书的话设为False
with_tags: True  # 保留标签组的功能
# 关键配置:用VM名称+域名生成可解析的FQDN
hostname_pattern: '{guest_name}.your-domain.com'
# 如果你更想用IP的话,也可以改成下面这样
# hostname_pattern: '{ip_address}'

配置完后,你可以先运行ansible-inventory -i vmware.yml --list看看输出,activedirectory-devops组里的主机应该已经变成可解析的名称/IP了,之后直接执行你的命令:

ansible-playbook -i vmware.yml site.yml

就能正常针对组内主机执行任务了。

2. 用静态Inventory映射UUID到可解析地址

如果不想修改动态Inventory的配置,你可以创建一个静态Inventory文件(比如hosts.ini),把动态返回的UUID和对应的可解析主机名关联起来:

# 针对activedirectory-devops组的主机做映射
[activedirectory-devops]
564d9bef-xxxx-xxxx-xxxx-xxxxxxxxx ansible_host=ad-dev-01.your-domain.com
564d9bef-yyyy-yyyy-yyyy-yyyyyyyyy ansible_host=ad-dev-02.your-domain.com

然后运行Playbook时同时加载动态和静态Inventory:

ansible-playbook -i vmware.yml -i hosts.ini site.yml

Ansible会自动合并两组Inventory的信息,用ansible_host里的地址去连接对应的UUID主机。

3. 在Playbook里动态设置连接地址

你还可以直接在Playbook中利用VMware动态Inventory返回的其他变量(比如guest_nameip_address)来指定连接地址,不用修改Inventory配置:

- name: 执行AD组相关任务
  hosts: activedirectory-devops
  vars:
    # 用VM的名称拼接域名作为连接地址
    ansible_host: "{{ guest_name }}.your-domain.com"
    # 或者直接用VM的IP
    # ansible_host: "{{ ip_address }}"
  tasks:
    - name: 示例任务:检查主机连通性
      ping:

这样即使主机名是UUID,Ansible也会使用ansible_host变量里的可解析地址去建立连接。

最后建议你先用ansible -i vmware.yml activedirectory-devops -m ping测试一下配置是否生效,确保能正常连通主机后再执行完整的Playbook。

内容的提问来源于stack exchange,提问作者mellow-yellow

火山引擎 最新活动