やりたいこと
Ansibleを利用してGCPのインスタンスを操作するさいに、Dynamic Inventoryの機能でインスタンス名を動的に取得する
- Dynamic Inventoryの機能を使わないとインスタンスのIPアドレスをhostsに登録しておかないといけないです。
- Cloud上のサーバを扱うためには一般的な方法(Cloud上のサーバはすぐアドレスが変わる)
- AnsibleのContrib/inventoryに様々な接続先のスクリプトが用意されている
-
ansible-playbook -i AAAA
としてスクリプトを指定する使い方が一般的
準備
必要なファイルの導入
この環境は Cloud Shellを利用しています
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
の2つだけです。
Inventoryの設定
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の間の文字列です。
使用してみる
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が利用することが出来ます。