Slide 1

Slide 1 text

Ansibleを通じて「べき等性」を 理解してみよう date: 2019-09-17 author: Kazuya Takei location: PyCon JP 2019

Slide 2

Slide 2 text

イントロ

Slide 3

Slide 3 text

Who am I? Name: Kazuya Takei Social: @attakei NIJIBOX Co., Ltd. インフラ領域 Ansible GitLab アーキテクト CIパイプライン啓蒙 Firebase啓蒙 そこまでガッツリはPython触 ってない Twitter GitHub GitLab

Slide 4

Slide 4 text

Who am I? Name: Kazuya Takei Social: @attakei As pythonista 小さいライブラリ志向 Ansibleモジュール/ロー ル sphinx-revealjs Errbotプラグイ ン/Errcron Errbotコアへのコントリビュ ートとか Twitter GitHub GitLab

Slide 5

Slide 5 text

話すこと(目標) 冪等性の概要 あっさり Ansibleについて 前置き Ansibleはどうやって「冪等性」を担保しているか メイン予定

Slide 6

Slide 6 text

冪等性の概要 ※超概要です

Slide 7

Slide 7 text

「冪等性」とは 冪等 = べきとう ある操作を何度実施しても、同じ結果になる性質を持つこと。 f(x) = f(f(x)) = f(f(f(x))) ...

Slide 8

Slide 8 text

「冪等性」の例 >>> def add_zero(x): >>> return x + 0 >>> >>> x = 2019 >>> x = add_zero(x) >>> x 2019 >>> x = add_zero(x) >>> x 2019 >>> add_zero(add_zero(add_zero(add_zero(x)))) 2019

Slide 9

Slide 9 text

「冪等性」の例 >>> def multi_one(x): >>> return x * 1 >>> >>> x = 2019 >>> x = multi_one(x) >>> x 2019 >>> x = multi_one(x) >>> x 2019 >>> multi_one(multi_one(multi_one(multi_one(x)))) 2019

Slide 10

Slide 10 text

Ansibleについて

Slide 11

Slide 11 text

Ansibleとは Python製の「構成管理ツール」 「動作」ではなく「状態」を定義して適用する 主にサーバーのセットアップなどに使われる etc クライアントPC ネットワーク機器 クラウドサービス

Slide 12

Slide 12 text

コミュニティあります サイト: Connpass: Slack: https://ansiblejp.github.io/ https://ansible-users.connpass.com/ https://bit.ly/ansiblejp-slack

Slide 13

Slide 13 text

Ansibleの動き(概要)

Slide 14

Slide 14 text

Ansibleの動き(中身) インベントリファイル 処理実行先のサーバー一覧や簡単な情報を定義 [local] localhost ansible_connection=local

Slide 15

Slide 15 text

Ansibleの動き(中身) Playbook # ------------------ # RedHat系OSのマシンで、Apacheを使えるようにするPlaybook # ------------------ - hosts: local # sudoが必要なケースではbecomeを指定する become: yes tasks: # 1個ずつ「モジュール」を指定する - yum: # nameでパッケージ名を指定 name: httpd

Slide 16

Slide 16 text

Ansibleの動き(中身) Playbook 実際にAnsibleが操作したい状態を定義したもの 動作ではなく状態 「httpdをインストールする」という動作ではない 「httpdをインストールされていること」という状態

Slide 17

Slide 17 text

処理の流れ Playbookに定義された状態になるように、各モジュールがよしな に処理する 処理の結果、「状態に変化があったか」の報告を受ける。 変化があれば changed 変化がなければ ok 同じPlaybookを実行すると、2回め以降は状態に変化がないのでOKと しかでない = ある操作を何度実施しても、同じ結果になる = 冪等性がある

Slide 18

Slide 18 text

Ansibleが担保する冪等性 定義された 「状態に対する冪等性」 を担保するように設計されている ※ログ出力があるので、マシン全体の冪等性は無理

Slide 19

Slide 19 text

Ansibleはどうやって、冪等性を 担保するか?(1)

Slide 20

Slide 20 text

pip モジュール pip コマンド経由で、Pythonパッケージの状態を管理するモジュ ール virtualenv の指定や作成もできる extra_args 経由で全部のオプションを指定可能 - hosts: local tasks: pip: name: django executable: pip3 extra_args: --user

Slide 21

Slide 21 text

モジュールの全体像

Slide 22

Slide 22 text

モジュールの全体像 全771行! 前半の約半分はドキュメント 残りのソースには、処理に必要な全内容がコードで書かれがち そのため、モジュールのソースは長めにになる傾向が強い ※GitHubより

Slide 23

Slide 23 text

モジュールの全体像 大まかな流れ 実行環境の設定 実行コマンドの組み立て コマンドの実行 実行結果の検査 モジュールとしての結果を返す

Slide 24

Slide 24 text

モジュールから抜粋

Slide 25

Slide 25 text

モジュールから抜粋

Slide 26

Slide 26 text

モジュールから抜粋

Slide 27

Slide 27 text

モジュールから抜粋

Slide 28

Slide 28 text

モジュールから抜粋

Slide 29

Slide 29 text

モジュールから抜粋

Slide 30

Slide 30 text

モジュールから抜粋

Slide 31

Slide 31 text

モジュールから抜粋

Slide 32

Slide 32 text

モジュールの単体実行の様子 1回目

Slide 33

Slide 33 text

モジュールの単体実行の様子 2回目

Slide 34

Slide 34 text

ここまで パラメーターに従って、 pip コマンドをただただ実行 実行結果(リターンコード、標準出力、標準エラー)をもとに、 どうなったかを判定 pip コマンド自体が冪等性を持っているため、割とそれに信頼性 を委任

Slide 35

Slide 35 text

Ansibleはどうやって、冪等性を 担保するか?(2)

Slide 36

Slide 36 text

amazon-linux-extras モジュール Amazon Linux 2が持つパッケージリポジトリの状態を管理できる もの コマンド自体が割と冪等性を持っているけど、 command モジュ ールで呼ぶのもあれなので自作してみた ※前述のpipモジュールなどを見る前に、ドキュメントだけ読んで作っ てみたものです - hosts: local tasks: - amazon2extras: name=php7.3 - yum: name=php7.3

Slide 37

Slide 37 text

モジュールの全体像

Slide 38

Slide 38 text

モジュールの全体像 全771行! 前半の約半分はドキュメント 残りのソースには、処理に必要な全内容がコードで書かれがち そのため、モジュールのソースは長めにになる傾向が強い

Slide 39

Slide 39 text

モジュールの全体像 やってること トピックの検索 状態の確認(有効/無効の判定) 状態と設定をもとにしたコマンドの実行 コマンド実行の際には結果を確認

Slide 40

Slide 40 text

モジュールのコード(抜粋)

Slide 41

Slide 41 text

モジュールのコード(抜粋)

Slide 42

Slide 42 text

ここまで 必ず状態をチェックして、「コマンドの実行可否」を決めている present なのに、「まだ有効になってない」なら有効にす るコマンドを実行 absent なのに、「すでに有効になっている」なら無効にす るコマンドを実行 「状態を変える必要がない」なら、なにもしない 「余計なことはしない」ことで冪等性を担保している

Slide 43

Slide 43 text

おわりに

Slide 44

Slide 44 text

まとめ 冪等性とAnsibleの概要をふまえて、 モジュルールのコードを追ってみました 冪等性の担保には、「現在と目標とのズレ」や 「初期状態x処理のパターン把握」が重要 冪等性を担保するソフトを利用してても、それは変わらない 冪等性はどこにでもいる

Slide 45

Slide 45 text

おまけ:他にもある「冪等性」 git pull リモートが変化しない間の正常なpullは何度やっても結果が 同じ データベースマイグレーション スキーマの状態に対して、冪等性を担保する Let's Encrypt 「FQDNへの証明書があること」に対して、冪等性を担保す る (終)