Ansibleの使用方法とその他の条件

Ansible whenおよび他の条件を使用して、異なる条件に基づいてAnsibleタスクを実行する必要がある場合は、楽しいことになります。前のタスクに依存するかどうか、OSに基づいて条件を評価することができます。

このチュートリアルでは、Ansible whenおよび他の条件を使用して、タスクを実行せずにすむようにする方法を学びます。

さあ、始めましょう!

前提条件

このチュートリアルには実践的な例が含まれています。一緒に進める場合は、以下が整っていることを確認してください:

  • A remote computer to run commands.
  • インベントリファイルが設定されており、既にAnsibleコマンドおよびプレイブックを実行できるようになっている1つ以上のホストが必要です。このチュートリアルでは、インベントリグループwebを使用します。

プレイブック内で複数のタスクと一緒にAnsible whenを使用する

複数のタスクが条件なしですべて実行されると、プレイブックでの複数のタスクは手間です。このチュートリアルでは、Ansibleプレイブックの複数のタスクでAnsible when 条件を定義することから始めましょう。

1. Ansibleコントローラーホストでターミナルを開きます。

2. 以下のコマンドを実行して、ホームディレクトリにディレクトリを作成し、任意の名前を付け、そのディレクトリに移動します。

この例では、ディレクトリの名前は ansible_when_condition_demo です。このディレクトリには、Ansibleタスク内で when 条件を呼び出すのに使用する playbook が含まれます。

# ディレクトリ ~/ansible_when_condition_demo を作成
mkdir ~/ansible_when_condition_demo
# ワーキングディレクトリを ~/ansible_when_condition_demo に変更
cd ~/ansible_when_condition_demo

3. 好みのコードエディタで、~/ansible_when_condition_demo ディレクトリに YAML ファイルを作成します。この例では、ファイルの名前は my_playbook.yml です。以下の YAML プレイブックの内容を my_playbook.yml ファイルにコピーして貼り付けます。

両方のタスク (Task-1 および Task-2) では、when 条件が各リモートホストのオペレーティングシステムを確認します。その結果は、それぞれのタスクの ansible_os_family プレースホルダ変数に渡されます。

もしansible_os_familyのプレースホルダーの値がRedHatまたはDebianと等しい場合、AnsibleはApacheをインストールするタスクのいずれかを実行します。

---
- name: Ansible tasks to work on Ansible When
# Ansibleが実行されるリモートサーバーを定義する
  hosts: web
  remote_user: ubuntu # リモートホストをubuntuとして使用する
  become: true # タスクを昇格したユーザー(sudo)として実行する
  tasks:

# (タスク-1) ansible_os_family == "RedHat"を確認し、その後リモートノードにApacheをインストールする
    - name: Install Apache on CentOS  Server
      yum: name=httpd  state=present
      become: yes
      when: ansible_os_family == "RedHat"

# (タスク-2) ansible_os_family == "Debian"を確認し、その後リモートノードにApacheをインストールする
    - name: Install Apache on Ubuntu Server
      apt:name=apache2 state=present
      become: yes
      when: ansible_os_family == "Debian"

4. 以下のansible-playbookコマンドを実行して、既存のインベントリファイルで定義されているリモートホストで(my_playbook.yml)に定義されたタスクを実行します。

ansible-playbook my_playbook.yml 

以下のスクリーンショットでは、次のことがわかります:

  • 最初のタスクはOKステータスを返し、タスクに変更が必要ないことを示します。
  • 2番目のタスクスキップステータスを返しました。条件が満たされない場合、タスクはスキップされます。
  • 3番目のタスク変更ステータスを返し、リモートホストが適切な状態ではなかったこと(つまり、Apacheが存在しない)を示し、Apacheをインストールするために変更されました。
Invoking the ansible-playbook using ansible-playbook command

5. お気に入りのSSHクライアントを使用して、Ansibleプレイブックの対象であるリモートホストにSSHセッションを開き、Apacheがインストールされ、実行されていることを確認してください。

6. 最後に、以下のserviceコマンドを実行してApacheがインストールされているかを確認してください(status apache2)リモートホストで。

service status apache2

以下に示すように、リモートマシンにApacheサービスがインストールされています。

Verifying the Apache service on the remote node

Ansible whenおよびループの使用

以前に、特定のパラメータ(例:ansible_os_family)に対するAnsible whenに従ってAnsibleタスクを実行しました。ただし、リストで定義された複数のパラメータで条件をチェックする必要がある場合は、タスクにloopを追加してみてください。

以前に作成したmy_playbook.ymlファイルを開きます(「Ansible whenとプレイブックの複数のタスクで作業」のステップ3)。 my_playbook.ymlファイルの内容を以下のコードで置き換えます。

以下のコードのタスク(Task-1)は、loopを実行し、when条件がアイテムの値が5より大きいかどうかをチェックし、その結果を返します。

---
- name: Ansible tasks to work on Ansible When
# Ansibleが実行されるリモートサーバーの定義
  hosts: web
  remote_user: ubuntu   # リモートホストとしてubuntuを使用
  become: true
  tasks:
  # (Task -1) アイテムの値が5より大きいかどうかをチェック
    - name: Run with items greater than 5
      ansible.builtin.command: echo {{ item }}
      loop: [ 0, 2, 4, 6, 8, 10 ]
      when: item > 5*

前回と同じように、以下のコマンドを実行してプレイブックを実行してください。

 ansible-playbook my_playbook.yml

以下に、条件が偽の場合はskippingステータスが表示され、条件が真の場合はchangedステータスが表示されます。

Checking the when condition for multiple parameters

Ansible whenおよびAnsible factsと連携して作業します。

おそらく、タスクを実行するために複数の条件を追加したい場合があります。その場合は、when条件内でAnsible factsをどのように利用するかを学習してください。Ansible factsを使用すると、OS、IPアドレス、接続されたファイルシステムなどの収集された事実に基づいてタスクを実行する条件文を追加できます。

my_playbook.ymlファイルの内容を以下のコードに置き換えます。

以下のコードでは、Task-1およびTask-2の両方のタスクは、次の条件のいずれかが真の場合にのみ(システムをシャットダウン)実行されます:

  • distributionおよびdistribtion_major_versionの両方が真の値を返した場合。
  • os_familyの値がCentOSと等しい場合。
---
- name: Ansible When Single task example
  hosts: web
  remote_user: ubuntu
  become: true
  tasks:
# (Task-1): distributionがCentOSでmajor Versionが6の場合、リモートノードをシャットダウンします
    - name: Shut down CentOS 6 systems
      ansible.builtin.command: /sbin/shutdown -t now
      when:
        - ansible_facts['distribution'] == "CentOS"
        - ansible_facts['distribution_major_version'] == "6"
# (Task-2): os_familyがCentOSの場合、リモートノードをシャットダウンします
    - name: Shut down CentOS flavored systems
      ansible.builtin.command: /sbin/shutdown -t now
      when: ansible_facts['os_family'] == "CentOS"

以前と同じコマンドでプレイブックを実行します。

ansible-playbook my_playbook.yml

以下に注目してください。Ubuntuの場合は、両方のタスクがskippingステータスを表示します。タスクは、CentOSの場合にのみ実行されます。

Executing the ansible-playbook with Ansible facts in Ansible when

Ansibleを使用したwhenに基づく登録値に基づく作業

時々、Playbook内の以前のタスクの結果に基づいてタスクを実行したりスキップしたりしたいことがあります。たとえば、前のタスクがアップグレードされた後にサービスを構成したい場合があります。その場合は、登録変数を使用します。登録変数を使用すると、以前のタスクの結果を変数として登録し、次のタスクの入力として使用できます。

1. /home/ubuntu/helloという名前の空のディレクトリを作成します。

2. 下記のコードでmy_playbook.ymlファイルの内容を置き換えます。このコードは、次のことを実行します。

最初のタスク(Task-1)は、/etc/hostsディレクトリの内容(ファイルとサブディレクトリ)をメモリにリストし、その結果をregisterコマンドを介してcontents1変数に保存します。

2番目のタスク(Task-2)は、/home/ubuntu/helloディレクトリの内容(現在は空)をメモリにリストし、そのリストをcontents2変数に保存します。

3番目のタスク(Task-3)は、contents1またはcontents2変数の登録結果のいずれかが空である場合に、「ディレクトリが空です」というメッセージを確認して表示します。

contents1およびcontents2変数のstdoutプロパティは、タスクコマンドを実行した結果の保存されたシェル出力です。

---
- name: Ansible When Single task example
  hosts: web
  remote_user: ubuntu
  become: true
  tasks:
# (タスク1):/etc/hostsディレクトリのディレクトリコンテンツをリストアップする
      - name: List contents of directory and Store in content1
        ansible.builtin.command: ls /etc/hosts
        register: contents1
# (タスク2):/home/ubuntu/helloディレクトリのディレクトリコンテンツをリストアップする
      - name: List contents of directory and Store in content2
        ansible.builtin.command: ls /home/ubuntu/hello
        register: contents2
# (タスク3):どちらかのディレクトリが空の場合はディレクトリが空であることを表示する
# /etc/hostsまたは/home/ubuntu/helloが空のディレクトリの場合
      - name: Check contents for emptiness for content1 or content2
        ansible.builtin.debug:
          msg: "Directory is empty"
        when: contents1.stdout == "" or contents2.stdout == ""

3. 最後に、以下のansible-playbookコマンドでプレイブックを実行します。

ansible-playbook my_playbook.yml

以下のように、contents2変数の登録結果が空であるため、3番目のタスクはディレクトリが空であるメッセージを返します。

Running the Ansible playbook for Ansible when based on registered values

Ansibleでwhenを使用する

最後の例では、Ansibleのroles内でwhenがどのように機能するかを学びます。 Ansibleのrolesを使用すると、標準の構成を再利用して迅速な展開が可能です。 Ansibleのwhen条件がtrueの場合にのみ、タスクがAnsibleのrolesを呼び出す方法について学習してください。

1. 以下のコマンドを実行して、ホームディレクトリに~/ansible_role_when_demoというディレクトリを作成し、そのフォルダに移動します。この~/ansible_role_when_demoディレクトリには、この例のデモファイルが保存されます。

# ホームディレクトリに~/ansible_role_when_demoというディレクトリを作成します
mkdir ~/ansible_role_when_demo
# ~/ansible_role_when_demoディレクトリに移動します
cd ~/ansible_role_when_demo

2. 次に、以下のコマンドを実行して、~/ansible_role_when_demo/roles~/ansible_role_when_demo/roles/java/tasksディレクトリを作成します。

各ディレクトリには以下の内容が含まれます:

  • ~/ansible_role_when_demo/rolesディレクトリには、展開する必要のある役割が含まれます。

デフォルトでは、Ansibleはplaybookが存在するディレクトリ内のroles/ディレクトリまたは/etc/ansible/roles内の2つの場所で役割を検索します。別のパスに役割を保存する場合は、playbookで- role:パラメータを使用してパスを宣言します

  • ~/ansible_role_when_demo/roles/java/tasksフォルダには、役割を展開するために必要なmain.ymlファイルが含まれています。
# ~/ansible_role_when_demoディレクトリ内にrolesという名前のディレクトリを作成します。
mkdir -p roles
# 作業ディレクトリを~/ansible_role_when_demo/rolesディレクトリに変更します。
cd roles 
# 親ディレクトリ(-p)としてjavaという名前のサブディレクトリを作成します。
mkdir -p java/tasks

今、~/ansible_role_when_demo/roles/java/tasksディレクトリにmain.ymlという名前のファイルを作成し、その後、以下のプレイブックコードをmain.ymlファイルにコピーして貼り付けます。

以下のプレイブックは、aptモジュールを使用してリモートノードにJavaをインストールします。

---
# Java(Open Jdk)をインストールする
- name: Install Java 1.8
  apt: name=openjdk-8-jdk

4. 好きな名前の別のYAMLファイルを作成し、以下のコードをコピー/貼り付けます。この例では、ファイルの名前は~/ansible_role_when_demo/java-setup.ymlです。

以下のコードは、Ansibleのrolejava)を、管理者アクセスがあるリモートユーザー(ubuntu)に、そのリモートユーザーがDebian OS上にある場合のみ展開します。

- name: Java Installation playbook
# パッケージを展開するリモートサーバーを定義する
  hosts: myserver
  remote_user: ubuntu   # リモートユーザーをubuntuとして使用する
  become: true
  tasks:  
  roles:
     - role: java
       # リモートユーザーがDebian OS上にある場合にのみタスクを実行します。
       when: ansible_facts['os_family'] == 'Debian'

5. ~/ansible_role_when_demoディレクトリに存在するすべての必要なフォルダとファイルを確認するために、treeコマンドを実行してください。

Verifying all of the required folders in the ~/ansible_role_when_demo directory

6. 最後に、以下のansible-playbookコマンドを使用して、プレイブックを実行してください。 ansible-playbook java-setup.yml

ansible-playbook java-setup.yml

以下のタスクは、Debian OSを実行しているリモートノードにJavaが正常にインストールされたことを示すchangedステータスを返しました。 Ansibleロールを使用したAnsible whenを使用してAnsibleプレイブックを実行する

Running the Ansible playbook using Ansible when with Ansible roles

結論

このチュートリアルでは、Ansible whenおよびその他の条件文の異なる使用方法について学びました。また、Ansible when条件を適用する方法、基本的なタスクからAnsible factsを活用してAnsible rolesを展開する方法についても学びました。

この新しい知識をどのように活用しますか?おそらく、Ansibleテンプレートを使用して複数のサーバーの構成を保存し、Ansible when条件を適用しますか?

Source:
https://adamtheautomator.com/ansible-when/