Ansible Play と Playbook を作成する方法 - パート 5
Ansible シリーズのこのパート 5では、Ansible モジュールを使用してAnsible プレイとプレイブックを作成する方法について説明します。
Ansible には、 リモート ノードで特殊なタスクを実行するためのプレイブックで使用されるモジュールと呼ばれるスタンドアロン スクリプトが付属しています。
モジュールは、いくつか例を挙げると、パッケージ管理、ファイルのアーカイブ、コピーなどのタスクを自動化するのに役立ちます。これらを使用すると、構成ファイルを調整したり、ルーター、スイッチ、ロード バランサー、ファイアウォール、その他のデバイスのホストなどのデバイスを管理したりできます。
このサブトピックの目的は、Ansible モジュールによって実行できるさまざまなタスクの概要を説明することです。
Linux でのパッケージ管理
パッケージ管理は、システム管理者が行う最も重要かつ頻繁なタスクの 1 つです。 Ansible には、RedHat ベースのシステムとDebian ベースのシステムの両方でパッケージ管理タスクを実行するのに役立つモジュールが付属しています。
それらは比較的簡単に推測できます。 Debian ベースの APT パッケージ管理用の apt モジュール、YUM パッケージ管理用の古いyum モジュール、および新しい RHEL ディストリビューションに関連付けられたdnf モジュールがあります。 。
以下はプレイブックでモジュールを使用する方法の例です。
例 1: RHEL 8 への Apache Web サーバーのインストール
---
- name: install Apache webserver
hosts: webservers
tasks:
- name: install httpd
dnf:
name: httpd
State: latest
例 2: Debian 10 への Apache Web サーバーのインストール
---
- name: install Apache webserver
hosts: databases
tasks:
- name: install Apache webserver
apt:
name: apache2
State: latest
サービスモジュール
サービス モジュールを使用すると、システム管理者はシステム上のサービスを開始、停止、更新、アップグレード、およびリロードできます。
例 1: Apache Web サーバーの起動
---
- name: Start service httpd, if not started
service:
name: httpd
state: started
例 2: Apache Web サーバーの停止
---
- name: Stop service httpd
service:
name: httpd
state: stopped
例 3: ネットワークインターフェイス enp2s0 の再起動
---
- name: Restart network service for interface eth0
service:
name: network
state: restarted
args: enp2s0
コピーモジュール
名前が示すように、コピー モジュールは、リモート マシン上の 1 つの場所から同じマシン上の別の場所にファイルをコピーします。
例 1: ローカル Linux からリモート Linux へのファイルのコピー
---
- name: Copy file with owner and permissions
copy:
src: /etc/files/tecmint.conf
dest: /srv/tecmint.conf
owner: tecmint
group: tecmint
mode: '0644'
プレイブックは、構成ファイル tecmint.conf を /etc/files/ ディレクトリから /srv/ ディレクトリに tecmint としてコピーします。 > 0644 権限を持つユーザー。
最後の行に示すように、シンボリック表現を使用してアクセス許可を表すこともできます。
例 2: ローカル Linux からリモート Linux へのファイルのコピー
---
- name: Copy file with owner and permissions
copy:
src: /etc/files/tecmint.conf
dest: /srv/tecmint.conf
owner: tecmint
group: tecmint
mode: u=rw, g=r, o=r
前の例のアクセス許可は、最後の行に示すように表すことができます。ユーザーには読み取りと書き込みのアクセス許可が割り当てられ、グループには書き込みアクセス許可が割り当てられ、残りはワールドには読み取り権限が割り当てられます。
ファイルモジュール
ファイル モジュールは、ファイルとディレクトリの作成、ファイル権限の割り当て、シンボリックリンクの設定など、多くのファイル操作を実行するために使用されます。
例 1: Linux ファイル権限の実行
---
- name: Change file ownership, group, and permissions
file:
path: /etc/tecmint.conf
owner: tecmint
group: tecmint
mode: '0644'
上記の再生により、/etc ディレクトリに tecmint.conf というファイルが作成され、権限が 0644 に設定されます。
例 2: Linux ファイルの削除
---
- name: Remove file (delete file)
file:
path: /etc/tecmint.conf
state: absent
これにより、ファイル tecmint.conf が削除されます。
例 3: ディレクトリの作成
---
- name: create a directory if it doesn’t exist
file:
path: /etc/mydirectory
State: directory
mode: '0777'
これにより、/etc ディレクトリにディレクトリが作成され、権限が 0777 に設定されます。
例 4: ディレクトリを再帰的に削除する
---
- name: Recursively deleting a directory
file:
path: /etc/tecmint.conf
state: absent
上記の再生では、ディレクトリが再帰的に削除されます。
ラインインファイルモジュール
lineinfile モジュールは、ファイル内の 1 行を変更する場合に役立ちます。既存のラインを置き換えることができます。
例 1: Linux でのファイルの操作
---
- name: Ensure SELinux is set to enforcing mode
lineinfile:
path: /etc/selinux/config
regexp: '^SELINUX='
line: SELINUX=disabled
上記のプレイではSELINUX の値を無効に設定します。
SELINUX=disabled
例 2: Linux でのファイルの変更
---
- name: Add a line to a file if the file does not exist, without passing regexp
lineinfile:
path: /etc/hosts
line: 10.200.50.51 linux-console.net
create: yes
これにより、エントリ 10.200.50.51 linux-console.net が /etc/hosts ファイルに追加されます。
アーカイブモジュール
アーカイブ モジュールは、単一または複数のファイルの圧縮アーカイブを作成するために使用されます。圧縮ソースがターゲットの宛先に存在することを前提としています。アーカイブ後、ソース ファイルはステートメント remove=True
を使用して後で削除または削除できます。
例 1: アーカイブ ファイルの作成
- name: Compress directory /path/to/tecmint_dir/ into /path/to/tecmint.tgz
archive:
path: /path/to/tecmint_dir
dest: /path/to/tecmint.tgz
This compresses the /path/to/tecmint_dir directory to /path/to/tecmint.tgz
例 2: アーカイブ ファイルを作成して削除する
- name: Compress regular file /path/to/tecmint into /path/to/foo.gz and remove it
archive:
path: /path/to/tecmint
dest: /path/to/tecmint.tgz
remove: yes
上記のプレイでは、ソース ファイル /path/to/tecmint はアーカイブの完了後に削除されます。
例 3: アーカイブ ファイルの作成
- name: Create a bz2 archive of /path/to/tecmint
archive:
path: /path/to/tecmint
format: bz2
これにより、/path/to/tecmint ファイルから bz2 形式の圧縮ファイルが作成されます。
Gitモジュール
このモジュールは、ソフトウェア リポジトリの git チェックアウトを管理します。
例 1: Git リポジトリを確認する
- git:
repo: 'https://foosball.example.org/path/to/repo.git'
dest: /srv/checkout
version: release-0.22
コマンドモジュール
最も一般的に使用されるモジュールの 1 つであるコマンド モジュールは、コマンド名を受け取り、その後に引数のリストが続きます。コマンドは、Linux シェルに入力するのと同じ方法で渡されます。
例 1: コマンドの実行
- name: Executing a command using the command module
command: cat helloworld.txt
例 2: リモート Linux の稼働時間を確認する
---
- name: Check the remote host uptime
hosts: servers
tasks:
- name: Execute the Uptime command over Command module
register: uptimeoutput
command: "uptime"
- debug:
var: uptimeoutput.stdout_lines
コマンド モジュールは、リモート サーバーの稼働時間を取得します。
コマンドの実行結果を取得する変数
通常、Ansible プレイブックは、コマンドラインに出力を表示せずに管理対象ホストでタスクを実行するために使用されます。ただし、場合によっては、出力または結果をキャプチャする必要がある場合があります。このセクションでは、プレイブックの出力を変数にキャプチャし、後で表示する方法について説明します。
Ansible レジスタは、タスクの出力をキャプチャして変数に保存するために使用されます。その後、変数にはタスクの標準出力が含まれます。
たとえば、df -Th /
コマンドを使用して、それぞれのルート ディレクトリ内の管理対象ノードのディスク使用量を確認するとします。 ‘command’
モジュールを使用してコマンドを定義し、‘register’
モジュールを使用して標準出力を変数に保存します。
コマンドを表示するには、標準出力の戻り値と一緒に ‘debug’
モジュールを使用します。
---
- hosts: all
become: yes
tasks:
- name: Execute /boot usage on Hosts
command: 'df -Th /'
register: df
- debug: var=df.stdout
それでは、プレイブックを実行してみましょう。この場合、プレイブックに check_disk_space.yml という名前を付けました。
ansible-playbook check_disk_space.yml
ご覧のとおり、出力はすべてごちゃ混ぜになっており、理解するのが困難です。
出力を揃えて読みやすくするには、stdout 戻り値を stdout_lines に置き換えます。
---
- hosts: all
become: yes
tasks:
- name: Execute /boot usage on Hosts
command: 'df -Th /'
register: df
- debug: var=df.stdout_lines
条件を使用して再生の実行を制御する
プログラミング言語と同様に、 複数の結果が考えられる場合には条件文が使用されます。 Ansible Playbook で一般的に使用される条件ステートメントのいくつかを見てみましょう。
When ステートメント
場合によっては、他のノードではなく特定のノードでタスクを実行したい場合があります。 'when'
条件ステートメントは非常に簡単に使用でき、プレイブックに実装できます。 'when'
句を使用する場合は、次のように句の隣に条件を宣言するだけです。
when: condition
条件が満たされると、タスクはリモート システム上で実行されます。
いくつかの例を確認してみましょう。
例 1: When 演算子の使用
---
- hosts: all
tasks:
- name: Install Nginx on Debian
apt: name=nginx state=present
when: ansible_os_family == “Debian”
上記のプレイでは、Debian ファミリのディストリビューションを実行しているホストにNginx ウェブサーバーをインストールします。
OR
演算子と AND
演算子を when 条件文と一緒に使用することもできます。
例 2: When での AND 演算子の使用
---
- hosts: all
tasks:
- name: Install Nginx on Debian
apt: name=nginx state=present
when: ansible_os_family == “Debian” and
ansible_distribution_version == “18.04”
AND
演算子を使用する場合、タスクを実行するには両方のステートメントが満たされる必要があります。
上記のプレイでは、バージョン 18.04 の Debian ファミリの OS を実行しているノードに Nginx をインストールします。明らかに、これは Ubuntu 18.04 になります。
例 3: When での OR 演算子の使用
OR
演算子を使用すると、いずれかの条件が満たされた場合にタスクが実行されます。
---
- hosts: all
tasks:
- name: Install Nginx on Debian
apt: name=nginx state=present
when: ansible_os_family == “Debian” or
Ansible_os_family == “SUSE”
上記のプレイでは、Debian または SUSE ファミリの OS のいずれか、あるいはその両方に Nginx Web サーバーをインストールします。
注: 条件をテストするときは、必ず二重等号 ==
を使用してください。
ループ内の条件文
条件分岐はループ内でも使用できます。たとえば、リモート ノードにインストールする必要がある複数のパッケージのリストがあるとします。
以下のプレイブックには、インストールする必要があるパッケージのリストを含むパッケージと呼ばれる配列があります。 required 句が True に設定されている場合、これらのタスクは次々に実行されます。
---
- name: Install Software packages
hosts: all
vars:
packages:
• name: nginx
required: True
• name: mysql
required: True
• name: apache
required: False
tasks:
• name: Install “{{ item.name }}”on Debian
apt:
name: “{{ item.name }}”
state: present
When: item.required == True
loop: “{{ packages }}”
エラー処理の構成
Playbook の実行時にタスクが失敗することがあります。以下のプレイブックに示すように、3 つのサーバーで 5 つのタスクを実行していると仮定します。サーバー 2 のタスク 3 (MySQL の起動) でエラーが発生した場合、Ansible はサーバー 2 での残りのタスクの実行を停止し、残りのサーバーで残りのタスクを完了しようとします。
---
- name: Install Software packages
hosts: server1, server2, server3
tasks:
- name: Install dependencies
<< some code >>
- name: Install MySQL database
<< some code >>
- name: Start MySQL
<< some code >>
- name: Install Nginx
<< some code >>
- name: Start Nginx
<< some code >>
たとえば、サーバーの 1 つが失敗した場合にプレイブックの実行を停止するなど、プレイブックの実行に一貫性を持たせたい場合は、オプションを追加します。
---
- name: Install Software packages
hosts: server1, server2, server3
any_errors_fatal: true
tasks:
このようにして、1 つのサーバーで 1 つのタスクが失敗した場合、Ansible はすべてのサーバーでプレイブック全体の実行を停止し、終了します。
Playbook でエラーを無視し、残りのタスク セットの実行を続行する場合は、ignore_errors: True オプションを使用します。
---
- name: Install Software packages
hosts: server1, server2, server3
tasks:
- name: Install dependencies
<< some code >>
ignore_errors: True
システムを指定された状態に構成するためのプレイブックを作成する
このセクションでは、プレイブックの実行時に使用できる追加のオプションをいくつか見ていきます。
まずはチェックモードまたはドライランオプションから始めましょう。ドライ ランまたはチェック モード オプションは、プレイブックを実行するときに使用され、エラーが発生するかどうか、および管理対象ホストに変更が加えられるかどうかを確認します。ただし、リモート ノードには変更が加えられません。
たとえば、Apache Web サーバーをインストールして起動する httpd.yml
というプレイブックをドライランするには、次のコマンドを実行します。
ansible-playbook httpd.yml --check
確認する必要があるもう 1 つのオプションは、--start-at-task
オプションです。これは、プレイブックが開始するタスクの名前を指定するときに使用されます。
例を見てみましょう: 以下のプレイブックは 2 つのタスクを詳しく説明しています。最初のプレイでは Apache Web サーバーをインストールし、2 番目のプレイでは htop ユーティリティをインストールします。
---
- name: Install httpd
hosts: all
tasks:
yum:
name: httpd
state: Installed
- name: Install htop
yum:
name: htop
state: started
Apache Webサーバーのインストールをスキップし、代わりに htop ユーティリティをインストールする場合は、次のコマンドを実行します。
ansible-playbook playbook.yml --start-at-task “Install htop”
最後に、図のようにタグ オプションをプレイブックに追加することで、タスクやプレイにタグを付けることができます。これは、非常に大規模な Playbook があり、Playbook 全体から特定のタスクを実行したい場合に便利です。
---
- name: Install httpd
tags: Install and start
hosts: all
tasks:
yum:
name: httpd
state: Installed
tags: Install
• service:
name: httpd
state: started
ansible-playbook playbook.yml -tags "Install"
タグを省略するには、次のように --skip-tags
オプションを使用します。
ansible-playbook playbook.yml --skip-tags "Install"
結論
このトピックでは、Ansible で一般的に使用されるモジュール、分析のためにプレイブックの実行から stdout を取得する方法、プレイブック内で条件を使用する方法、実行時に発生する可能性のあるエラーを管理する方法について説明しました。タスク。最後に、Playbook の構成と、Playbook 全体を実行するつもりがない場合に追加のオプションを使用して実行するタスクを決定する方法について説明しました。