使用Ansible操作GCP的VM实例
想做的事情
使用Ansible对GCP实例进行操作时,通过Dynamic Inventory功能动态获取实例名称。
-
- Dynamic Inventoryの機能を使わないとインスタンスのIPアドレスをhostsに登録しておかないといけないです。
-
- Cloud上のサーバを扱うためには一般的な方法(Cloud上のサーバはすぐアドレスが変わる)
-
- AnsibleのContrib/inventoryに様々な接続先のスクリプトが用意されている
ansible-playbook -i AAAA としてスクリプトを指定する使い方が一般的
准备
需要引入必要的文件。
这个环境是通过使用Cloud Shell来使用的。
* https://qiita.com/tokida/items/5fd4e50f6d983b9c52f6
pip install apache-libcloud
pip install pycrypto
下载Inventory文件
cd /tmp
git clone https://github.com/ansible/ansible.git
cp -p ansible/contrib/inventory/* ~/ansible/inventory/
chmod +x ~/ansible/inventory/gce.py
我这里会把整个脚本都复制下来。实际上,这次只有 gce.ini 和 gce.py 两个文件而已。
库存设置
- http://docs.ansible.com/ansible/latest/guide_gce.html
在GCP上添加服务帐号
您可以从控制台菜单中选择“服务帐户”。

我要新增一个新的服务账号。
* 我认为角色可以更加受限制。
* 我会下载p12格式的密钥。

下载的文件是p12格式(My\ First\ Project-3354799cb138.p12P),因此需要将其转换为libcloud可读取的pem格式。在此将创建一个名为~/ansible/credentials/的文件夹,并存储pkey.pem文件在其中。
openssl pkcs12 -in My\ First\ Project-3354799cb138.p12 -passin pass:notasecret -nodes -nocerts | openssl rsa -out ~/ansible/credentials/pkey.pem
请创建用于在 libcloud 中使用的认证信息文件 ~/credentials/secrets.py。
GCE_PARAMS = ('ansible@focused-code-188506.iam.gserviceaccount.com', '~/ansible/credentials/pkey.pem')
GCE_KEYWORD_PARAMS = {'project': 'focused-code-188506', 'datacenter': ''}
- project idは、サービスアカウントIDの @からiamの間の文字列です。
试试看
库存信息的获取
./ansible/inventory/gce.py --list | jq .
根据这个结果,我们可以看到Google Compute Engine(GCE)上可以使用网络标签。
],
"tag_web": [
"wp02"
],
"tag_https-server": [
"wp02"
],
"f1-micro": [
"wp02"
],
"status_running": [
"wp02"
],
"tag_http-server": [
"wp02"
],
在这种标有 tag_ 标签的状态下显示。这可以通过ansible来指定为一组。
执行
假设目前有两个实例。
$ gcloud compute instances list
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS
wp01 asia-northeast1-a f1-micro 10.146.0.2 35.200.11.2xx RUNNING
wp02 us-east1-b f1-micro 10.142.0.2 35.227.19.2xx RUNNING
假设在这种情况下,网络标签web被同时附加到两个选项上。
$ ansible -i inventory/gce.py tag_web --private-key=~/.ssh/google_compute_engine -m ping
wp01 | SUCCESS => {
"changed": false,
"ping": "pong"
}
wp02 | SUCCESS => {
"changed": false,
"ping": "pong"
}
- 実行する際に ssh_keyを指定
总结
- inventoryを利用することでgceのinstance名を利用して ansibleが利用することが出来ます。