Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ansible モジュール 作成・配布・貢献

Ansible モジュール 作成・配布・貢献

Avatar for YAEGASHI Takeshi

YAEGASHI Takeshi

September 14, 2015
Tweet

More Decks by YAEGASHI Takeshi

Other Decks in Programming

Transcript

  1. 自己紹介 八重樫 剛史 (YAEGASHI Takeshi) - Twitter @hogegashi - GitHub

    @yaegashi Ansible を個人的に使用しています Python の腕前は素人に毛がはえた程度です
  2. 今日の話題 Ansible モジュールの紹介: blockinfile Ansible モジュールの作成と配布のノウハウ・ベストプラクティス Ansible アップストリーム (本家) への貢献の道

    yaegashi 自身の経験をもとにお話します スライドを作りすぎましたが全部発表します スライドは後ほど公開します
  3. blockinfile モジュールの紹介 テキストファイルに複数行のブロックを挿入・更新・削除するモジュール 名前は標準モジュール lineinfile からの連想 Ansible にはなぜか複数行のテキストを扱うモジュールがないので作った - lineinfile

    は 1 行しか挿入・更新・削除できない - ansible-project などで相談すると、だいたい template や assemble を使うことを 勧められるが、そういうのを使わず既存ファイルを修正したいときもある
  4. blockinfile 利用例 apache2 の設定ファイルに <Location> ブロックを挿入するタスク - name: insert <Location>

    block in apache2 config blockinfile: dest: /etc/apache2/sites-available/default.conf insertbefore: </VirtualHost> block: | <Location /app> ProxyPass http://127.0.0.1:8000 ProxyPassReverse http://127.0.0.1:8000 </Location>
  5. /etc/apache2/sites-available/default.conf (before) blockinfile 利用例 <VirtualHost *:80> <Directory ...> </Directory> </VirtualHost>

    - name: insert <Location> block in apache2 … blockinfile: dest: /etc/apache2/sites-available/… insertbefore: </VirtualHost> block: | <Location /app> ProxyPass http://localhost:8080 ProxyPassReverse http://localhost:8080 </Location>
  6. /etc/apache2/sites-available/default.conf (after) <VirtualHost *:80> <Directory ...> </Directory> # BEGIN ANSIBLE

    MANAGED BLOCK <Location /app> ProxyPass http://localhost:8080 ProxyPassReverse http://localhost:8080 </Location> # END ANSIBLE MANAGED BLOCK </VirtualHost> blockinfile 利用例 blockinfile に 追加されたマーカー (変更可)
  7. モジュールをロールに格納する http://github.com/yaegashi/ansible-role-blockinfile の構造 - ├─/ansible-role-blockinfile ├─/library │ └─blockinfile.py ├─/meta │

    └─default.yml ├─/tasks (なし) ├─/tests └─README.md /library がロール実行時にモジュール検索パスに追加される ひとつのロールに複数のモジュールを収録できる /meta/default.yml の中でロール依存関係の記述も可能 モジュールのユニットテストも入れておくとよい ロールおよびモジュールのドキュメント ロールはタスクを含んでいる必要はない
  8. Ansible Galaxy にロールを登録 ユーザによるレビュー・評価を受けられ る GitHub がバックエンド - Issue Tracker

    でバグ報告をしてもらえる - パッチをプルリクエストしてもらえる yaegashi.blockinfile ロール https://galaxy.ansible.com/list#/roles/1475
  9. Ansible Galaxy 登録ロールからのモジュール利用 blockinfile モジュールを利用するプレイブック一式のディレクトリ構成 ├─/roles │ ├─/yaegashi.blockinfile │ ├─/library

    │ │ └─blockinfile.py │ └─/meta │ └─default.yml ├─/library │ └─othermodule.py ├─playbook1.yml ├─playbook2.yml ansible-galaxy でインストールした yaegashi.blockinfile ロール
  10. Ansible Galaxy 登録ロールからのモジュール利用 blockinfile モジュールを利用するプレイブックの構成 --- - hosts: all roles:

    - yaegashi.blockinfile - role1 - role2 tasks: - shell: ... - blockinfile: ... yaegashi.blockinfile ロールを 最初に呼び出す yaegashi.blockinfile ロールの モジュールは別のロールからも呼び出せ る プレイブックのタスクでも モジュールが使用できる
  11. モジュール追加のプルリクエストを GitHub の ansible-modules-extras に出す Ansible 新規モジュール プルリクエスト ansible-modules-extras とは?

    - Ansible の新規モジュールが追加される登竜門リポジトリ - これに収録されたモジュールは Ansible のリリースと一緒に配布される - 重要度の高いモジュールは ansible-modules-core に昇格することもあ る
  12. Ansible 新規モジュール チェックリスト Module Checklist をよく読んでモジュールを仕上げましょう Module Checklist の主な内容 ライセンス:

    GPL version 3 最初の Python コメントに明記すること ドキュメント: - required: は全パラメータに設定必須 - default: は required: false なら必須、そうでなければ不要 - author: に作者名と GitHub アカウント名を明記すること - U() C() I() M() などのテキスト修飾を適切に使うこと - などなど コード: - いかなる例外も出さないこと 例外出したらそれはバグ - エラーは sys.exit() で終了しない 代わりに fail_json() を使うこと - from ansible.module_utils.basic import * は最後に書くこと - などなど
  13. Ansible 新規モジュール 承認基準 (2015/05) Travis CI による自動ビルドチェックが成功する - Python 2.4

    で動かないモジュールは失敗する (PEP 308 使ってるなど) Module Checklist に適合している 既存モジュール作者 (148名) によるレビューと推薦 - 2 人以上からの +1 があり、 -1 がないこと - 既存モジュール作者が提出するモジュールは自薦の +1 を含めてよい (マージ後) モジュールの作者がメンテナとしてバグ報告などに対処できること
  14. Ansible 新規モジュール プルリクエスト実例と経過 ansible-modules-extras に 2 つのプルリクエストを出しているのだが… - Aug 14:

    #832 New module: blockinfile - Sep 11: #958 New modules: openvz, openvz_exec コメント数 0 誰もレビューしてくれない (T_T)
  15. Ansible 新規モジュール 承認プロセスの現状 Greg DeKoenigsberg 曰く - 率直にいって現在の新規モジュール承認プロセスはあまりうまくいってない - 手続きが煩雑すぎる

    - レビュアーに対する動機付けが弱い - レビュアーを既存モジュール作者に限定したのは間違いだったかもしれない
  16. Ansible 新規モジュール 承認プロセスの改革 Greg DeKoenigsberg 曰く - 新規モジュール承認プロセスの修正を検討している - 既存モジュール作者にレビュアーを限定しない予定である

    新規モジュール承認基準の要点 - 誰かが検査・レビューすること - 誰かが実際に自分の環境でテストすること - モジュール作者がマージ後もメンテナンスすること - ユニットテストがあること (core モジュールのみ)
  17. Ansible 新規モジュール 承認プロセスの感想 yaegashi の感想 - 増え続けるモジュールを core と extras

    に分離し、 extras モジュールのレビューと メンテナンスをコミュニティに任せようとする方針は正しい - しかしながら、現時点ではコミュニティメンバーが他人の作ったモジュールのレ ビューを行う動機付けに乏しい - 既存モジュール作者にコネがなければレビューもしてもらえないのではないか - 自分の専門外の分野のモジュールのレビューはできないのではないか - 他の上手くいっているプロジェクトから学ぶことはないだろうか - Linux カーネルとか… 規模が違いすぎる?