
Ansible実践ガイド モジュールの使い分けとカスタムモジュールの作成方法
こんにちは、株式会社クレスコ・デジタルテクノロジーズのK.Nです。
今回は、Ansibleの学習を通じて実際に動作させた内容と、カスタムモジュールの作成・実装方法についてご紹介します。
■あわせて読まれている資料:
対応事例やネットワークサービス一覧を掲載!
→ネットワークテクノロジーサービス
目次[非表示]
- 1.Ansibleとは?
- 2.実践例① -commandモジュール
- 3.実践例② -yum service モジュール
- 4.実践例①と実践例②の違い
- 5.カスタムモジュール
- 6.Ansibleの業務活用例
- 7.付録:モジュールの探し方
- 8.まとめ
- 9.引用元
Ansibleとは?
Ansibleとは、ITインフラの自動化を実現する構成管理ツールです。
サーバー設定、アプリケーションデプロイ、ネットワーク機器管理など、多くの場面で幅広く活用されており、シンプルな記述とエージェントレスな構造が特徴です。
Ansibleの特徴
- エージェントレス
管理対象ノードにエージェントをインストールせず、SSH(Linux)やWinRM(Windows)を通じて直接制御できます。このためクライアント側での設定やインストールなどの準備が不要になります。 - YAMLベースの管理
設定は可読性の高いYAML形式で記述され、Playbookを用いることで一貫した環境構築が可能です。 - 冪等性(べきとうせい)
同じ処理を何度実行しても、システムの状態が意図したものと変わらないことを保証します。例えば、Apache(httpd)のインストール処理を実施する場合、既にインストールされていれば何もしないインストールされていなければインストールするといったような処理が行われます。よって単純に同じ処理を流すわけではなく、想定の状態(httpdがインストールされた状態)が保証されます。 - 拡張性
Ansibleは公式モジュールに加え、Pythonで独自のカスタムモジュールを作成して拡張することができます。
このようにAnsibleはシンプルかつ強力な自動化ツールとして、幅広い環境で活用できます。
今回は、導入方法やPlaybookの説明などは割愛させていただき、より実践に近い内容をご紹介できればと思います。
検証環境
バーチャルボックスにて以下2台の仮想サーバを用意しました。
- Ansibleマネージャー (192.168.1.11)
- ターゲットサーバ (192.168.1.10)
また、/etc/ansible/hostsファイルに以下を記載しました。
■あわせて読まれている資料:
対応事例やネットワークサービス一覧を掲載!
→ネットワークテクノロジーサービス
実践例① -commandモジュール
実際にモジュールを使った例を紹介していきます。
commandモジュールは、リモートホスト上で任意のコマンドを実行するために使用されます。
このモジュールはシンプルでありながらも柔軟性が高く、Ansibleを使い始めたばかりの方にも理解しやすいモジュールです。
以下は、yumコマンドを実行し、サービス起動までを行うPlaybookです。
このPlaybookを実行すると、指定したリモートホスト上でyumが実行され、パッケージのインストール後にサービスの起動が行われます。実行した結果を見ていきます。
見づらいですが、問題なくhttpdサービスを起動できていることがわかります。
上記は、手動で行うインフラ運用と同じであるため、理解しやすいものとなっております。
なお、Commandモジュールには他にも以下のような特徴があります。
commandモジュールの特徴
- シェルの機能を利用しない: commandモジュールは直接バイナリを実行するため、パイプ (|) やリダイレクト (>) などのシェル機能を利用できません。
- 冪等性が保証されない: commandモジュールは毎回指定したコマンドを実行するため、 エラーとなる可能性があります。
※後ほど解説
実践例② -yum service モジュール
やることは実践例①と同じですが、Ansibleの恩恵を受けやすいモジュール2つでの実施方法をご紹介します。
- yumモジュール:RedHat系のLinuxディストリビューション(CentOS、Rocky Linuxなど)でパッケージ管理を行うためのモジュールです。
- serviceモジュール:システム上のサービス(デーモン)の状態を管理するためのモジュールです。
以下は、yumモジュール、serviceモジュールを利用するPlaybookを作成します
このPlaybookを実行すると、先ほどと同じくhttpd(Apache)をインストールし、その後サービス起動が行われます。ここではyumモジュール、serviceモジュールを利用しています。
各モジュールには、それぞれ以下のような特徴があります。
yumモジュールの特徴
- パッケージの状態管理が容易: state: present でパッケージを確実にインストールし、state: absent で削除できます。
- リポジトリの管理も可能: enablerepo や disablerepo オプションを使って特定のリポジトリを有効化または無効化できます。
- 依存関係も自動解決: 必要なパッケージが依存関係を持つ場合、自動的に解決してインストールします。
serviceモジュールの特徴
- サービスの起動・停止・再起動が可能: stateオプションをstarted、stopped、restartedに設定することで、サービスの状態を管理できます。
- サービスの有効化/無効化が可能: enabledオプションを使用すると、システム起動時にサービスを自動的に開始するかどうかを制御できます。
実践例①と実践例②の違い
実践例①と②で紹介した通り、“command” モジュールと”yum” モジュール、”service” モジュールを使用することで、httpdをインストールし、サービスを起動するという同じ結果を得ることができます。
しかし、それぞれに違いがあります。
今回はコマンドも簡単なものですので、可読性という観点では差はないですが、冪等性と依存関係の解決の点でyumモジュールを利用した方がメリットが大きいです。
httpdサービスをインストールするコマンドを二回続けて実行するとします。
“command” モジュールは冪等性を持たないため、1回目と2回目の両方でインストール動作が実行されますが、”yum” モジュールは冪等性を持つため2回目のインストールコマンドは実行されません。
実行結果は下記の通りです。
command(2回目)
TASK[Install]ではyumを再度実行していて、結果として既にインストールされていることが記載されています。これは、実機上でyumを打鍵した時と同じ結果です。
また、結果としては、何もしていない状態ではありますが、PLAY RECAP上ではchanged=3となっています。
yum,serviceモジュール (2回目)
InstallのTASK[Install httpd package]を見ると、changed:falseとなっています。
httpdサービスはすでにインストール済みのため、再度実行することはありません。
PLAY RECAPはchanged=1となっており、1回目実行時とは異なる実行結果となっています。
これは冪等性を持つためです。
■あわせて読まれている資料:
対応事例やネットワークサービス一覧を掲載!
→ネットワークテクノロジーサービス
カスタムモジュール
Ansibleには標準モジュールが豊富に用意されていますが、特定の環境や要件に応じて、カスタムモジュールを作成することでより柔軟な自動化が可能になります。
ここでは、カスタムモジュールの作成例について解説します。
カスタムモジュールは主にPythonで作成し、以下のようなケースにおいて有効です。
- 独自のファイル操作を実行したい
- OSやミドルウェアの特殊な設定を自動化する
- 企業独自のルールに基づいたデータ処理を行う
今回紹介するカスタムモジュールでは、パラメータ(src)としてファイルを指定するとファイル名.YYYYMMDDhhmmssとしてバックアップを作成する操作を実行します。
業務で設定変更作業を行う際、作業前にバックアップを取得することが多いので作成してみました。
出力先(dest_dir)を指定することもできますが、指定がないとコピー元と同じディレクトリにコピーします。
実際に実行していきます。
コピー元として「src=/tmp/work/test」を指定し、コピー先は指定していません。
デフォルトで同一ディレクトリに出力されます。
copy_with_timestamp.py -a "src=/tmp/work/test"を実行
出力結果
同一ディレクトリ上にtest.YYYYMMDDhhmmssとしてコピーされていることが確認できました。
上記は、簡単な例ですがカスタムモジュールを利用することでより複雑により要件にあった処理を実行することができます。
Ansibleの業務活用例
ここまでAnsibleの機能について紹介してきましたが、実際の業務でどのように役立つのか、具体的なユースケースをいくつかご紹介します。
- 大量のサーバーに対する設定変更
活用例
・100台以上のサーバーに対して、NTPサーバーを一括変更。
・SSHのポートを変更し、セキュリティ強化。
・すべてのサーバーで特定のパッケージを最新バージョンに更新。
Ansibleを使用すれば、設定ファイルの変更やサービスの再起動を一括で適用できるため、手動で作業する必要がなくなります。
- アプリケーションのデプロイ
活用例
・Webアプリケーションのコードを全サーバーに展開。
・DBマイグレーションの実行とアプリケーションの再起動。
・環境変数や設定ファイルの更新。
Ansibleを使えば、これらの作業を自動化でき、人的ミスの防止にもつながります。
- 障害対応・セキュリティ対策
活用例
・重大なセキュリティ脆弱性に対するパッチ適用を全サーバーに即座に実施。
・特定のプロセス(マルウェアなど)を検出し、自動停止。
・ファイアウォールのルールを全サーバーに即時反映。
これにより、手作業では間に合わない規模の対応が迅速に行えます。
- ログ管理・モニタリング設定の一括インストール
活用例
・全サーバーで同じログローテーション設定を適用。
・監視エージェント(Prometheus, Zabbixなど)を自動インストール。
・メトリクス収集の設定を一括変更。
付録:モジュールの探し方
最後に、公式ドキュメントを使ってモジュールを調べる方法をご紹介します。公式のモジュールページは英語で書かれているため、慣れるまでは時間がかかるかもしれませんが、何度か調べていくと必要な情報をすぐに見つけられるようになります。
私がモジュールを探す際には、以下の流れで調査を行っています。
①公式の全モジュールページから探す
・Ansible Modules List で目的のモジュールを検索
②サンプルコードを確認
・各モジュールのページに記載されている 例(Examples) を参考に、基本的な使い方を把握
③パラメータと戻り値を確認
・パラメータ(Parameters) セクションで、必要なオプションを確認
・戻り値(Return Values) セクションで、出力結果をチェック
まとめ
AnsibleをはじめとするIaCツールは、今後ますます需要が高まっていくと感じています。
ITインフラの一元的な構成管理を実現するほか、運用作業の自動化により、管理者の負担軽減や品質向上にも大きく貢献するため、機会があれば、ぜひ試してみてください!
新しい技術を取り入れて習得するのは簡単ではないかもしれませんが、実際に手を動かしてみることで見えてくるものがあると思います。
この記事が、皆さんの学びのきっかけになれば嬉しいです!
■サービス資料一覧はこちら↓
引用元
https://docs.ansible.com/ansible/2.9_ja/modules/modules_by_category.html