Ansibleを通じて「べき等性」を 理解してみよう / Try understanding idempotency by Ansible
by
attakei
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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への証明書があること」に対して、冪等性を担保す る (終)