Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ansibleを通じて「べき等性」を 理解してみよう / Try understanding idempotency by Ansible

252e6c31a6452aa80deb9ad0107975c7?s=47 attakei
September 17, 2019

Ansibleを通じて「べき等性」を 理解してみよう / Try understanding idempotency by Ansible

2019/9/17 に開催された、PyCon JP 2019で発表した内容のPDF版の資料です。
Reveal.js製のスライドのため、オリジナルは以下のURLとなっています。

https://attakei.net/slides/pyconjp-2019/

252e6c31a6452aa80deb9ad0107975c7?s=128

attakei

September 17, 2019
Tweet

Transcript

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

    2019
  2. イントロ

  3. Who am I? Name: Kazuya Takei Social: @attakei NIJIBOX Co.,

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

    小さいライブラリ志向 Ansibleモジュール/ロー ル sphinx-revealjs Errbotプラグイ ン/Errcron Errbotコアへのコントリビュ ートとか Twitter GitHub GitLab
  5. 話すこと(目標) 冪等性の概要 あっさり Ansibleについて 前置き Ansibleはどうやって「冪等性」を担保しているか メイン予定

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

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

    ...
  8. 「冪等性」の例 >>> 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
  9. 「冪等性」の例 >>> 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
  10. Ansibleについて

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

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

  13. Ansibleの動き(概要)

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

  15. Ansibleの動き(中身) Playbook # ------------------ # RedHat系OSのマシンで、Apacheを使えるようにするPlaybook # ------------------ - hosts:

    local # sudoが必要なケースではbecomeを指定する become: yes tasks: # 1個ずつ「モジュール」を指定する - yum: # nameでパッケージ名を指定 name: httpd
  16. Ansibleの動き(中身) Playbook 実際にAnsibleが操作したい状態を定義したもの 動作ではなく状態 「httpdをインストールする」という動作ではない 「httpdをインストールされていること」という状態

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

    = ある操作を何度実施しても、同じ結果になる = 冪等性がある
  18. Ansibleが担保する冪等性 定義された 「状態に対する冪等性」 を担保するように設計されている ※ログ出力があるので、マシン全体の冪等性は無理

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

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

    hosts: local tasks: pip: name: django executable: pip3 extra_args: --user
  21. モジュールの全体像

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

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

  24. モジュールから抜粋

  25. モジュールから抜粋

  26. モジュールから抜粋

  27. モジュールから抜粋

  28. モジュールから抜粋

  29. モジュールから抜粋

  30. モジュールから抜粋

  31. モジュールから抜粋

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

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

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

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

  36. amazon-linux-extras モジュール Amazon Linux 2が持つパッケージリポジトリの状態を管理できる もの コマンド自体が割と冪等性を持っているけど、 command モジュ ールで呼ぶのもあれなので自作してみた

    ※前述のpipモジュールなどを見る前に、ドキュメントだけ読んで作っ てみたものです - hosts: local tasks: - amazon2extras: name=php7.3 - yum: name=php7.3
  37. モジュールの全体像

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

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

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

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

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

  43. おわりに

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

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

    る (終)