使用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上添加服务帐号

您可以从控制台菜单中选择“服务帐户”。

Kobito.WI59U6.png

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

Kobito.dQKU7b.png

下载的文件是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が利用することが出来ます。
广告
将在 10 秒后关闭
bannerAds