WordやExcelでまとめた構築手順書を「Ansible Playbook」に置き換えてみようスキマ時間にこっそり学ぶ「Ansible」入門(2)

自動化ツールの一つである「Ansible」について、これから学ぼうという方、使っていきたい方を対象に、導入方法から実用例までを簡単に紹介していきます。第2回は、Ansibleを利用してWordやExcelでまとめた構築手順書を置き換える方法を解説します。

» 2023年01月10日 05時00分 公開
[鎌田啓佑サイオステクノロジー]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

 「構築手順書」と聞いて想像するものは、「Microsoft Word」(以下、Word)や「Microsoft Excel」(以下、Excel)を用いて記述されたものではないでしょうか。しかし、WordやExcelで記述された手順書は、書き手によってフォーマットが異なったり、修正が入った際の変更点が分かりづらかったりします。

 実際に、WordやExcelの手順書通りにやったつもりが、作業内容の間違いでミスにつながったこともあるのではないでしょうか。今回は、Ansibleを利用して、構築手順書を「Ansible Playbook」に置き換えてみる方法を紹介します。前述のような問題点を解消する方法となりますので、まだトライしていない方はぜひ試してみてください。

手順書を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で手順書を作成してみる

 それでは、早速Ansible Playbookで手順書を作成してみましょう。今回は、WebサーバとしてNginxを構築する手順を作成します。まずは、Ansibleがどのホストを管理対象とするかを設定するため、インベントリファイルを作成します。任意のディレクトリ上に「hosts」という名前で作成し、以下の内容を入力します。

[webserver]
rocky9
ubuntu2204
「hosts」ファイルに入力する内容

 上記の例では、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
「playbook.yml」ファイルに入力する内容

 最初の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 でちょっとしたツールの開発を趣味にしている。

サイオス OSS よろず相談室

サイオステクノロジーエンジニアブログ

サイオステクノロジーエンジニア YouTube チャンネル


Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。