Edited at

これからAnsibleを勉強する際におさえておきたいこと


概要

これからAnsibleを勉強される方で以下のポイントをおさえていれば、効率的に勉強できるかと思います


入り口

入り口はやはり体系的に情報がまとまっている書籍がお勧めです


公式ベストプラクティス

各種リソースのファイル構成や命名規則などが記載されています

それ以外はトライ&エラーで自分たちにあったモノを見つけていくことになります

最低限公式のベストプラクティスを読みましょう

https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html

さくらインターネットさんが公開している

実践!Ansibleベストプラクティス(前編)

実践!Ansibleベストプラクティス(後編)

Think IT

より実践的なPlaybookを作り上げる

Qiita

Ansible オレオレベストプラクティス


それなりのシステム規模になるなら

必ず命名規則を作りましょう

Ansibleに限らず規模が大きくなるとソース管理が課題になります

一定の規約を設けて管理することをお勧めします

規約例)


code_policy.md

- タスクやプレイブック内で宣言した変数は**アンダースコア**から開始する変数名にすること(`_xxx`)

- 変数名、ロール名、playbook名、ファイル名、タスク名の命名規則はスネークケースとする(Ansibleの規約)
- 変数名の開始文字列に`ansible_`を使用してはならない(Ansibleの予約変数名)
- jinja2テンプレートはファイル名に`j2`を含めること(区別するため)
- ステージング環境の場合は、ファイル名に`prd`(本番)、`dev`(開発)
- YAMLファイルの先頭行は`---`を必須
- 変数ファイルはYAMLファイルを用いる(JSONはコメントを記載できないため、不採用)
- 機密情報(パスワード、アクセストークンなど)は情報漏えいを防ぐために**ansible vault**で暗号化する(作成方法は別紙参照)
- タスク名の先頭はそのタスクが属性を表すものとする<br/>
例)<br/>
```
// AWS関連の場合
tasks/aws_xxx.yml
// zabbix関連の場合は
tasks/zabbix_xxx.yml
```
- 同一変数に対するor条件の場合は、以下のようにまとめること
```
# NG
- debug:
msg: "hoge"
when: fuga == "a" or fuga == "b" or fuga == "c"

# OK
- debug:
msg: "hoge"
when: fuga in ["a", "b", "c"]
```
- and条件は以下のようにリスト型とする
```
# NG
- debug:
msg: "hoge"
when:
- fuga == "a"
- hoge == "b"
```
## 自作モジュール
- モジュール名の接頭語に`hoge_`とすること
- 冪等性を担保するような実装にすること
(すでに状態を満たしている場合は、処理をしない)
- 適宜にコメントを残すこと(特にビジネス条件にかかわる部分)



すでにDockerを使っているなら

環境をすぐに破棄することができるDockerコンテナで勉強すると効率的

また、複数台や種類(Centos、Ubuntuなど)の環境も容易に準備できる点も魅力

Qiita「Docker内でAnsibleの勉強をしよう


認証情報を扱うならば

必ずAnsible Vaultで暗号化しよう

これで認証情報もソースコードにコミットしても安心

https://docs.ansible.com/ansible/devel/user_guide/vault.html


対話形式のインストーラを扱うならば

expectモジュールを使いましょう!

忘れずに実行環境でpythonのpexpectをインストール

ハマリポイントに気を付けてください

【小ネタ】Ansible expect モジュールの罠


楽したい。既存コードを参考にしたい

Ansible Galaxyを使用しましょう!

さまざまなコードが公開されていて、ansible-galaxyコマンドですぐに使用できる


実運用でAnsibleを使用するならば

AWXもしくはAnsible Towerを必ず導入しましょう

GUIでAnsibleを操作でき、実行履歴、実行権限の制御、他システム連携が容易なRestAPIなどが利用できる

機能的にAWX=Ansible Towerであるが、サポート有や安定性が優れているのがAnsible Towerです

経済的に余裕がある場合は是非Ansible Towerの導入を検討してください

参考:Docker版AWXの構築方法


API経由で渡される変数は処理中に上書きできない!

API経由で渡される変数はextra vars扱い(最優先の変数)で処理中にその変数を上書きすることができない

ただし、存在しないキーを追加したり、変更することはできる

ローカルで動いたが、AWXやTower上で動かないことがあるので要注意!

変数の優先順位


変数

ある程度慣れてくると動的に変数を作るケースが増えます

そんな時に「これだけ覚えとけばもう怖くないAnsibleの(動的)変数


自作モジュール

たいていのことはAnsibleで提供されているが、自作しなければならない時は怖気ずに「Ansibleのモジュール開発」を順に読んでいきましょう

非常に簡単にできる!

参考:aws向けAnsible自作モジュールを作る


デフォルトでAll or Nothingではない

Ansibleのタスク実行は同一タスクを複数ホストに対して並列処理されます

デフォルトではすべてのホストがエラーにならないと処理が中断しない

なので、デフォルトのままだとどこかのホストでエラーが発生しててもスルーされますので、危険です!

all or nothingにするためには、エラーの許容量をmax_fail_percentageで定めることができる

必ず設定しておくことをお勧めします!

https://docs.ansible.com/ansible/latest/user_guide/playbooks_delegation.html?highlight=max_fail_percentage


開発環境

VSCodeで開発するならば「Ansible開発環境はこれで決まり! for VSCode」でOK(特にWindowsユーザにおすすめです)

Dockerを使用しますが、Dockerのことを意識せずに使える


不安!聞ける人がいない

大丈夫!日本のAnsibleユーザコミュニティ(Slack)がありますので、お気軽に質問してください!

レスポンスもよく、安心の日本語で回答してくれます