[备忘录] 使用ansible-inventory获取GCE实例信息

我最近开始学习Ansible,作为验证环境,我创建了多个GCE实例并进行了各种尝试。
在这个过程中,我觉得每次启动实例都要将IP地址更新到清单文件中很麻烦,于是我决定尝试使用GCE动态清单。
由于这一过程遇到了一些困难,所以我记录了使用GCE动态清单的步骤,并将其作为一篇文章。

版本

    • Ansible: 2.7.0

 

    Python: 2.7.15

需要的软件包。

需要安装requests和google-auth。
请使用下面的命令进行安装。

pip install requests google-auth

创建库存文件

创建如下所示的清单文件。
但是,文件名必须以”.gcp.yml”、”.gcp.yaml”、”.gcp_compute.yml”、”.gcp_compute.yaml” 结尾。
请根据您的环境进行设置。

plugin: gcp_compute
zones:
  - <your-zone>
projects:
  # プロジェクト ID を指定する
  - <your-project-ID>
scopes:
  - https://www.googleapis.com/auth/compute
service_account_file: <your-service-account-file-path>
auth_kind: serviceaccount
filters:
  - <your-filters>
hostnames:
  # [ name | public_ip | private_ip ] のどれかを指定できる
  - name

最好以JSON格式下载服务账户文件。
如果需要的话,可以添加其他参数,但我没有继续尝试。

編輯ansible.cfg文件。

只是创建和执行了上述的清单文件,并不能调用 gcp_compute 插件。
我在这里遇到了相当大的问题…

在Ansible的初始设置中,gcp_compute插件的调用被设置为不呼叫。因此,在位于/etc/ansible/ansible.cfg的约300行附近,应该有一个写入插件设置的地方,解除那里的注释并添加gcp_compute。

[inventory]
# enable inventory plugins, default: 'host_list', 'script', 'yaml', 'ini'
enable_plugins = gcp_compute, host_list, virtualbox, yaml, constructed

执行ansible-inventory -i .gcp.yml –list

如果按照标题所示执行ansible-inventory -i .gcp.yml –list命令,可以从正在运行的GCE实例中获取信息。
然而,由于获取了所有信息,所以找到所需的信息也是一件麻烦的事情。

如果将选项–graph应用于ansible-inventory -i .gcp.yml,可以获取主机名或IP地址之一。
我希望通过使用jq来提取只有IP地址的主机名、IP地址。

(补充说明:2018年10月20日)
只需将输出结果复制粘贴到清单文件中,问题就解决了。虽然我觉得可能有更好的方法,但是。。。

ansible-inventory -i <file-name>.gcp.yml --list \
| jq -c '._meta.hostvars[] | { (.name): .networkInterfaces[0].accessConfigs[0].natIP }' \
| sed -r -e 's/\{(.+)\}/\1/g' -e 's/"//g' -e 's/(.+):(.+)/\1 ansible_host=\2/g'

# 出力例
host1 ansible_host=192.168.1.1
host2 ansible_host=192.168.1.2
广告
将在 10 秒后关闭
bannerAds