LoginSignup
5
4

More than 5 years have passed since last update.

AnsibleでGCP のVMインスタンスを操作する

Last updated at Posted at 2017-12-11

やりたいこと

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4