自動化ツールの一つである「Ansible」について、これから学ぼうという方、使っていきたい方を対象に、導入方法から実用例までを簡単に紹介していきます。第2回は、Ansibleを利用してWordやExcelでまとめた構築手順書を置き換える方法を解説します。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
「構築手順書」と聞いて想像するものは、「Microsoft Word」(以下、Word)や「Microsoft Excel」(以下、Excel)を用いて記述されたものではないでしょうか。しかし、WordやExcelで記述された手順書は、書き手によってフォーマットが異なったり、修正が入った際の変更点が分かりづらかったりします。
実際に、WordやExcelの手順書通りにやったつもりが、作業内容の間違いでミスにつながったこともあるのではないでしょうか。今回は、Ansibleを利用して、構築手順書を「Ansible Playbook」に置き換えてみる方法を紹介します。前述のような問題点を解消する方法となりますので、まだトライしていない方はぜひ試してみてください。
そもそも、なぜWordやExcelよりAnsible Playbookが手順をまとめるのに優れているのでしょうか。その理由は大きく分けて3つあります。
WordやExcelで記述された手順書は、その書き手やプロジェクトごとのルールによって見栄えや書き方がさまざまです。また手順書を作成する際も、表の装飾やフォントを一つ一つ調整するなど、実行すべき構築手順そのものとは関係のない部分で時間や工数がかかってしまうことがあります。
一方、Ansible Playbookはテキスト形式の一つであるYAMLで記述するため、書き手による見栄えや書き方に差が出ることはありません。初めてプロジェクトに携わるような人にとっても、統一されたフォーマットで書かれているため、一度フォーマットを覚えれば、内容が容易に理解できるようになります。
前述した通り、Ansible Playbookはテキスト形式であるため、Gitなどのソースコード管理ツールを利用することでバージョン管理ができるようになります。Ansible Playbook自体を同時に編集する作業もできます。GitHubならPull Requestと呼ばれる仕組みを用いることで変更点の確認、記録も容易にします。
WordやExcelで記述された手順書は、実行するコマンドなどの作業が手順に沿って記述されています。基本的に一つ一つのコマンドを実行するため、作業ボリュームにもよりますが、作業は長時間になることも多いです。また、手作業になるため、コマンド引数や使用するファイルやパス、実行するコマンドそのものを間違える可能性もあります。
手順書の中で復旧手順などを併記していることがほとんどだと思いますが、その手戻りのためにさらに時間を要します。
一方、Ansibleでは、Ansible Playbookを実行するコマンドひとつでPlaybookに記述された全ての作業を自動的に実行するため、実行時間は手作業とは比べものにならないくらい早く実行できます。また、記述された内容を自動で実行するため、テスト環境に対して実行して不具合を洗い出し、修正が完了したものをそのまま本番環境で実行できるといった点で、作業ミスが発生しづらくなります。
また本連載では触れませんが「Ansible Tower」というRed Hatの製品(OSS《オープンソースソフトウェア》版の名称は「AWX」)を使用することで、Playbookのスケジューリング実行が可能になったり、複数のシステムに対して実行した結果を視覚的に管理できたりするなど、大規模な環境をAnsibleで管理する際の選択肢もあります。
それでは、早速Ansible Playbookで手順書を作成してみましょう。今回は、WebサーバとしてNginxを構築する手順を作成します。まずは、Ansibleがどのホストを管理対象とするかを設定するため、インベントリファイルを作成します。任意のディレクトリ上に「hosts」という名前で作成し、以下の内容を入力します。
[webserver] rocky9 ubuntu2204
上記の例では、Rocky Linux 9の環境であるホスト「rocky9」と、Ubuntu 22.04 LTSの環境であるホスト「ubuntu2204」を、「webserver」というグループ名でまとめるよう定義しています。実際にお手元で試す際は、Ansibleを実行する環境からログイン可能なホスト名を指定してください。
それではPlaybookを書き始めましょう。Nginxをインストールして、自動起動を有効にした上で起動するタスクを定義します。「playbook.yml」という名前で先ほどの「hosts」ファイルと同じディレクトリ上に作成し、以下の内容を入力します。
- hosts: webserver become: yes tasks: - name: Nginx をインストールする (Rocky Linux) ansible.builtin.dnf: name: nginx state: present when: ansible_distribution == "Rocky" - name: Nginx をインストールする (Ubuntu) ansible.builtin.apt: name: nginx update_cache: yes state: present when: ansible_distribution == "Ubuntu" - name: Nginx を起動する ansible.builtin.systemd: name: nginx.service enabled: yes state: started
最初のhostsというパラメーターにはタスクを実行する対象のホストグループを定義します。上記のコードでは、先ほどのインベントリファイルで定義したホストグループであるwebserverを指定しています。次に記述しているbecomeというパラメーターは全てのタスクを、ログインするユーザーとは異なるユーザーで実行する、つまりsudoのような権限昇格をした上でタスクを実行することを意味しています。
ここではユーザーを指定していないので、デフォルトで"root"ユーザーによって実行することになります。
次のtasksパラメーターから、リスト形式で実行するタスクを定義していきます。最初はRocky Linux環境向けにansible.builtin.dnfモジュールで、次にUbuntu環境向けにansible.builtin.aptモジュールでnginxパッケージのインストールを実行します。最後にansible.builtin.systemdモジュールで自動起動を有効に設定しつつ、nginxサービスを起動します。
ひとまずPlaybookが完成したので、このPlaybookを実行して正しくNginxをインストールして起動されるか確認します。以下のようにansible-playbookコマンドを実行しましょう。-iパラメーターには、先ほど作成したインベントリファイルを指定します。
$ ansible-playbook -i hosts playbook.yml PLAY [webserver] **************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************** ok: [rocky9] ok: [ubuntu2204] TASK [Nginx をインストールする (Rocky Linux)] *********************************************************************** skipping: [ubuntu2204] changed: [rocky9] TASK [Nginx をインストールする (Ubuntu)] **************************************************************************** skipping: [rocky9] changed: [ubuntu2204] TASK [Nginx を起動する] ********************************************************************************************* ok: [ubuntu2204] changed: [rocky9] PLAY RECAP ********************************************************************************************************** rocky9 : ok=3 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 ubuntu2204 : ok=3 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
Playbook実行後、ブラウザでそれぞれの環境にアクセスすると、デフォルトページが表示されます。上記のansible-playbookコマンド実行結果のうち、最後の「Nginx を起動する」タスクにおいて、Rocky Linux側では環境の操作が加えられたことを示す「changed」が、Ubuntu Linux側では環境の操作を加えなかったことを示す「ok」が表示されています。
これは、Rocky Linuxでnginxパッケージをインストールしても自動でnginxサービスが起動しない一方で、Ubuntuでnginxパッケージをインストールすると自動でnginxサービスが起動するためです。Ubuntu側ではタスクを実行する必要がないということになります。
Ansibleは、このような環境ごとの差異があったとしても、Playbookで定義された「あるべき姿」を満たすよう動作します。従って、WordやExcelで記述された手順書にありがちな「○○する前に○○であることを確認する」といった、作業前の状態確認は必要ありません。
続いて、設定を変更してNginxを再起動し、変更を適用させるPlaybookを書いてみましょう。上記で作成したPlaybookの最後尾に、以下の内容を追記します。
- hosts: webserver become: yes tasks: (中略〈上記で作成したPlaybookの内容に以下を追加してください〉) - name: Nginx の設定を変更する ansible.builtin.copy: content: | server_tokens off; dest: /etc/nginx/conf.d/custom.conf notify: Nginx を再起動する handlers: - name: Nginx を再起動する ansible.builtin.systemd: name: nginx.service state: restarted
追記が完了したら、再度ansible-playbookコマンドを実行しましょう。すると、設定を変更し、Nginxを再起動したことを示すログが出力されます。
PLAY [webserver] **************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************** ok: [rocky9] ok: [ubuntu2204] TASK [Nginx をインストールする (Rocky Linux)] *********************************************************************** skipping: [ubuntu2204] ok: [rocky9] TASK [Nginx をインストールする (Ubuntu)] **************************************************************************** skipping: [rocky9] ok: [ubuntu2204] TASK [Nginx を起動する] ********************************************************************************************* ok: [ubuntu2204] ok: [rocky9] TASK [Nginx の設定を変更する] *************************************************************************************** changed: [ubuntu2204] changed: [rocky9] RUNNING HANDLER [Nginx を再起動する] ******************************************************************************** changed: [ubuntu2204] changed: [rocky9] PLAY RECAP ********************************************************************************************************** rocky9 : ok=5 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 ubuntu2204 : ok=5 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
再度、ansible-playbookコマンドを実行すると、「Nginxを再起動する」というhandlersとして記述した内容は実行されません。これは「Nginxの設定を変更する」タスクにおいて変更が生じた場合のみ「Nginxを再起動する」タスクを実行するよう、notifyキーワードで設定したためです。これにより、何度Playbookを実行しても、Nginxを何度も再起動できない仕組みとなっています。
ここまで実際に試してみて、WordやExcelで書いていたような手順書をPlaybookに置き換えるメリットがお分かりいただけたのではないでしょうか。
次回は、Ansibleを利用して複数のサーバに対するセキュリティチェックを簡単に実行する方法を紹介します。
サイオステクノロジー所属。OSS よろず相談室でサポート対応をしているテクニカルサポートエンジニア。Ansible に出会ってから自動化に取り憑かれ、自身の業務やプライベートであらゆるものの自動化に取り組む。プライベートでは Java でちょっとしたツールの開発を趣味にしている。
Copyright © ITmedia, Inc. All Rights Reserved.