2019/9/17 に開催された、PyCon JP 2019で発表した内容のPDF版の資料です。 Reveal.js製のスライドのため、オリジナルは以下のURLとなっています。
https://attakei.net/slides/pyconjp-2019/
Ansibleを通じて「べき等性」を理解してみようdate:2019-09-17author:Kazuya Takeilocation:PyCon JP 2019
View Slide
イントロ
Who am I?Name: Kazuya TakeiSocial: @attakeiNIJIBOX Co., Ltd.インフラ領域AnsibleGitLabアーキテクトCIパイプライン啓蒙Firebase啓蒙そこまでガッツリはPython触ってないTwitterGitHubGitLab
Who am I?Name: Kazuya TakeiSocial: @attakeiAs pythonista小さいライブラリ志向Ansibleモジュール/ロールsphinx-revealjsErrbotプラグイン/ErrcronErrbotコアへのコントリビュートとかTwitterGitHubGitLab
話すこと(目標)冪等性の概要あっさりAnsibleについて前置きAnsibleはどうやって「冪等性」を担保しているかメイン予定
冪等性の概要※超概要です
「冪等性」とは冪等 = べきとうある操作を何度実施しても、同じ結果になる性質を持つこと。f(x) = f(f(x)) = f(f(f(x))) ...
「冪等性」の例>>> def add_zero(x):>>> return x + 0>>>>>> x = 2019>>> x = add_zero(x)>>> x2019>>> x = add_zero(x)>>> x2019>>> add_zero(add_zero(add_zero(add_zero(x))))2019
「冪等性」の例>>> def multi_one(x):>>> return x * 1>>>>>> x = 2019>>> x = multi_one(x)>>> x2019>>> x = multi_one(x)>>> x2019>>> multi_one(multi_one(multi_one(multi_one(x))))2019
Ansibleについて
AnsibleとはPython製の「構成管理ツール」「動作」ではなく「状態」を定義して適用する主にサーバーのセットアップなどに使われるetcクライアントPCネットワーク機器クラウドサービス
コミュニティありますサイト:Connpass:Slack:https://ansiblejp.github.io/https://ansible-users.connpass.com/https://bit.ly/ansiblejp-slack
Ansibleの動き(概要)
Ansibleの動き(中身)インベントリファイル処理実行先のサーバー一覧や簡単な情報を定義[local]localhost ansible_connection=local
Ansibleの動き(中身)Playbook# ------------------# RedHat系OSのマシンで、Apacheを使えるようにするPlaybook# ------------------- hosts: local# sudoが必要なケースではbecomeを指定するbecome: yestasks:# 1個ずつ「モジュール」を指定する- yum:# nameでパッケージ名を指定name: httpd
Ansibleの動き(中身)Playbook実際にAnsibleが操作したい状態を定義したもの動作ではなく状態「httpdをインストールする」という動作ではない「httpdをインストールされていること」という状態
処理の流れPlaybookに定義された状態になるように、各モジュールがよしなに処理する処理の結果、「状態に変化があったか」の報告を受ける。変化があれば changed変化がなければ ok同じPlaybookを実行すると、2回め以降は状態に変化がないのでOKとしかでない= ある操作を何度実施しても、同じ結果になる= 冪等性がある
Ansibleが担保する冪等性定義された 「状態に対する冪等性」 を担保するように設計されている※ログ出力があるので、マシン全体の冪等性は無理
Ansibleはどうやって、冪等性を担保するか?(1)
pip モジュールpip コマンド経由で、Pythonパッケージの状態を管理するモジュールvirtualenv の指定や作成もできるextra_args 経由で全部のオプションを指定可能- hosts: localtasks:pip:name: djangoexecutable: pip3extra_args: --user
モジュールの全体像
モジュールの全体像全771行!前半の約半分はドキュメント残りのソースには、処理に必要な全内容がコードで書かれがちそのため、モジュールのソースは長めにになる傾向が強い※GitHubより
モジュールの全体像大まかな流れ実行環境の設定実行コマンドの組み立てコマンドの実行実行結果の検査モジュールとしての結果を返す
モジュールから抜粋
モジュールの単体実行の様子1回目
モジュールの単体実行の様子2回目
ここまでパラメーターに従って、 pip コマンドをただただ実行実行結果(リターンコード、標準出力、標準エラー)をもとに、どうなったかを判定pip コマンド自体が冪等性を持っているため、割とそれに信頼性を委任
Ansibleはどうやって、冪等性を担保するか?(2)
amazon-linux-extras モジュールAmazon Linux 2が持つパッケージリポジトリの状態を管理できるものコマンド自体が割と冪等性を持っているけど、 command モジュールで呼ぶのもあれなので自作してみた※前述のpipモジュールなどを見る前に、ドキュメントだけ読んで作ってみたものです- hosts: localtasks:- amazon2extras: name=php7.3- yum: name=php7.3
モジュールの全体像全771行!前半の約半分はドキュメント残りのソースには、処理に必要な全内容がコードで書かれがちそのため、モジュールのソースは長めにになる傾向が強い
モジュールの全体像やってることトピックの検索状態の確認(有効/無効の判定)状態と設定をもとにしたコマンドの実行コマンド実行の際には結果を確認
モジュールのコード(抜粋)
ここまで必ず状態をチェックして、「コマンドの実行可否」を決めているpresent なのに、「まだ有効になってない」なら有効にするコマンドを実行absent なのに、「すでに有効になっている」なら無効にするコマンドを実行「状態を変える必要がない」なら、なにもしない「余計なことはしない」ことで冪等性を担保している
おわりに
まとめ冪等性とAnsibleの概要をふまえて、モジュルールのコードを追ってみました冪等性の担保には、「現在と目標とのズレ」や「初期状態x処理のパターン把握」が重要冪等性を担保するソフトを利用してても、それは変わらない冪等性はどこにでもいる
おまけ:他にもある「冪等性」git pullリモートが変化しない間の正常なpullは何度やっても結果が同じデータベースマイグレーションスキーマの状態に対して、冪等性を担保するLet's Encrypt「FQDNへの証明書があること」に対して、冪等性を担保する(終)