使用 Ansible 配置 Azure 资源的动态清单
简介
在主机变化不定的云环境中,Ansible 的动态清单功能可以消除维护静态清单文件的负担
本教程将带你使用 Azure 的 dynamic-inventory
插件,自动填充 Ansible 清单。
1.安装pipx
从 Ubuntu 23.04 开始,系统默认禁止在全局环境中使用 pip install,以避免与系统自带的 APT 包管理器(如 python3-* 包)产生冲突
所以因为我的是ubuntu版本为24 LTS
, 必须要用pipx来安装ansible,而不能直接使用apt安装,这样后面才能安装依赖不报错。
参考文档:pipx–installation
sudo apt update
sudo apt install pipx
pipx ensurepath
2.通过 pipx 安装 Ansible
pipx install --include-deps "ansible<10"
参数:
--include-deps
在使用 pipx 安装 Ansible 时,如果未指定 --include-deps 参数,pipx 只会安装主包,而不会安装其依赖项,包括ansible-core
他的输出会是这样
installed package ansible 9.13.0, installed using Python 3.12.3
These apps are now globally available
- ansible
- ansible-community
- ansible-config
- ansible-connection
- ansible-console
- ansible-doc
- ansible-galaxy
- ansible-inventory
- ansible-playbook
- ansible-pull
- ansible-test
- ansible-vault
done! ✨ 🌟 ✨
这里有个大坑,从 Ansible 10
开始,Ansible 官方做了一个大重构:不再提供 ansible 命令入口点,转而用 ansible-community 这个命令来代表 Ansible CLI 主入口
。ansible 和 ansible-playbook 等命令被移除,取而代之的是通过 ansible-community 调用相应的插件。所以以前直接ansible是会报错的,这里降级安装 小于10
的版本
装完之后需要重新打开一个bash终端
,然后才能ansible --version
ansible [core 2.16.14]
config file = None
configured module search path = ['/home/azureuser/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /home/azureuser/.local/share/pipx/venvs/ansible/lib/python3.12/site-packages/ansible
ansible collection location = /home/azureuser/.ansible/collections:/usr/share/ansible/collections
executable location = /home/azureuser/.local/bin/ansible
python version = 3.12.3 (main, Feb 4 2025, 14:48:35) [GCC 13.3.0] (/home/azureuser/.local/share/pipx/venvs/ansible/bin/python)
jinja version = 3.1.6
libyaml = True
如果显示出来版本,证明你成功了,可以进入下一步
3.安装azure.azcollection
此集合提供了一系列用于与 Azure 交互的 Ansible 模块和插件
ansible-galaxy collection install azure.azcollection --force
输出这样就是成功了
Starting galaxy collection install process
Process install dependency map
Starting collection install process
Downloading https://galaxy.ansible.com/api/v3/plugin/ansible/content/published/collections/artifacts/azure-azcollection-3.3.1.tar.gz to /home/azureuser/.ansible/tmp/ansible-local-2726e_5yr3jc/tmp8eixr_93/azure-azcollection-3.3.1-52eb6zq_
Installing 'azure.azcollection:3.3.1' to '/home/azureuser/.ansible/collections/ansible_collections/azure/azcollection'
azure.azcollection:3.3.1 was installed successfully
4.安装集合所需的依赖项
pipx runpip ansible install -r ~/.ansible/collections/ansible_collections/azure/azcollection/requirements.txt
5.生成动态库存
Ansible 提供了 Azure 动态库存插件,这里使用环境变量作为凭证,其他配置方法请阅读参考文档
参考文档:azure.azcollection.azure_rm inventory – Azure 资源管理器库存插件
创建 myazure_rm.yml
文件,配置示例如下:
plugin: azure.azcollection.azure_rm
include_vm_resource_groups:
- ansible-inventory-test-rg
auth_source: auto
在Azure的Entra ID注册一个应用,使其成为一个服务主体,分配其权限,然后复制subscription_id、client_id、secret 和 tenant id,然后使其export为环境变量
export AZURE_SUBSCRIPTION_ID="your_subscription_id"
export AZURE_CLIENT_ID="your_client_id"
export AZURE_CLIENT_SECRET="your_client_secret"
export AZURE_TENANT_ID="your_tenant_id"
运行命令查看资源组内的虚拟机:
ansible-inventory -i myazure_rm.yml --graph
运行结果示例:
@all:
|--@ungrouped:
| |--linux-vm_cdb4
| |--win-vm_3211
这里两个虚拟机都属于 ungrouped
组,ungrouped
是 all
组的子组。
Azure 动态库存插件默认返回全局唯一的虚拟机名称,名称中会带有额外字符。如果想禁用此行为,可以在清单文件里添加:
plain_host_names: yes