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

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

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/

attakei

September 17, 2019
Tweet

More Decks by attakei

Other Decks in Programming

Transcript

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

    View Slide

  2. イントロ

    View Slide

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

    View Slide

  4. Who am I?
    Name: Kazuya Takei
    Social: @attakei
    As pythonista
    小さいライブラリ志向
    Ansibleモジュール/ロー

    sphinx-revealjs
    Errbotプラグイ
    ン/Errcron
    Errbotコアへのコントリビュ
    ートとか
    Twitter
    GitHub
    GitLab

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  10. Ansibleについて

    View Slide

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

    View Slide

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

    View Slide

  13. Ansibleの動き(概要)

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  21. モジュールの全体像

    View Slide

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

    View Slide

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

    View Slide

  24. モジュールから抜粋

    View Slide

  25. モジュールから抜粋

    View Slide

  26. モジュールから抜粋

    View Slide

  27. モジュールから抜粋

    View Slide

  28. モジュールから抜粋

    View Slide

  29. モジュールから抜粋

    View Slide

  30. モジュールから抜粋

    View Slide

  31. モジュールから抜粋

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  37. モジュールの全体像

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  43. おわりに

    View Slide

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

    View Slide

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

    (終)

    View Slide