>100 Views
July 22, 25
スライド概要
Ansible 超入門(本編)
Ansible超入門(本編) Jinja2 を制するものが Ansible を制す molecule 完全に理解した 前回やりました system-role も少しあるよ @nlog2n2 Sekiguchi Toshihiro
前回までのあらすじ 前回は、ansible と molecule の導入方法を デバッグメッセージを表示する playbook を使ってお話しました。
おしながき • 本題 • まとめ • IaCの闇 • 静的なIaC、動的なIaC • csv, json の読み取りサンプル • 不都合な真実 • 読み取りデータを使った繰り返し • Appendix 処理のデモ • system-role( rewalld) • Jinja2 について • lookup プラグイン • 前回、胃腸炎のため入れれなかっ たTIPS(group̲vers,tlog) fi 3
本題 4
IaCの闇 情報工学やっていれば、データと処理は分けろ的な話があると思います。 • データ構造とアルゴリズム • MVCモデル(死語) しかし、Ansible のサンプルコードは、ハードコーディングの事例が多い印象があります。 個人的にシステムの構成管理や設定に関しては、 • 各機器の設定は構造化したデータ(csv, json など)として扱いたい • 設定で必要な処理はデータを読み取った内容を適用したい となるのが自然だと考えていました。 ※ のちに Ansible はこの思想じゃなさそうということに気づく/おそらくテンプレート展開エンジンとして使うのが正しいはず 5
というわけで、 構成管理で使えそうな csv と json の 読み込み方について話します 6
csv, json の ファイルの読み込み 7
ChatGPTにサンプルの csv と json ファイルを吐き出させる • sample.json • sample.csv 8
csv, json ファイルの読み込み • csv ファイルの読み込みはロールを事前にインストールする ansible-galaxy collection install community.general 9
実行結果 10
実行結果 完(ヨシっ 11
これで with̲items, loop とかでループして、 タスクを繰り返し実行できる 12
読み取りデータを 使った繰り返し処理のデモ
例:繰り返し処理(準備) この辺が Jinja2 の形式 • loop に取得した値のリストを入れ て、タスクの定義に item でリストの 値を代入します。 • 代入時には、Jinja2 の形式で取得す る値を編集します。 14 この辺が Jinja2 の形式
例:繰り返し処理(準備の実行結果) 値を繰り返すときに気をつけたいのは、 csv, json を取り込んだときの変数の型 loop に渡す前に、dict か list か確認した上で、 コーディングすると混乱がすくない 変数の型を確認するには、 type̲debug を使う 15
例:繰り返し処理(環境構築) create.yml の定義に ansible のインストール手順を 配列として定義 ubuntu のバージョンを新しくする timezone の追加 install̲ansible.yml を呼び出して、 全てのコンテナにコマンドを実行させる 作成するコンテナに ansible をインストール podman のコレクションを要求に追加 16
例:繰り返し処理(テスト実行実装) converge.yml の呼び出すロールにuseradd を追加する ssmjpgroup を作成する (有効化という意味合いが強いかもしれない) csv で読み取ったユーザー一覧の情報を元に ユーザーをホームディレクトリありで作成する ユーザー名はスペースはハイフンに置き換えて、 文字列は全て小文字にし、ssmjpgroup に所属させる json で読み取ったユーザー一覧の情報を元に ユーザーをホームディレクトリありで作成する ユーザー名はスペースはハイフンに置き換えて、 文字列は全て小文字にし、ssmjpgroup に所属させる 17
例:繰り返し処理(テスト実行結果) 結果は上々 changed: ssmjpgroup を作成 changed: csv ファイルより読み取ったユーザー名よりユーザーを作成 ok: json ファイルより読み取ったユーザー名のユーザーは重複するため作業なし 18
例:繰り返し処理(テスト実行結果) /home/にディレクトリが作成されている ユーザーも作られている 19
作ったデモはここまで 20
⛩ Jinja2 ⛩ 21
繰り返し作業に関する工夫 • この実装で構造化したデータを ansible で繰り返し処理はできそうだが、大体、ど この会社でも既にエクセルファイルで構成管理していることが多い。 既に利用している構成管理の台帳は社内のルールからは変えたくない。 • 具体的言うなら、csvのヘッダー情報は変えたくない。json なら key は変えたくな い。 • 構成管理の台帳のままでは利用できない値は、加工したり、フィルターしたり、ソー トしたりなどしたい。 • 他人が作った collection や role は、そもそもハードコーディング前提で作られてい るようなものあり、一工夫してやらないと現状の構成管理の台帳が利用できない。 22
そこでJinja2 23
Jinjaとは? Jinja は、高速で表現力があり、拡張可能なテンプレートエンジンです。 テンプレート内の特別なプレースホルダーを使うことで、Python に似た構文でコードを書くことができます。 そのテンプレートにデータを渡すことで、最終的なドキュメントが生成されます。(ChatGPT翻訳) 24
Jinja2 とは? Ansible は Jinja2 テンプレートを使用し、動的な式や変数・ファクトへのアクセスを可能にします。 template モジュールを使えば、設定ファイルのテンプレートを作成し、各環境に適したデータ(IP アドレス、ホスト名、バージョンなど)を適用してデプロイできます。 また、タスク名の動的設定など Playbook 内でもテンプレートを活用できます。Jinja2 の標準フィルタやテストに加え、Ansible 独自のデータ変換フィルタや条件判定テス ト、外部データ(ファイル、API、データベースなど)を取得する Lookup プラグインも利用可能です。 テンプレート処理はすべて Ansible のコントロールノード で行われ、ターゲットマシンに送信・実行される前にデータが適用されます。これにより、ターゲットのパッケー ジ要件を最小限に抑え(Jinja2 はコントロールノードのみ必要)、転送データ量も削減できます。(ChatGPT翻訳) https://docs.ansible.com/ansible/latest/playbook̲guide/playbooks̲templating.html
今回使った Jinja2 の形式 この辺が Jinja2 の形式 この辺が Jinja2 の形式 この辺が Jinja2 の形式 https://docs.ansible.com/ansible/latest/playbook̲guide/playbooks̲ lters.html fi 26
今回使った Jinja2 の形式 • lookup プラグインで le を 読み取る • 読み取ったファイルは json で この辺が Jinja2 の形式 あることを指定 https://docs.ansible.com/ansible/latest/playbook̲guide/playbooks̲ lters.html fi fi 27
今回使った Jinja2 のフィルタ この辺が Jinja2 の形式 • loop 処理で読み取った dict 型のリ ストの key が name の値を取得する • スペースを-に置き換える • 文字列は全て小文字に変換する 28 この辺が Jinja2 の形式
Jinja2 に関する情報 • Ansible 公式 https://docs.ansible.com/ansible/latest/playbook̲guide/ playbooks̲ lters.html 日本語のページは自動翻訳を読むのが辛いため、英語のサイトを推奨します。 https://docs.ansible.com/ansible/2.9̲ja/user̲guide/playbooks̲tests.html Jinja2 形式で処理中で式を評価するためには、どうしたらいいか書かれている 困った時は、selectattr とか map とかを扱っている記事を探すと、だいたいのフィ ルタの使い方に関して解説してくれる人がいる。 • Jijna 公式 https://jinja.palletsprojects.com/en/stable/templates/#list-of-builtin- lters fi fi 29
個人的には Claude と ChatGPT に聞くのが 最近は一番早くトライアンドエラー繰り返せるのでいい気がしています。
まとめ 31
すごく 大変
静的なIaC、動的なIaC(副作用あり? IaCをいくつか触って所感ですが、 • コンフィグを展開するだけの静的なIaC Terraform、Docker、Docker Compose • コンフィグの中身をゴリゴリ処理して作って行く動的なIaC Ansible、シェルスクリプト が、あるように感じています。 Kubernetes は、守備範囲が広く、どちらもやっているような感じがします。 33
不都合な真実(2回目/自戒) • 情報が少ない • 基本的に実装に必要な情報が少ない。実装しようとすると、 pip install (パッケージ名)や ansiblegalaxy collection install (コレクション名)をして、検証機材の上で、実行中に呼び出されるファイルの実装とソースコー ド上のコメントを眺めて、Playbookを実装することになります。Pythonに慣れていてもかなりの苦行です。 ドキュメントのページは用意されていますが、完璧じゃないので、、、 俺は、 AnsibleのPlaybookを書いてたはずなんだ、、、 • シェルスクリプトの方が圧倒的に実装が早く終わるし、読み手にも負担も少ない • 他人の作ったロールに対する理解をするためには、ソースコードを理解することからスタートになるため、インフラエン ジニアというより、アプリケーション開発に近い能力が要求され、なんか違わなくない?となる。構文覚えたり、 Ansible向けの環境構築など、やることが単純に増えすぎる。 • ハードコーディングを前提とした作りがが多すぎる。 故に構造化しにくい。 • 使いどころ • シェルスクリプトでやっていたことを、簡易的にできるようになったことはいいとは思う。 34
不都合な真実(2回目/自戒) • 最後は力技なところが多い • 困った時は最終的にAnsibleでもシェルを呼び出すことになるため、だったら最初からシェルスクリプトで良 くないか?となる。 • コミュニティの情報を見始めると最終的にはPythonのコードが書かれてあるGithubまで行って、例外処理を 確認することになるんだ。 • 【重要】なんならすごく低いレイヤーの d-bus の処理を読まなきゃなんのだ • どこかIaCなのか。サーバーなんて、ファイル作って、サービスを呼び込むだけの処理の方がおおいのに、、、 動的な処理など要らぬ!!(心の叫び • 既存の構成管理で利用されている台帳などの再利用が簡単じゃないなら、割り切って、エクセルでなんかコン フィグを吐き出して、その吐き出したコンフィグを実行するシェル作った方が(おっと誰かがが 35
NTPの設定(RHELよ。それでいいのか。) • chrony インストール • chrony の設定ファイルを配置(作り 置き Jinja2 形式のもの) • chrony の再起動 https://www.redhat.com/en/blog/ansible-chrony-daemon 36
appendix 37
TIPS:system-role • system- role は redhat 謹製の ansible ロール、モジュール、および playbook のコレクションで使うと便利になる らしい。 • 公式:https://access.redhat.com/ja/articles/6984781 • 公式ブログ;https://rheb.hatenablog.com/entry/2022/10/31/135534 38
TIPS:system-role (firewalld) • インストールコマンド ansible-galaxy role install linux-system-roles. rewall • 詳しい説明を知ろうとすると Github に行くことになる https://github.com/linux-system-roles/ rewall fi fi 39
TIPS: lookup プラグイン 公式:https://docs.ansible.com/ansible/2.9̲ja/plugins/lookup.html ansible 2.5 以降では query という関数が Jinja22 で追加されたらしい 40
TIPS: lookup プラグイン ansible-doc -t lookup -l で、 利用できるプラグイン一覧を 確認できるらしい 41
ansible-doc -t lookup leで、 le に関するプラグインの情報 が取得できるらしい 42 fi fi TIPS: lookup プラグイン
TIPS: lookup プラグイン おそらく公式ページに書いている内容と同じ 43
TIPS: lookup プラグイン おそらく、Github のコード上の コメントの内容と同じ コードも読めるので、お得。 https://github.com/ansible/ansible/blob/devel/lib/ansible/plugins/lookup/ le.py fi 44
胃腸炎のため見送ったTIPS • 【変数】group̲vars インベントリファイルで定義したグループごとに適用する設定の YAML ファイル を置く場所。あとから知って、便利な気がしている。 • 【ターミナルログ取得】tlog コンソールのログを取得するコマンドができたらしい。監査の時に、ログを取得 して突合してくれ!みたいな製品は高いけど、RHELの標準でつけられたらしい。 なお、Ansibleの system-roles の一覧表にあったことで、機能を知って、あまり 世の中には浸透していない系のコマンドかもしれません。 次、踏み台サービスつくるなら tlog か teleport(踏み台みたいなサービスを提供 するOSS製品)にしたいなぁ。手組みのシェルスクリプトは避けたい。 45
おわり