仅具有私有 IP 的 Azure VM 的 Ansible 动态清单
Posted
技术标签:
【中文标题】仅具有私有 IP 的 Azure VM 的 Ansible 动态清单【英文标题】:Ansible dynamic inventory for Azure VM with private IP only 【发布时间】:2019-10-22 20:17:14 【问题描述】:在 Azure 上,我有一个包含 2 个服务器的 1 个 vnet 的资源组;主人和工人。只有 master 有公共 IP。
使用“普通”Ansible 我可以通过在hosts
文件中将工作人员的私有IP 定义为ansible_host
并创建一个带有ssh ProxyCommand 参数的group_vars
文件来管理两个服务器,以申请工作人员组,如@ 987654321@ 此处(请注意,还有一些较旧的方法也涉及直接 ssh 配置,但我认为 group_vars 方法更可取,因为它更便于其他用户使用)。
但是,这种方法需要对 IP 进行硬编码,这在 Azure 上不是很好。有一个 azure_rm
inventory script 或 plugin(取决于 Ansible 版本)将提供动态清单,避免需要 hosts 文件,但在这种情况下我该如何做相当于 ProxyCommand 设置?
这种情况一定很常见,所以我觉得我一定是错过了什么。
【问题讨论】:
【参考方案1】:堡垒主机
要在 Ansible 中使用代理/堡垒主机/跳转主机,您需要在 ansible.cfg
中指定 ansible_ssh_common_args
。
ANSIBLE_SSH_COMMON_ARGS
,但由于 this Ansible issue 而缺少该变量 - 自 Ansible 2.9.3 起尚未修复。
您可以在all
组级别的静态清单中设置此功能以进行试验(在没有动态清单的情况下更容易先尝试) - 请参阅this blog 了解更多详细信息。
[all:vars]
ansible_ssh_common_args='-o ProxyCommand="ssh -W %h:%p my-bastion.example.com"'
一旦你有了这个工作,你可以使用动态库存 - 创建一个文件group_vars/all.yml
(首先使用静态库存测试),将上述 INI 格式库存转换为 YAML(将 =
更改为 :
)。
ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p my-bastion.example.com"'
在动态库存中使用私有 IP
要确保清单输出中的ansible_host
使用私有IP,您必须使用export AZURE_USE_PRIVATE_IP=true
(使用经典的azure_rm.py
清单脚本,尚未尝试使用插件清单)。
ansible_host
可能为空或设置为公共 IP/域名
如果您使用解析为私有 IP 的域名,则可能不需要此设置
测试动态库存
在开始将动态清单用于剧本之前,请务必测试它是否生成了正确的 JSON 数据。
要检查特定清单值是否映射到正确的主机,请尝试:
$ AZURE_USE_PRIVATE_IP=true ansible -i azure_rm.py mygroup -m debug -a var=ansible_host
test01 | SUCCESS =>
"ansible_host": "10.0.0.1"
您还可以检查 Ansible SSH 是否像这样工作,在调试时使用 -vvvvv
:
$ AZURE_USE_PRIVATE_IP=trueansible -i azure_rm.py mygroup -m debug -a var=ansible_host
test01 | SUCCESS =>
"changed": false,
"ping": "pong"
经典与基于插件的广告资源
我在这里使用了“经典”azure_rm.py
动态库存——同样的方法适用于新的基于插件的动态库存(从 Ansible 2.4 开始,包括库存缓存)。
在任一模式下查看动态库存 JSON 输出:
经典:AZURE_USE_PRIVATE_IP=true python azure_rm.py | jq .
基于插件:ansible-inventory -i azure.yml --graph
jq 的使用是可选的,它只是格式化输出以提高可读性。
【讨论】:
以上是关于仅具有私有 IP 的 Azure VM 的 Ansible 动态清单的主要内容,如果未能解决你的问题,请参考以下文章
如何在Azure VM上配置IIS站点以接受来自其他外部IP地址的请求?
从具有私有和公共 IP 的虚拟机连接到私有 IP 上的 Google Cloud SQL 实例失败
Azure 仅允许通过 azure *** 访问 azure 门户