1. システムとオフィスの融合|株式会社QES
  2. media
  3. 仕事効率化
  4. Ansibleで運用・管理の効率化を!③

QESブログ

Ansibleで運用・管理の効率化を!③

  • LINEで送る
  • このエントリーをはてなブックマークに追加
みなさん、こんにちは!
システムソリューション営業本部の杉本です。

前回はAnsible環境の構築、簡単なコマンドの実行について記載をしました。
今回はAnsibleを使った環境の作成、自動化、冪等性について実際に使いながら解説していきたいと思います。

0.環境説明

 前回の環境から対象サーバーを2台増やした環境にします。 

【環境】


基本情報 Ansible Controller Ansible Target#1 Ansible Target#2 Ansible Target#3
ホスト名 master target01 target02 target03
IPアドレス 10.19.19.102 10.19.19.110 10.19.19.111 10.19.19.112
OS lubuntu 20.04 LTS lubuntu 20.04 LTS lubuntu 20.04 LTS lubuntu 20.04 LTS
ansible ver. ansible 2.9.6 ansible 2.9.6 ansible 2.9.6 ansible 2.9.6
python ver. python 3.8.2 python 3.8.2 python 3.8.2 python 3.8.2
ユーザーアカウント master/ansible test01 test01 test01

 IPアドレスとホスト名以外は全く同じです。
 ユーザーアカウント、パスワードをすべて統一してあります。

 Controllerのディレクトリ構成を以下のようにします。

ansible-directory.jpg
 それぞれのディレクトリの中に必要なファイルを作っていきます。
 では早速、事前準備へ…

1.事前準備

 今回は事前準備が長くなります。

 試すだけであればここまで準備する必要はありません。
 実際に動作させるためのコマンドが長くなるのが嫌なので最初に手間をかけます。
 長いコマンドを入力すると間違えません?私だけですか…そうですか…

 サーバーが増えたので名前解決をできるようにしておきます。今回は手を抜いてhostsに書いてしまいます。

/etc/hosts
 10.19.19.110 target01
 10.19.19.111 target02
 10.19.19.112 target03

 次に前述したnginx用のディレクトリを作成します。

 $ cd ~
 $ mkdir -p nginx/{inventory,group_var,playbooks}

 続いて~/nginx/inventoryディレクトリにインベントリファイルを作成します。
 インベントリファイルのフォーマットはyamlやiniです。今回はini形式で記述しました。

~/nginx/inventory/inventory.ini
 [nginx_servers]
 target01 ansible_host=10.19.19.110
 target02 ansible_host=10.19.19.111
 target03 ansible_host=10.19.19.112

 新規に作成したサーバー2台はSSHではじめての接続になります。その場合はfingerprintを要求されます。
 Ansibleでは少し慣れてくると準備を整えていざ実行!
 の段階でいきなりエラーで失敗ということを私は良くやってしまいます。
 fingerprintの設定を忘れてSSH接続に失敗する…私的Ansibleあるあるです。
 そのよう事がないようにfingerprintを無視する設定をansible.cfgに書いてしまいます。

 ところで、ansible.cfgはデフォルトでは/etc/ansible/ansible.cfgにあります。
 ただ、このファイルを編集してしまうとcontroller全体に影響が出ます。
 私は実行ユーザーのホームディレクトリ直下にansible.cfgをコピーして影響範囲をその実行ユーザーのみに限定しています。

 今回もその方式で進めていきます。
 コピーして

 $ cp /etc/ansible/ansible.cfg ~/.ansible.cfg
 $ vi ~/.ansible.cfg

 編集します。

~/.ansible.cfg
 [defaults]
 host_ket_cheking = False

 次が事前準備の最後になります。
 SSH認証と対象サーバーでのコマンド実行ユーザー認証についての設定を行います。
 認証は

  •  コマンドラインで打ち込む
  •  キー認証を使う
  •  ansible-vaultを使って認証する

 の3パターン(前回のブログを参照)がありました。

 3台の対象サーバーがあるため、都度の入力は面倒タイプミスが危険、キー認証ではキーを3つも用意するのがめんど必要があります。
 今回は「ansible vault」を使って認証します。
 そう、面倒なことを回避するために対象サーバーのアカウントとパスワードを全部一緒にしておきました。

 最初にsshで接続するアカウントとそのパスワード、およびsudoで使用するパスワードをファイルに記載します。
 group_varsにsecret.ymlを以下の内容で作成します。([]内は適切なパスワードを設定してください。)

~/nginx/group_vars/secret.yml
 ---
 ansible_user: test01
 ansible_password: [password]
 ansible_become_password: [password]

 secret.ymlをansible vaultを使って暗号化していきます。
 コマンド実行後に要求されるパスワードはansible vaultで暗号化されたファイルを複合化するためのパスワードです。
 このパスワードを忘れると2度と複合化できないので注意してください。 

 $ ansible-vault encrypt ~./nginx/group_vars/secret.yml
Vault password:
Confirm password:

 catなどでsecret.ymlを確認すると暗号化されていることがわかります。
 先ほど設定したansible vaultの複合化パスワードですが、コマンド実行時に毎回パスワードを入力するのも手間です。
 複合化用のパスワードを記述したパスワードファイルを作ってしまいましょう。

~/nginx/group_vars/vault_pass
 [password]

 【注意】

 この手順は検証環境だけで実施してください。
 vault_passファイルは暗号化していないので流出すると複合化し放題になってしまいます。

 同時に暗号化したからと言ってクラウドサービスでパスワードファイルなどを管理するのはお勧めしません。

 今までの準備で正常にコマンドが実行できるかどうかを簡単なplaybookを作って確認してみましょう。
 対象の設定情報を取得するためだけのplaybookです。 

~/nginx/playbooks/fact.yml
 ---
 - hosts: nginx_servers
   remote_user: test01
   become: yes
   vars_files: 
     - ~/nginx/group_vars/secret.yml
   tasks:
     - name: gathering fact
       setup:
         gather_subset:
           - '!all'
           - '!any'
           - facter

 こちらを実行していきます。

 $ ansible-playbook -i ~/nginx/inventory/inventory.ini ~/nginx/playbooks/fact.yml --vault-password-file ~/nginx/group_vars/vault_pass
 ~省略~
 PLAY RECAP ****************************************************************************************************
 target01 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
 target02 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
 target03 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

 問題なく実行できました。
 ここまでで事前準備は完了です。

2.nginxのインストール

 それではnginx用のplaybookを書いてインストールしていきましょう。

2.1 playbookの作成

 インストール用のplaybookは以下のようになります。

~/nginx/playbooks/nginx.yml
 ---
 
 - hosts: nginx_servers
   remote_user: test01
   become: yes
   vars_files:
     - ~/nginx/group_vars/secret.yml
   tasks:
   - name: Installs nginx web server
     apt:
       name: nginx
       state: latest
       update_cache: true
     notify:
     - start nginx
   handlers:
   - name: start nginx
     service:
       name: nginx

 対象サーバーに接続して、aptコマンドでnginxの最新版をインストール、サービスを起動するだけのplyabookです。シンプルですねぇ。

 2.2 playbookの実行①

 さて、先ほど作成したplaybookを実行していきたいと思います。
 ただ、私は小心者なので一気に3台を対象にするのは少し怖いです。自分を信用していません。世の中で一番信用できないのは自分です!
 インベントリファイルを修正してまずは”target01”のみを対象として実行します。インベントリファイルの修正は”target02”と”target03”をコメントアウトするだけですので省略します。

 まずは、curlを使ってサーバーが動作していないことを確認します。

 $ curl://target01
 curl: (7) Failed to connect to target01 port 80: 接続を拒否されました

 ポートが閉じていますね。webサービスは動作していません。
 では、playbookを実行します。

  $ ansible-playbook -i ~/nginx/inventory/inventory.ini ~/nginx/playbooks/nginx.yml --vault-password-file ~/nginx/group_vars/vault_pass
 
 PLAY [nginx_servers] ***********************************************************************************************************************************
 
 TASK [Gathering Facts] *********************************************************************************************************************************
 ok: [target01]
 
 TASK [Installs nginx web server] ***********************************************************************************************************************
 changed: [target01]
 
 RUNNING HANDLER [start nginx] **************************************************************************************************************************
 ok: [target01]
 
 PLAY RECAP *********************************************************************************************************************************************
 target01                   : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

 エラーなく無事に完了したようです。
 それでは、再びcurlでアクセスしてみましょう。

$ curl http://target01

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.


 しっかりと応答が返ってきました。動作も問題ないようです。

 2.3 playbookの実行②

 実行しても問題なかったので私も一安心です。
 ではインベントリのコメント外して3台を対象に実行していきます。
 playbookと実行コマンドは先ほどと同じになります。

 $ ansible-playbook -i ~/nginx/inventory/inventory.ini ~/nginx/playbooks/nginx.yml --vault-password-file ~/nginx/group_vars/vault_pass
 
 PLAY [nginx_servers] ***********************************************************************************************************************************
 
 TASK [Gathering Facts] *********************************************************************************************************************************
 ok: [target03]
 ok: [target02]
 ok: [target01]
 
 TASK [Installs nginx web server] ***********************************************************************************************************************
 ok: [target01]
 changed: [target03]
 changed: [target02]
 
 RUNNING HANDLER [start nginx] **************************************************************************************************************************
 ok: [target03]
 ok: [target02]
 
 PLAY RECAP *********************************************************************************************************************************************
 target01                   : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
 target02                   : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
 target03                   : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

 3台ともエラーもなく無事に完了しました。
 ここで注目していただきたいのは"target01"と"target02"、"target03"でタスクの実行結果が異なっていることです。
 "target01"はokが2だけ、"target02"、"target03"はokが3、changeが1つあります。

 この実行結果こそがAnsibleの特徴である冪等性です。

 Ansibleは構成管理自動化ツールですので「指定された構成になるようにタスクを実行する」ことが重要です。
 一方でAnsibleの冪等性は「何度同じPlaybookを実行しても同じ結果」になることを保証しています。
 ここで重要なのが「既に指定した構成になっている場合は、何もしない」ということです。

 細かくタスクの実行結果を見ていきましょう。

 TASK [Gathering Facts] *****************************
   ok: [target03]
   ok: [target02]
   ok: [target01]

 このタスクは特にPlaybookに記載はしていませんが、対象サーバーの環境情報を取得するデフォルトの動作です。
 これはすべてのサーバーで問題なく完了しています。

 TASK [Installs nginx web server] ************************************
   ok: [target01]
   changed: [target03]
   changed: [target02]

 こちらはnginxをインストールするタスクです。
 結果は"target01"はokで"target02"、"target03"はchangedになっています。
 ここでのokは既にインストールされていますよっという意味のokです。
 なので何の変化もなく完了します。(実行状況を見ているとわかるのですが、target01の完了がものすごく速いです。)
 一方で"target02"、"target03"のステータスはchangedです。
 nginxがインストールされていない状態からインストールされた状態に変化したという意味になります。

 RUNNING HANDLER [start nginx] *******************************
   ok: [target03]
   ok: [target02]

 こちらにいたっては”target01”が実行対象にすらなっていません。
 gathering factで取得した情報で既に”target01”の対象サービスが起動していることを把握しているのでタスクを実行しません。
 "target02"、"target03"はインストールしたばかりですのでサービスの開始に成功しています。

 このplaybookを実行することで、先にnginxをインストールした"target01"と後からインストールした"target02"、"target03"のnginxが完全に同じ状態になったことを保証します。
 
 私がじゃないですよ?Ansibleがです。

 そう、playbookに記述したとおりにAnsibleが”自動的”に”構成”を”管理”してくれたのです。

3.まとめ

 いかがでしたでしょうか?
 Ansibleを使って実際にアプリケーションをデプロイする手順になります。
 playbookをnginxの設定を行い、必要なファイルをコピーするように拡張すれば外部公開可能な状態にすることもできます。

 本ブログでは3台という小さい環境で実践しましたが、これが10台超を対象とするようなシステムでは非常に有効に働くのではないでしょうか。
 さらに、重要な要素である冪等性についてもある程度の感化右派つかんでいただけたかと思います。
 何度、同じPlaybookを実行しても設定どおりであれば既存環境を変えることがないというのは運用上も安心できるのではないでしょうか。

 さて、3回に分けてAnsibleの簡単な使い方を紹介してきました。
 インフラ構築や運用管理を自動化したいといった目的をお持ちの方へ、多少なりとも意思決定の手助けになればと思っております。
 もし、もう少し詳しく話を聞きたい、こういうことはできるのか等、ご興味があれば下記のお問い合わせからご連絡いただければ幸いです。

 私の次のブログはコンテナーとオーケストレーションツールについて書いていこうと思っています。Dockerとkubernetesですね。
 そちらもご期待ください。

※Ansibleは、米国Red Hat, Inc. の米国およびその他の国における登録商標もしくは商標です。
  • LINEで送る
  • このエントリーをはてなブックマークに追加

お気軽にお問い合わせください。

ページのトップへ