1.はじめに
本記事では、Ansible初心者がプレイブックを使って自動化を体験できるよう、「対象サーバ上にコマンド結果をログファイルとして保存する処理」を例に、プレイブックの作成と実行手順を解説します。
対象読者:Linux環境で基本的な操作ができる方
2.前提条件
コントロールノードからターゲットノードに対してansibleコマンドを実行できる環境が必要です。
環境の構築がまだできていない場合は構築手順も解説しているので、以下記事をご参考ください。
3.ディレクトリ構成と準備
プレイブックを実行するために、インベントリファイルやプレイブックファイルなどを用意する必要があります。この記事では以下のようなディレクトリ構成で進めていきます。
📂/opt/ansible # Ansibleを実行するPython仮想環境
├── 📂workspace # プレイブックを配置するディレクトリ
│ ├──📄ansible.cfg # Ansible設定ファイル
│ ├──📄inventory.ini # 実行対象のリストファイル
│ ├──📄playbook.yml # 実行対象のAnsibleプレイブック ⇦本記事で作成する
│ └──📂logs # 実行ログを保存するディレクトリ
ansible.cfg や inventory.ini ファイルは適宜作成が必要です。
この記事では playbook.yml の作成のみ解説します。
4.プレイブックの概要
プレイブックは、普段サーバに対して実行しているコマンド実行や構成変更を 複数ノード に対して 自動 で実行させることができます。
LinuxOSであれば、Linuxコマンドを実行させるわけですが、そのために プレイブック というファイルに実行させたい処理を記述します。
記述方法としては、プレイブックに対して YAML形式 で処理内容を記述します。
記述した内容はモジュールによって処理コマンドに変換されます。
逆に言えば、モジュールがない場合は処理ができません。
ただし、command や shell モジュールで直接コマンドを記述することも可能です。
プレイブックの基本構造と各セクションの意味は以下の通りです。
---
- name: プレイブックの名前(説明)
hosts: 対象ホストグループ
become: true # root権限で実行する場合
vars: # 任意:変数定義
変数名: 値
tasks:
- name: タスク1の説明
モジュール名:
パラメータ1: 値
パラメータ2: 値
- name: タスク2の説明
モジュール名:
...
各セクションの意味
-
---:YAMLファイルの開始を示す -
- name::プレイブック全体の説明(複数プレイブックを並べる場合は-を使う) -
hosts::対象ノード(インベントリで定義されたグループ名やall) -
become::root権限で実行するかどうか(sudo)、become_user:で特定ユーザー指定も可能 -
vars::変数定義(任意) -
tasks::実行する処理の一覧(順番に実行される) -
- name::各タスクの説明(ログに表示される) -
モジュール名::file,copy,yum,apt,command,shellなど多数
5.プレイブックの作成
以下のような処理をプレイブックで実行させてみます。
- 1.対象サーバにディレクトリを作成する
- 2.ファイルを作成する
- 3.標準出力(例:uptime や df -h などのコマンド結果)をそのファイルに書き込む
実際に、プレイブックを作成していきます。
配置するディレクトリに移動し、playbookファイルを用意します。
cd /opt/ansible/workspace
vi playbook.yml
プレイブックの中身は以下の通り定義します。
hosts: や path: の内容は、環境に応じて変更してください。
- name: 標準出力をファイルに保存するプレイブック
hosts: test_servers
become: true
tasks:
- name: ディレクトリを作成する
file:
path: /var/report
state: directory
mode: '0755'
- name: uptimeコマンドの結果を取得する
command: uptime
register: uptime_result
- name: 結果をファイルに書き込む
copy:
content: "{{ uptime_result.stdout }}"
dest: /var/report/status.txt
mode: '0644'
これで、具体的に次のような処理が行われます。
- 対象ノードに
/var/reportディレクトリを作成する -
fileモジュールを使用して、存在しない場合は新規作成する - パーミッションは
0755(所有者が読み書き実行、他ユーザーが読み実行)に設定する - 対象ノードで
uptimeコマンドを実行する -
commandモジュールにより、対象ノードのシェルでuptimeが実行される - 実行結果(標準出力)は
uptime_resultという変数に格納される-
register:はAnsibleのタスクでコマンドやモジュールを実行した結果を、変数として保存する機能
-
- 取得した
uptimeの結果を/var/report/status.txtに書き込む -
copyモジュールのcontent:パラメータにuptime_result.stdoutを渡すことで、ファイルの中身として書き込まれる-
uptime_result.stdoutは、Ansibleの register 機能で取得したコマンドを標準出力(stdout)する -
{{ }}で括る記法は、Jinja2テンプレート構文で、変数を埋め込むことができる
-
- ファイルの保存先は
/var/report/status.txtで、パーミッションは0644(所有者が読み書き、他ユーザーが読み)に設定される
6.実行方法と確認
プレイブックの実行には、以下の構文でコマンドを入力します。
ansible-playbook -i inventory.ini playbook.yml
このコマンドは、Ansibleの ansible-playbook ツールを使って、指定したインベントリファイルとプレイブックをもとに処理を実行します。
また、Ansibleの構文チェック機能を使えば、プレイブックの内容に構文ミスがないか確認することができます。あくまで「YAML構造としてのAnsible文法」のチェックですが、実行前に確認することで記述ミスによるトラブルを防げます。
ansible-playbook --syntax-check playbook.yml
それでは実際に、記述したプレイブックを実行させます。
※Python仮想環境で運用している場合、仮想環境をアクティベートしてください。
作業ディレクトリに移動して、プレイブックの実行コマンドを入力します。
cd /opt/ansible/workspace
ansible-playbook -i inventory.ini playbook.yml
実行に成功すると、次のような結果が返ってくるはずです。
# ansible-playbook -i inventory.ini playbook.yml
PLAY [標準出力をファイルに保存するプレイブック] *****************************************************************
TASK [Gathering Facts] ******************************************************************************************
ok: [192.168.0.9]
TASK [ディレクトリを作成する] ***********************************************************************************
changed: [192.168.0.9]
TASK [uptimeコマンドの結果を取得する] ***************************************************************************
changed: [192.168.0.9]
TASK [結果をファイルに書き込む] *********************************************************************************
changed: [192.168.0.9]
PLAY RECAP ******************************************************************************************************
192.168.0.9 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ターゲットノード側でも、プレイブックの処理によって作成されたファイルの内容を確認してみます。
# cd /var/report
# ls -l
-rw-r--r--. 1 root root 62 Oct 18 22:09 status.txt
# cat status.txt
22:09:02 up 45 min, 1 user, load average: 0.30, 0.13, 0.03
#
uptime コマンドの出力結果が status.txt に記述されていれば、成功しています。
7.まとめ
簡単に、プレイブックの作成から実行までの手順を解説してみました。
今後は、より応用的な構成やテンプレート化の工夫の内容も投稿していこうと思います。