Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

blockinfile モジュールの紹介

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

/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

Slide 8

Slide 8 text

/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 に 追加されたマーカー (変更可)

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

Ansible Galaxy にロールを登録 ユーザによるレビュー・評価を受けられ る GitHub がバックエンド - Issue Tracker でバグ報告をしてもらえる - パッチをプルリクエストしてもらえる yaegashi.blockinfile ロール https://galaxy.ansible.com/list#/roles/1475

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

まとめ

Slide 33

Slide 33 text

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