RundockというYAMLベースな構成管理ツールを作ってみました
経緯
以前からChef(Chef-Solo) や itamae といった構成管理ツールを使っているのですが、複数サーバにおける即時実行管理までサポートしてないので他のツールを選定していたのと、現在選定の結果として使用している Rundeck というsshベースの構成管理ツールの弱点をなんとかしたいと思い、軽い気持ちで車輪の再発明してみました。
前提
AWSやオートスケーリングに対応した環境を前提に考えるとcloud-initやrc.local、最近ではTerraformを使用してプロビジョニングするほうがスマートではあるので、sshでログインして管理したほうが都合が良い混み入った事情があるレガシーな環境やアドホックにちょっとしたサーバの情報を収集、設定をする用途に限定されます。
解決したかった点
複数の環境の異なるサーバに対してアドホックに任意の構成管理の処理を実行することと実行結果をトレースできること。
この点ではRundeckでそれをほぼ満たしていると思っているのですが、唯一実行計画をYAMLやXML等のテキストファイルでバージョン管理し辛いことが不満でした。*1
設計思想と利用させて頂いたOSS
設計思想としてはUNIX哲学である”一つのことをうまくやれ”に従い、"複数以上の環境への実行管理"に特化しており、環境の取り扱い(backend)と実行の内容(operation)は全てプラグインにすることを目指しています。*2
backendについては現在mizzy氏のspecinfraを利用させて頂いております。
また、実装について多くの箇所でitamaeを参考にさせて頂きました。(特にログ周り)
実行例
インストール
$ gem install rundock
プラグインは"rundock-plugin-[プラグインタイプ]-[プラグイン名]"の命名規則のgemパッケージを判別して自動でロードされます
$ gem install rundock-plugin-operation-itamae
実行に必要な設定ファイル
itamae用
- nginx.rb
package 'nginx' do action :install end service 'nginx' do action [:enable, :start] end template "/var/www/html/index.html" do source "/tmp/index.html.erb" end
- index.html.erb
<%= node[:name] %>
Rundock用
Rundockでは"---"で別れたドキュメントのYAMLを使います。(ドキュメント毎に別のファイルを指定することも可能)
- scenario.yml
- target_group: hiracy-dev
command: hostname
itamae:
- /path/to/nginx.rb # recipe files
- sudo: true # itamae --sudo option
- node_json: /path/to/attr.js # itamae --node-json option
# you can use itamae any options here
---
hiracy-dev:
target_type: group
targets:
- hiracy-dev-01
- hiracy-dev-02
hiracy-dev-01:
host: 192.168.10.121 # specify ssh options(Net::SSH options compatible)
ssh_opts:
port: 22222
user: hiracy_01
key: ~/.ssh/id_rsa_hiracy_01
hiracy-dev-02:
host: 172.16.10.122
# use ssh_opts by ./default_ssh.yml
詳細はwikiのほうを見て頂きたいのですが、"itamae ssh"とオプションをYAMLファイルの中で指定しています。
また、"command"という項目を見て分かる通り、単純なコマンド実行をデフォルトでサポートしています。
実行
$ rundock do /path/to/your/scenario.yml
--dry-runオプションを付けることで実際には実行せずにログ出力だけすることが可能です
$ rundock do /path/to/your/scenario.yml --dry-run
フック
ノードやグループ単位の実行後にフックを仕掛けることも可能です。こちらも全てプラグインにしています。
サンプルとしてSlackに実行後のログを送るプラグインを使ってみます。
$ gem install rundock-plugin-hook-slack
- scenario.yml
- target_group: hiracy-dev
command: hostname
itamae:
- /path/to/nginx.rb # recipe files
- sudo: true # itamae --sudo option
- node_json: /path/to/attr.js # itamae --node-json option
# you can use itamae any options here
hook:
- hook_slack
---
hiracy-dev:
target_type: group
targets:
- hiracy-dev-01
- hiracy-dev-02
hiracy-dev-01:
host: 192.168.10.121 # specify ssh options(Net::SSH options compatible)
ssh_opts:
port: 22222
user: hiracy_01
key: ~/.ssh/id_rsa_hiracy_01
hiracy-dev-02:
host: 172.16.10.122
# use ssh_opts by ./default_ssh.yml
---
# task section(no use in this case)
---
hook_slack:
hook_type: slack
token: xxxx-9999999999-999999999-99999 # token argument(required)
channel: my_channel # channel argument(required)
username: rundock-bot # username(optional)
icon_url: http:/hiracy.org/rundock-bot.png # icon_url(optional)
実行
$ rundock do /path/to/your/scenario.yml
課題
Rundeckの場合だと実行履歴の検索・フィルタリングが優れているので保管するプラグインを作ってみてもいいかもしれない。
後はYAMLファイルを再利用してtmuxでコンソールを直接開く機能は良いと思いますね。
最後に
A○sibleやFabricに不満がありましたらこちらにプルリク送ってみたりプラグイン作成してみてはいかがでしょうか!!!