$30 off During Our Annual Pro Sale. View Details »

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

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

YAEGASHI Takeshi

September 14, 2015
Tweet

More Decks by YAEGASHI Takeshi

Other Decks in Programming

Transcript

  1. Ansible モジュール
    作成・配布・貢献
    八重樫 剛史
    GitHub: @yaegashi
    Twitter: @hogegashi

    View Slide

  2. 自己紹介
    八重樫 剛史 (YAEGASHI Takeshi)
    - Twitter @hogegashi
    - GitHub @yaegashi
    Ansible を個人的に使用しています
    Python の腕前は素人に毛がはえた程度です

    View Slide

  3. 今日の話題
    Ansible モジュールの紹介: blockinfile
    Ansible モジュールの作成と配布のノウハウ・ベストプラクティス
    Ansible アップストリーム (本家) への貢献の道
    yaegashi 自身の経験をもとにお話します
    スライドを作りすぎましたが全部発表します スライドは後ほど公開します

    View Slide

  4. blockinfile モジュールの紹介

    View Slide

  5. blockinfile モジュールの紹介
    テキストファイルに複数行のブロックを挿入・更新・削除するモジュール
    名前は標準モジュール lineinfile からの連想
    Ansible にはなぜか複数行のテキストを扱うモジュールがないので作った
    - lineinfile は 1 行しか挿入・更新・削除できない
    - ansible-project などで相談すると、だいたい template や assemble を使うことを
    勧められるが、そういうのを使わず既存ファイルを修正したいときもある

    View Slide

  6. blockinfile 利用例
    apache2 の設定ファイルに ブロックを挿入するタスク
    - name: insert block in apache2 config
    blockinfile:
    dest: /etc/apache2/sites-available/default.conf
    insertbefore:
    block: |

    ProxyPass http://127.0.0.1:8000
    ProxyPassReverse http://127.0.0.1:8000

    View Slide

  7. /etc/apache2/sites-available/default.conf (before)
    blockinfile 利用例




    - name: insert block in apache2 …
    blockinfile:
    dest: /etc/apache2/sites-available/…
    insertbefore:
    block: |

    ProxyPass http://localhost:8080
    ProxyPassReverse http://localhost:8080

    View Slide

  8. /etc/apache2/sites-available/default.conf (after)



    # BEGIN ANSIBLE MANAGED BLOCK

    ProxyPass http://localhost:8080
    ProxyPassReverse http://localhost:8080

    # END ANSIBLE MANAGED BLOCK

    blockinfile 利用例
    blockinfile に
    追加されたマーカー
    (変更可)

    View Slide

  9. blockinfile モジュールまとめ
    簡単にセットアップできて便利なのでみなさんぜひ使ってください
    GitHub: ansible-role-blockinfile
    Ansible Galaxy: blockinfile
    関連ブログポスト:
    - http://blog.keshi.org/hogememo/2014/08/24/ansible-blockinfile-module
    - http://blog.keshi.org/hogememo/2015/04/26/ansible-blockinfile-v0-3

    View Slide

  10. Ansible モジュール開発のノウハウ

    View Slide

  11. Ansible モジュール開発のノウハウ
    時間が足りないので省略
    ユニットテストやドキュメントの自動生成などネタはあるが、またの機会に…
    最初は似た機能の標準モジュールを真似するところから始めるのが良いと思う
    blockinfile モジュールも lineinfile や replace からのコピペで作りました

    View Slide

  12. Ansible モジュール配布のノウハウ
    (今日の本題 1)

    View Slide

  13. Ansible モジュール配布のノウハウ
    モジュールはロールの形にして GitHub で公開しましょう

    View Slide

  14. モジュールをロールに格納する
    http://github.com/yaegashi/ansible-role-blockinfile の構造
    -
    ├─/ansible-role-blockinfile
    ├─/library
    │ └─blockinfile.py
    ├─/meta
    │ └─default.yml
    ├─/tasks (なし)
    ├─/tests
    └─README.md
    /library
    がロール実行時にモジュール検索パスに追加される
    ひとつのロールに複数のモジュールを収録できる
    /meta/default.yml
    の中でロール依存関係の記述も可能
    モジュールのユニットテストも入れておくとよい
    ロールおよびモジュールのドキュメント
    ロールはタスクを含んでいる必要はない

    View Slide

  15. Ansible Galaxy にロールを登録
    ユーザによるレビュー・評価を受けられ

    GitHub がバックエンド
    - Issue Tracker でバグ報告をしてもらえる
    - パッチをプルリクエストしてもらえる
    yaegashi.blockinfile ロール
    https://galaxy.ansible.com/list#/roles/1475

    View Slide

  16. Ansible Galaxy にロールを登録
    Ansible Galaxy で公開したロールは
    インストールやアップデートが簡単!!
    $ ansible-galaxy install yaegashi.blockinfile

    View Slide

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

    View Slide

  18. Ansible Galaxy 登録ロールからのモジュール利用
    blockinfile モジュールを利用するプレイブックの構成
    ---
    - hosts: all
    roles:
    - yaegashi.blockinfile
    - role1
    - role2
    tasks:
    - shell: ...
    - blockinfile: ...
    yaegashi.blockinfile ロールを
    最初に呼び出す
    yaegashi.blockinfile ロールの
    モジュールは別のロールからも呼び出せ

    プレイブックのタスクでも
    モジュールが使用できる

    View Slide

  19. Ansible モジュール貢献のノウハウ
    (今日の本題 2)

    View Slide

  20. Ansible モジュール 貢献のノウハウ
    自作の Ansible モジュールが好評!
    Ansible アップストリーム (本家) にモジュールをコントリビュート (寄贈) しよう!

    View Slide

  21. モジュール追加のプルリクエストを GitHub の ansible-modules-extras に出す
    Ansible 新規モジュール プルリクエスト
    ansible-modules-extras とは?
    - Ansible の新規モジュールが追加される登竜門リポジトリ
    - これに収録されたモジュールは Ansible のリリースと一緒に配布される
    - 重要度の高いモジュールは ansible-modules-core に昇格することもあ

    View Slide

  22. 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 * は最後に書くこと
    - などなど

    View Slide

  23. Ansible 新規モジュール 承認基準 (2015/05)
    Travis CI による自動ビルドチェックが成功する
    - Python 2.4 で動かないモジュールは失敗する (PEP 308 使ってるなど)
    Module Checklist に適合している
    既存モジュール作者 (148名) によるレビューと推薦
    - 2 人以上からの +1 があり、 -1 がないこと
    - 既存モジュール作者が提出するモジュールは自薦の +1 を含めてよい
    (マージ後) モジュールの作者がメンテナとしてバグ報告などに対処できること

    View Slide

  24. Ansible 新規モジュール
    プルリクエスト実例と経過
    (今日の本題 3)

    View Slide

  25. Ansible 新規モジュール プルリクエスト実例と経過
    ansible-modules-extras に 2 つのプルリクエストを出しているのだが…
    - Aug 14: #832 New module: blockinfile
    - Sep 11: #958 New modules: openvz, openvz_exec
    コメント数 0
    誰もレビューしてくれない (T_T)

    View Slide

  26. Ansible 新規モジュール プルリクエスト実例と経過
    Google Groups の ansible-devel で愚痴ったのだが…
    スレッドに自分以外の投稿なし
    誰も反応してくれない (T_T)

    View Slide

  27. Ansible 新規モジュール プルリクエスト実例と経過
    そこに Ansible Community Guy を名乗る男からメールが!

    View Slide

  28. Ansible 新規モジュール 承認プロセスの現状
    Greg DeKoenigsberg 曰く
    - 率直にいって現在の新規モジュール承認プロセスはあまりうまくいってない
    - 手続きが煩雑すぎる
    - レビュアーに対する動機付けが弱い
    - レビュアーを既存モジュール作者に限定したのは間違いだったかもしれない

    View Slide

  29. Ansible 新規モジュール 承認プロセスの改革
    Greg DeKoenigsberg 曰く
    - 新規モジュール承認プロセスの修正を検討している
    - 既存モジュール作者にレビュアーを限定しない予定である
    新規モジュール承認基準の要点
    - 誰かが検査・レビューすること
    - 誰かが実際に自分の環境でテストすること
    - モジュール作者がマージ後もメンテナンスすること
    - ユニットテストがあること (core モジュールのみ)

    View Slide

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

    View Slide

  31. 新規モジュール コントリビュート完遂の道のりは険しい
    - 現時点ではコネがない限り、新規モジュールのマージは難しそう
    - Ansible, Inc. でも現状を問題に感じており、改革をしようとしている
    - しばらくプルリクエストの放置プレイが続きそうだが、気長に待ちましょう
    - 新規ユーザ獲得の努力、コネを作る努力は地道にしておきましょう
    Ansible 新規モジュール 承認プロセス まとめ

    View Slide

  32. まとめ

    View Slide

  33. blockinfile モジュールの紹介
    Ansible モジュール配布のノウハウ・ベストプラクティス
    Ansible モジュール寄贈の概要・実例
    Ansible 新規モジュール承認プロセスの今後
    まとめ

    View Slide