RundockというYAMLベースな構成管理ツールを作ってみた

f:id:hiracy:20150925222611p:plain

RundockというYAMLベースな構成管理ツールを作ってみました

github.com

※以降NGワード
Ansible

経緯

以前からChef(Chef-Solo) や itamae といった構成管理ツールを使っているのですが、複数サーバにおける即時実行管理までサポートしてないので他のツールを選定していたのと、現在選定の結果として使用している Rundeck というsshベースの構成管理ツールの弱点をなんとかしたいと思い、軽い気持ちで車輪の再発明してみました。

前提

AWSやオートスケーリングに対応した環境を前提に考えるとcloud-initやrc.local、最近ではTerraformを使用してプロビジョニングするほうがスマートではあるので、sshでログインして管理したほうが都合が良い混み入った事情があるレガシーな環境やアドホックにちょっとしたサーバの情報を収集、設定をする用途に限定されます。

解決したかった点

複数の環境の異なるサーバに対してアドホックに任意の構成管理の処理を実行することと実行結果をトレースできること。
この点ではRundeckでそれをほぼ満たしていると思っているのですが、唯一実行計画をYAMLXML等のテキストファイルでバージョン管理し辛いことが不満でした。*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

f:id:hiracy:20150926231549p:plain

課題

Rundeckの場合だと実行履歴の検索・フィルタリングが優れているので保管するプラグインを作ってみてもいいかもしれない。
後はYAMLファイルを再利用してtmuxでコンソールを直接開く機能は良いと思いますね。

最後に

A○sibleFabricに不満がありましたらこちらにプルリク送ってみたりプラグイン作成してみてはいかがでしょうか!!!

*1:実行計画はXMLに出力可能なので作りこめば実現は可能

*2:backendのプラグインは未対応