0%

AnsibleでGCEにSalt Masterをプロビジョニング

GCEにSaltをインストールしましたが、前にAnsibleCloud Modulesを使っていたのを思い出しました。
今回はバージョンは1.6.1の、gceモジュールでSalt MasterをGCEにプロビジョニングしてみます。

はじめに

AnsibleはChefやSaltと違ってクライアントのインストールが不要です。ローカルへの実行もできます。
Guideソースコードを読みながら作業を進めていきます。

記述するファイルは少ないのですが、ディレクトリ構造を覚える必要があります。

GCE用のユーザー

gceuserにAnsibleの実行環境を作っていきます。プロジェクトを作成します。

$ sudo su - gceuser
$ mkdir -p ansible_apps/gce
$ cd !$

Ansibleのインストール

Ansibleとlibcloudをインストールします。libcloudは0.14+を使います。

$ sudo pip install ansible apache-libcloud
$ pip search ansible
ansible - Radically simple IT automation
INSTALLED: 1.6.1 (latest)
$ pip search apache-libcloud
INSTALLED: 0.14.1 (latest)

GCE用クライアントIDの作成

Google Developers Consoleへログインし、現在使っているプロジェクトIDを開きます。
APIと認証 -> 認証情報 -> 新しいクライアントIDを作成 -> サービスアカウント -> と進み、クライアントIDを作成します。
salt-cloudで使うサービスアカウントの秘密鍵をダウンロードして、xxx-privatekey.p12の名前で保存します。

サービスアカウントの鍵をPKCS12フォーマットからコンバートします。

$ cd ~/ansible_apps/gce
$ openssl pkcs12 -in ./xxx-privatekey.p12 -passin pass:notasecret \
-nodes -nocerts |openssl rsa -out ./service_account_private_key
MAC verified OK
writing RSA key

Ansibleプロジェクトディレクトリ

Ansibleは複数ファイルを書いて構成するので、ディレクトリ構造が重要です。

$ cd ~/ansible_apps
$ tree gce
gce
├── xxx-privatekey.p12
├── gce.yml
├── hosts
├── roles
│ └── salt
│ └── tasks
│ └── main.yml
└── service_account_private_key

インベントリファイルを作成します。localhostへはローカル接続するように指定します。

[localhost]
localhost ansible_connection=local

GCEプロビジョニング用のPlaybookです。ちょっと長いのでvars.ymlなどは分割した方がよさそうですが、
わかりやすいように、一つのファイルにしました。ZeroMQのポートも開けています。

~/ansible_apps/gce/gce.yml
---
- name: Create a Sault Master instance
hosts: localhost
gather_facts: no
connection: local

vars:
machine_type: n1-standard-1
image: debian-7
service_account_email: xxx.gserviceaccount.com
pem_file: service_account_private_key
project_id: xxx-xxx-456

names: salt-master
zone: asia-east1-a

tasks:
- name: Launch instances
local_action: gce instance_names"{{ names }}"
machine_type="{{ machine_type }}"
image="{{ image }}"
zone="{{ zone }}"
service_account_email="{{ service_account_email }}"
pem_file="{{ pem_file }}"
project_id="{{ project_id }}"
tags: salt-master
register: gce

- name: Wait for SSH to come up
local_action: wait_for host="{{ item.public_ip }}"
port=22
delay=10
timeout=60
state=started
with_items: gce.instance_data

- name: Configure instance(s)
hosts: launched
sudo: True
roles:
- salt

- name: Open port for ZeroMQ
hosts: localhost
connection: local
gather_facts: False
tasks:
- name: Allow ZeroMQ port
local_action:
module: gce_net
name: default
allowed: tcp:4505,4506
fwname: all-zeromq
service_account_email: "{{ service_account_email }}"
pem_file: "{{ pem_file }}"
project_id: "{{ project_id }}"

Salt Masterをインストールするロールを書きます。

~/ansible_apps/gce/roles/salt/tasks/main.yml
---

- name: install Salt Master
command: curl -L http://bootstrap.saltstack.org | sh -s -- -M -N git develop
- name: install libcloud
pip: name=apache-libcloud

Playbookの実行をします。

$ ansible-playbook -i hosts gce.yml

作成したGCEのインスタンスにSSH接続します。

$ gcutil ssh salt-master
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
gceuser@salt-master:~$

まとめ

久しぶりにAnsibleを使いましたが、Saltに比べファイル分割が自分にはわかりにくい気がします。
最近はDockerfileに慣れているので、Ansible流にモジュールを覚えるのが、やはりChefやPuppetみたいでなんか面倒です。

Docker on GCE with Saltでプロビジョニングするの方が使いやすいようです。