Ansible実践ガイド [基礎編] 第4版 読書メモ

どうやら2016年にもAnsibleを勉強していたようだが 1 、 すっかり忘れてしまったので改めて Ansible実践ガイド 第4版[基礎編] を読んだ。 気になったところをメモしていく。 Playbookの階層 1つのPlaybookはいくつかのPlayから構成される。 PlayはTargets、Vars、Tasks、Handlersの4つのセクションから構成される。 TargetsとTasksは基礎的なセクションで、 それぞれ対象のホストと実行するタスクの一覧を指定するために使われる。 VarsとHandlersは補助的なセクションで、それぞれ変数と実行制御 (例えばsystemdサービスのリスタート)を指定するために使われる。 Playbook Play: Targets Vars Tasks Handlers Play: Targets Vars Tasks Handlers テスト 単純なテストはansible.builtin.assertモジュールでカバーできる。 複雑なテストのためには Ansible Molecule 2 を使う。 テスト環境構築、文法チェック、冪等性のチェックなどの仕組みを持っている。 あるいは Ansible Spec 3 を使うと、RubyのRSpecを利用した Serverspecによってテストできる。 Ansible Galaxy ansible-galaxy install geerlingguy.mysql のようにしてロールをインストールできる。 ~/.ansible/roles あるいは /usr、/etc 配下に配置される。 --roles-path で指定することもできる。 Collectionは ~/.ansible/collections に配置される。 requirements.txt でその一覧を管理することができる。 チューニング ansible.cfgまたはANSIBLE_CACHE_PLUGINでファクトキャッシュを有効化しておくと良い。 forksを増やしておくと、 ローカルノードのリソースやネットワークの負荷とトレードオフになるが、 並列数を増やせる。 Ansibleは並列実行するとき全てのホストで足並みを揃えてタスクを1つずつ実行している。 これはストラテジプラグインで制御できる。 例えば ansible.builtin.free とするとホストごとに独立してタスクを進められる。 もちろんホスト間の依存には注意する。 SSHの多重接続(ControlMaster、ControlPath、ControlPersist)を有効化しておくと、 タスクごとにSSHを確立することによるオーバーヘッドを削減できる。 ちなみにOpenSSH6....

December 1, 2023

Ansibleのメモ

最近,Ansibleを使うようになった.ちょうどAnsibleの解説本「Ansible完全読本」が,Kindle Unlimitedで公開されていたので読んでみた.インストール方法や使い方は省いて,今後ハマりそうな点だけをメモしておく. 設定ファイルは,YAML形式に準拠して記述する. 配列や連想配列を扱う際は,基本的に一行に一要素を記述する. 配列は- ,連想配列はkey: を接頭辞として,要素をその後ろに続けて書く. 空白文字が入っていないと文法エラーになるので,注意する. 例外として,=を使って,連想配列を定義できるが,文法がバラバラになってしまうので,使わない方が良い. 設定ファイルを編集し,その後デーモンを再起動したい場合は,Handlerを使う. Hanlderによって,デーモンが複数回再起動することを防げる. サーバに依存する値を設定ファイルに埋め込みたい場合は,Jinja2モジュールを利用する. このとき,その設定ファイルの名前に,nginx.conf.j2のように,.j2を付与する. 設定ファイルがAnsibleによって編集されたことを明示するために,設定ファイルの先頭にansible_managedをコメントとして,追加しておくと良い. これは,日付などに置換される. 設定ファイルを編集する際に,backup: trueとしておくと,バックアップファイルを作成できる. また,validate: ...としておくと,設定ファイルの文法エラーによるデーモンの起動失敗を未然に防げる. サーバの一覧は,Inventoryファイルとして管理する. Inventoryファイルには,静的Inventoryファイルと動的Inventoryファイルがあり, ファイルに実行権限が付与されているか否かによって解釈が決定する. 静的Inventoryファイルには,ホスト名をテキストで列挙する. 一方,動的Inventoryファイルはスクリプトとして記述し,実行時にホスト名を決定する. また,タスクによって,柔軟にInventoryを操作することもできる. これは,OpenStackのAPIを叩いて新規VMを作成,その後VMを初期化したい場合などに有用である. ansible-playbookコマンドは,Playbookに明示されたタスクに先立って,暗黙的にsetupタスクを実行する. setupタスクは,OSの種類やホスト名などFactと呼ばれるサーバの情報する. 対象サーバがOpenStackやAWS EC2によって管理されている場合には,Factに付加情報を追加できる. Version2以降では,Taskの一層外側にBlockという概念があり, Blockごとにtry,catchおよびfinaly処理のような例外処理を記述できる. さらに,Blockの外側にRoleという概念がある. 基本的には,サービスごとに独立してRoleを管理するのが良い. また,Roleを集めたAnsible Galaxyと呼ばれるリポジトリがある. 共通する処理を繰り返す場合は,with_itemsなどのwith*命令を利用する. ただ,with*命令は,種類が多いので,その都度検索するのが良いかもしれない. 1つサーバでだけ実行したい処理やローカル実行したい処理には,例外的に,run_onceや local_actionを利用する. SSHの同時接続数は,forksオプションによって設定する(デフォルトは5). Playbookは,step実行や特定tas実行を組み合わせて開発する. もし,既存のモジュールで不十分であれば,Pythonによってモジュールを自作できる. ディレクトリ構造 サービスごとにRoleを作っていき,site.ymlから呼び出すという構成が良い. ディレクトリ構造が複雑になるので,テンプレートをダウンロードすると良いかもしれない. site.yml # Playbookファイル hosts # Inventoryファイル roles/ role_name/ # Role名 tasks/ main.yml # Roleを構成するタスク handlers/ main.yml # ハンドラ vars/ main.yml # 上書きしない変数 defaults/ main.yml # 上書きする変数 meta/ main....

December 12, 2016