ワークショップ演習 - 条件、ハンドラー、ループ

他の言語でもお読みいただけます:
uk Englishjapan日本語brazil Portugues do Brasilfrance FrançaiseEspañol Español

目次

目的

3 つの基本的な Ansible 機能は次のとおりです。

ガイド

ステップ 1 - 条件

Ansible は条件を使用して、特定の条件が満たされたときにタスクまたは再生を実行できます。

条件を実装するには、when ステートメントを使用します。その後にテストする条件が続きます。条件は、たとえば比較のような利用可能なオペレーターのひとつを使って表現します。

   
== Compares two objects for equality.
!= Compares two objects for inequality.
> true if the left hand side is greater than the right hand side.
>= true if the left hand side is greater or equal to the right hand side.
< true if the left hand side is lower than the right hand side.
<= true if the left hand side is lower or equal to the right hand side.

詳細は、以下のドキュメントを参照してください。http://jinja.pocoo.org/docs/2.10/templates/

例として、FTP サーバーをインストールしたいと思っていますが、「ftpserver」インベントリーグループにあるホストにのみにインストールしたいとします。

これを行うには、インベントリーを編集して別のグループを追加し、node2 を配置します。node2 の IP アドレスは、node2 がリストされたときと常に同じになるようにしてください。以下のリストのようにインベントリー ~/lab_inventory/hosts を編集します。

[web]
node1 ansible_host=11.22.33.44
node2 ansible_host=22.33.44.55
node3 ansible_host=33.44.55.66

[ftpserver]
node2 ansible_host=22.33.44.55

[control]
ansible-1 ansible_host=44.55.66.77

次に、~/ansible-files/ ディレクトリーのコントロールホストで ftpserver.yml ファイルを作成します。

---
- name: Install vsftpd on ftpservers
  hosts: all
  become: true
  tasks:
    - name: Install FTP server when host in ftpserver group
      yum:
        name: vsftpd
        state: latest
      when: inventory_hostname in groups["ftpserver"]

ヒント

これで、Ansible Playbook の実行方法をご理解いただけたと思いますので、これからは説明を少し簡潔にしていき、作成して実行するというスタイルにします。

そして、それを実行して結果を検証します。予期される結果: このタスクは、node1、node3、ansible ホスト (コントロールホスト)ではスキップされます。これは、インベントリーファイルの ftpserver グループに存在しないためです。

TASK [Install FTP server when host in ftpserver group] *******************************************
skipping: [ansible-1]
skipping: [node1]
skipping: [node3]
changed: [node2]

ステップ 2 - ハンドラー

タスクがシステムに変更を加える場合は時折、その他の単一のタスクまたは複数タスクを実行しなければならない場合があります。たとえば、サービスの設定ファイルを変更すると、変更した構成の有効化にサービスを再起動しなければならないことがあります。

ここで、Ansible のハンドラーが機能します。ハンドラーは、「notify」ステートメントを使用して明示的に呼び出された場合にのみトリガーされる非アクティブなタスクと見なすことができます。詳細は、Ansible ハンドラー のドキュメントをご覧ください。

例として、次のような playbook を作成しましょう。

まず、Ansible がデプロイするファイルが必要です。node1 からファイルを取得しましょう。以下のリストに示されている IP アドレスは、個人の node1 の IP アドレスに置き換えることを忘れないでください。

[student@ansible-1 ansible-files]$ scp node1:/etc/httpd/conf/httpd.conf ~/ansible-files/files/.
httpd.conf

次に、Playbook httpd_conf.yml を作成します。ディレクトリー ~/ansible-files にいることを確認してください。

---
- name: manage httpd.conf
  hosts: web
  become: true
  tasks:
  - name: Copy Apache configuration file
    copy:
      src: httpd.conf
      dest: /etc/httpd/conf/
    notify:
      - restart_apache
  handlers:
    - name: restart_apache
      service:
        name: httpd
        state: restarted

さて、なにがこれまでと違うのでしょうか。


playbook を実行します。このファイルではまだ何も変更していないので changed の行は出力に表示されません。もちろん、ハンドラーは起動していません。

Listen 8080

Apache はポート 8080 でリッスンするはずです。確認は簡単です。

[student@ansible-1 ansible-files]$ curl http://node1
curl: (7) Failed to connect to node1 port 80: Connection refused
[student@ansible-1 ansible-files]$ curl http://node1:8080
<body>
<h1>Apache is running fine</h1>
</body>

8080 番ポートでリッスンする設定のままにします。後でこれを使用します。

ステップ 3 - 簡単なループ

ループを使用すると、同じタスクを何度も繰り返すことができます。たとえば、複数のユーザーを作成するとします。Ansibleループを使用することで、1 つのタスクでそれを行うことができます。ループは、基本的なリスト以上のものを繰り返すこともできます。たとえば、対応するグループを持つユーザーのリストがある場合、ループはそれらを反復処理することもできます。ループの詳細については、Ansible Loops のドキュメントをご覧ください。

ループ機能のデモとして、node1 で 3 つの新しいユーザーをつくります。この作業用に、お使いの学習者ユーザーとしてコントロールノードの ~/ansible-filesloop_users.yml ファイルを作成します。user モジュールを使用して、ユーザーアカウントを生成します。

---
- name: Ensure users
  hosts: node1
  become: true

  tasks:
    - name: Ensure three users are present
      user:
        name: "{{ item }}"
        state: present
      loop:
         - dev_user
         - qa_user
         - prod_user

Playbook と出力の概要:

ステップ 4 - ハッシュのループ

前述のように、ループはハッシュのリストでも実行できます。ユーザーを別の追加グループに割り当てる必要があると想像してください。

- username: dev_user
  groups: ftp
- username: qa_user
  groups: ftp
- username: prod_user
  groups: apache

user モジュールには、その他のユーザーを一覧表示するためのオプションのパラメーター groups があります。ハッシュでアイテムを参照するには、キーワードが、サブキーを参照する必要があります (例:)。

Playbook を書き直して、追加のユーザー権限を持つユーザーを作成しましょう。

---
- name: Ensure users
  hosts: node1
  become: true

  tasks:
    - name: Ensure three users are present
      user:
        name: "{{ item.username }}"
        state: present
        groups: "{{ item.groups }}"
      loop:
        - { username: 'dev_user', groups: 'ftp' }
        - { username: 'qa_user', groups: 'ftp' }
        - { username: 'prod_user', groups: 'apache' }

出力を確認します。

以下の Playbook を使用して、dev_usernode1 で作成されたことを確認します。

---
- name: Get user ID
  hosts: node1
  vars:
    myuser: "dev_user"
  tasks:
    - name: Get {{ myuser }} info
      getent:
        database: passwd
        key: "{{ myuser }}"
    - debug:
        msg:
          - "{{ myuser }} uid: {{ getent_passwd[myuser].1 }}"
$ ansible-navigator run user_id.yml -m stdout

PLAY [Get user ID] *************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [Get dev_user info] *******************************************************
ok: [node1]

TASK [debug] *******************************************************************
ok: [node1] => {
    "msg": [
        "dev_user uid: 1002"
    ]
}

PLAY RECAP *********************************************************************
node1                      : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ナビゲーション
前の演習 - 次の演習

Click here to return to the Ansible for Red Hat Enterprise Linux Workshop