ウェブサイト検索

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 全体を実行するつもりがない場合に追加のオプションを使用して実行するタスクを決定する方法について説明しました。