仅具有私有 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地址的请求?

WebApp 私有端点 azure ***

从具有私有和公共 IP 的虚拟机连接到私有 IP 上的 Google Cloud SQL 实例失败

Azure 仅允许通过 azure *** 访问 azure 门户

在具有外部访问权限的 Azure VM 中预配 SQL Always on

如何通过私有 DNS 名称从虚拟网络中的应用服务访问 Azure VM?