0%

Salt on IDCF クラウド - Part3: PillarとIDCFオブジェクトストレージ用のs3cmd

apt-getでインストールできるs3cmdのバージョンは古いためマルチパートアップロード機能が使えません。IDCFオブジェクトストレージで使うs3cmdをGitHubから最新バージョンをcloneしてビルドして使ってみます。

Salt Formula

前回作成したFormulaのディレクトリ構造に、common.slsとs3cmdのFormulaを追加します。

$ tree /srv/salt/
/srv/salt/
├── base.sls
├── common.sls
├── emacs
│ └── init.sls
├── s3cmd
│ └── init.sls
└── top.sls

base.sls

base.slsは前回から変更はありません。

/srv/salt/base.sls
ja_JP.UTF-8:
locale.system

Asia/Tokyo:
timezone.system

top.sls

roles:devをGrainsで指定しているminionに、s3cmdのFormula SLSを適用します。

/srv/salt/top.sls
base:
'*':
- base
'roles:salt-master':
- match: grain
'roles:dev':
- match: grain
- emacs
- s3cmd

common.sls

SLSファイルで共通して使うstatesをcommon.slsに定義します。個別のSLSファイルからincludeして使います。

/srv/salt/common.sls
pkg-core:
pkg.installed:
- pkgs:
- git
- python-pip

Pillar

Pillarはminionに定義するGrainと違い、masterに定義するデータです。masterに保存しますが、該当のminionしか利用できないデータです。最初にディレクトリを作成します。

$ mkdir -p /srv/pillar/

masterのディレクトリ構成は以下のようになります。

$ tree /srv/pillar/
/srv/pillar/
├── s3cmd.sls
└── top.sls

Salt Formulaと同じようにtop.slsファイルを作成します。

/srv/pillar/top.sls
base:
'*':
- s3cmd

s3cmdのPillarには、IDCFオブジェクトストレージの認証に利用するaccess_keysecret_keyを定義します。

/srv/pillar/s3cmd.sls:
s3cmd:
access_key: xxx
secret_key: xxx

pillarモジュールのitemsfunctionを使い、Pillarに定義したデータを確認します。

$ salt '*' pillar.items
...
s3cmd:
----------
access_key:
xxx
secret_key:
xxx

Pillarで定義したデータは、Formulaをminionに適用するときに以下のように参照することができます。.s3cfgのテンプレートは通常の設定ファイルを使いますが、エンドポイントの設定をIDCFオブジェクトストレージ用に変更します。また、access_keyとsecret_keyをPillarから動的に取得します。

/srv/salt/s3cmd/s3cfg
[default]
access_key = {{ pillar['s3cmd']['access_key'] }}
...
host_base = ds.jp-east.idcfcloud.com
host_bucket = %(bucket)s.ds.jp-east.idcfcloud.com
...
secret_key = {{ pillar['s3cmd']['secret_key'] }}

s3cmd Formula

s3cmdのSLSファイルでは、common.slsをincludeして使います。s3cmdはGitHubからcloneします。cmd.waitのstateではgit cloneの状態を監視して、リポジトリが更新されたらpython setup.py installを実行してs3cmdをビルドします。s3cmdのビルドにはpython-dateutilが必要なので、pipからインストールします。それぞれrequireでcommon.slsの実行を前提条件にします。

file stateを使いテンプレートとPillarに定義したキー情報を代入して/root/.s3cfgに配置します。

/srv/salt/s3cmd/init.sls
include:
- common

s3cmd-install:
git.latest:
- name: https://github.com/s3tools/s3cmd.git
- target: /opt/s3cmd
- require:
- sls: common
pip.installed:
- name: python-dateutil
- require:
- sls: common
cmd.wait:
- name: python setup.py install
- cwd: /opt/s3cmd
- watch:
- git: s3cmd-install

/root/.s3cfg:
file.managed:
- source: salt://s3cmd/s3cfg
- template: jinja
- mode: 600
- user: root
- group: root

state.highstateで全てのFormulaを適用する

highstatefunctionを使い、Salt FormulaのすべてのSLSファイルをminionに適用します。'*'のワイルドカードを指定して、すべてのminionを対象にします。s3cmdはroles:devをGrainsで指定しているminion1とminion2にインストールされます。

$ salt '*' state.highstate

確認

s3cmdのバージョンを確認します。

$ salt 'minion2*' cmd.run 's3cmd --version'
minion2.cs74idcfcloud.internal:
s3cmd version 1.5.0-rc1

s3cmd lsを実行してIDCFオブジェクトストレージのバケツを一覧します。

$ salt 'minion1*' cmd.run 's3cmd ls'
minion1.cs74idcfcloud.internal:
2014-10-31 03:20 s3://xxx
2014-10-14 06:28 s3://xxx