Ansible
gcp

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.inigce.py の2つだけです。

Inventoryの設定

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の間の文字列です。

使用してみる

Inventory 情報の取得

./ansible/inventory/gce.py --list  | jq .

この結果を見ると、GCE上のネットワークタグが利用できることがわかります。

  ],
  "tag_web": [
    "wp02"
  ],
  "tag_https-server": [
    "wp02"
  ],
  "f1-micro": [
    "wp02"
  ],
  "status_running": [
    "wp02"
  ],
  "tag_http-server": [
    "wp02"
  ],

このように tag_ が付いた状態で見えます。これは ansible でグループとして指定することが出来ます。

実行

今回はInstanceが2台あるとします。

$ 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が利用することが出来ます。