GCEにSaltをインストールしましたが、前にAnsibleのCloud 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
でプロビジョニングするの方が使いやすいようです。