Ansibleについて
はじめに
1年前に、Ansibleを触って以来あまり触る機会がなかったので、自分の思い出しも兼ねて記事にしようと思いました!
Kubernetes-hardwayというkubernetesを一から組み立ててみようという記事があるのですが、これがすごく長いものになるので、自動化できたらと思ったのが触ったきっかけでした。 本編はGCPでやっていますが、ここではAzureを使用しています。
かなり、記憶が飛んでるので間違ってることがあれば指摘してくださると嬉しいです!
Ansibleの紹介
Ansibleは、サーバーやネットワーク機器などのインフラ構成を自動化するオープンソースの構成管理ツールです。YAML形式のPlaybookと呼ばれるファイルに、実行したいタスクを記述することで、複数のマシンに対して効率的に設定変更やソフトウェアのインストールなどが行えます。 メリットはいくつか存在しますが、私は2つほどメリットをあげると、冪等性(べきとうせい)とエージェントレスだと思っています。
-
エージェントレス: 管理対象のマシンにエージェントソフトウェアをインストールする必要がなく、導入が容易です。SSH接続で通信するため、既存の環境に手軽に導入できます。
-
冪等性: 同じPlaybookを複数回実行しても、設定が変わらない限り何も変更を加えないため、安全に繰り返し実行できます。
Ansibleの基本的な注意点
-
ファイル形式:
INI形式: シンプルで読みやすいが、複雑な構造には不向き。
YAML形式: 階層構造を表現でき、柔軟性が高い。
動的インベントリ: スクリプトや外部データベースから情報を取得する。(pythonファイル等) -
ホスト変数とグループ変数:
ホスト変数: 特定のホストにのみ適用される変数。
グループ変数: グループ内のすべてのホストに適用される変数。
優先順位: ホスト変数がグループ変数よりも優先される。 -
インベントリプラグイン:
標準のファイル形式以外にも、クラウドプロバイダーや構成管理データベースなど、様々なソースからインベントリ情報を取得できる。
例: yamlファイル
# ホスト定義
mail.example.com:
ansible_host: 192.168.1.10
# グループ定義
webservers:
hosts:
web1.example.com:
ansible_host: 192.168.1.20
web2.example.com:
ansible_host: 192.168.1.21
vars:
ntp_server: ntp.example.com
Ansibleの運用における注意点
- 冪等性の確保
- 冪等でないモジュール: command, shell, lineinfile, blockinfile などは注意が必要。オプションを活用したり、条件分岐を組み合わせることで冪等性を高めましょう!
- 冪等性を高める工夫: state オプション、creates/removes オプション、register/when の組み合わせ、changed_when/failed_when を活用しましょう!
冪等性を考慮したコード例
- name: 特定の行を厳密に更新
lineinfile:
path: /path/to/file
regexp: '^(\s*)option1\s*=\s*(.*)$'
line: '\1option1 = new_value'
backrefs: yes
この例では、backrefs オプションによって、option1 という設定行を厳密に一致させて更新します。意図しない行が変更されることを防ぎ、冪等性を確保します。
- エラーハンドリング
Ansibleのエラーハンドリングは、Playbook実行中に発生するエラーを検知し、処理を行うための仕組みです。主な目的は、エラー発生時にPlaybookの実行を中断したり、特定のタスクを再試行したり、エラー情報を記録することです。
- name: Example task
command: /usr/bin/somecommand
register: command_result
failed_when: command_result.rc != 0
この例では、/usr/bin/somecommand の実行結果が command_result に格納され、戻り値 (rc) が 0 でない場合にタスクが失敗になります。
まとめ
今回は、Ansibleについて基本的な部分をおさらいしました。 セキュリティ設定のような話は、またまとまってから記事にできればと思います。 私は、あとになってから知りましたが、Ansibleトレイルマップのような練習できるものもあるようです。 時間があれば、これをやってみた感想も載せてみたいと思います。
それでは、今回はここまでです。 またお会いしましょう!
Discussion