【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【予約システム開発】EDISONE カスタマイズ開発サービス

【予約システム開発】EDISONE カスタマイズ開発サービス

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【200ヶ国以上に対応】グローバル eSIM「ビヨンドSIM」

【200ヶ国以上に対応】グローバル eSIM「ビヨンドSIM」

【中国への旅行・出張・駐在なら】中国SIMサービス「チョコSIM」

【中国への旅行・出張・駐在なら】中国SIMサービス「チョコSIM」

【グローバル専用サービス】北米・中国でも、ビヨンドのMSP

【グローバル専用サービス】北米・中国でも、ビヨンドのMSP

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【Ansible】Playbookの処理を分岐させる方法【構成管理】

こんにちは! システムソリューション部のしめじです。
SRE チームに異動してから2ヶ月が過ぎました。
まだまだ分からないことだらけですが、日々新しい物事を学べる環境に感謝です!
新しいことを学ぶのは楽しいですね!

本日は構成管理ツールの Ansible についてです。
Playbook の処理を分岐させたい時ってありますよね。

例えば下記のような Playbook の処理を実行するとします。
中身は元ある設定ファイルをリネームした後に、新しい設定ファイルを設置するよくあるやつです。

- name: Rename Config File
  shell: mv /etc/hoge/main.cf /etc/hoge/main.cf_backup

- name: Deploy Config File
  template:
    src: "{{ inventory_dir }}/roles/hoge/template/conf.j2"
    dest: "/etc/hoge/main.cf"
    owner: root
    group: root
    mode: 644

上記の処理は特に何事もなく「元ある設定ファイルをリネーム」して、「新たな設定ファイルの設置」が完了します。
ただ、既に「main.cf_backup」というファイルがあれば処理をスキップしたい…。
そんな時は Registered Variables と when statement を使いましょう。

Registered Variables を使うと実行したタスクの実行結果を変数に入れることが出来ます。
その結果を元に処理を分岐させれば、処理をスキップできますね。
処理を分岐させるには、when statement を使用します。

ファイルが既にある場合はスキップしたい時

上記を考慮した Playbook の処理が下記になります。

- name: Rename Config File Confirm
  stat:
    path: /etc/hoge/main.cf_backup
  register: result

- name: Rename Config File
  shell: mv /etc/hoge/main.cf /etc/hoge/main.cf_backup
  when: not result.stat.exists

- name: Deploy Config File
  template:
    src: "{{ inventory_dir }}/roles/hoge/template/conf.j2"
    dest: "/etc/hoge/main.cf"
    owner: root
    group: root
    mode: 644

Rename Config File Confirm という処理を見て下さい。

  stat:
    path: /etc/hoge/main.cf_backup
  register: result

stat モジュールを使用して、main.cf_backup が存在しているか確認しています。
存在していれば result という変数に True を、そうでなければ False を格納します。

そして Rename Config File の処理の中に when ステートメントの記述がありますね。

when: not result.stat.exists

result が True でない場合のみ Rename Config File の処理を実行します。

実際に条件が一致した時に処理が実施されないことを確認してみます。
main.cf_backup が存在する下記サーバに対して処理を実行してみます。
・192.168.33.72【 CentOS72 】

ansible-playbook -i hosts operation.yml --ask-pass
PLAY [apply common configuration to all nodes] *********************************

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

TASK [hoge : Rename Config File Confirm] ******************************************
ok: [192.168.33.72]

TASK [hoge : Rename Config File] **************************************************
skipping: [192.168.33.72]

TASK [hoge : Deploy Config File] *********************************************************
ok: [192.168.33.72]

PLAY RECAP *********************************************************************
192.168.33.72              : ok=3    changed=0    unreachable=0    failed=0

うん、処理がスキップされていますね。

その他の分岐処理

when statement は他にも様々な条件分岐をさせることが出来ます。
下記は OS が CentOS7 の場合のみ Apache をインストールする Playbook になります。

  - name: CentOS7 Install Apache
    yum:
      name: httpd
      state: present
    when:
      - ansible_facts['distribution'] == "CentOS"
      - ansible_facts['distribution_major_version'] == "7"

条件はリスト形式にて書くことが可能です。
その場合は全ての条件に合致した場合のみ処理が実行されます。
(上記例では OS が CentOS でバージョンが 7 の場合)

実際に下記2つのサーバに対して処理を実行してみましょう。
・192.168.33.67【 CentOS67 】
・192.168.33.72【 CentOS72 】

ansible-playbook -i hosts operation.yml --ask-pass
PLAY [apply common configuration to all nodes] *********************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.33.65]
ok: [192.168.33.72]

TASK [test : CentOS7-install-apache] *******************************************
skipping: [192.168.33.65]
changed: [192.168.33.72]

PLAY RECAP *********************************************************************
192.168.33.65              : ok=1    changed=0    unreachable=0    failed=0
192.168.33.72              : ok=2    changed=1    unreachable=0    failed=0

192.168.33.72 にのみ処理が実行されていますね。
成功です!

終わりに

簡単なご紹介となりましたが、
他にも when statement には様々な条件分岐をさせることができます。
詳しく知りたい方は是非、公式のドキュメントを読んでみて下さい!
公式ドキュメント

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
1
読み込み中...
1 票, 平均: 1.00 / 11
18,676
X facebook はてなブックマーク pocket
【2025.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

【2025.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

【大阪 / 横浜】インフラエンジニア・サーバーサイドエンジニア 積極採用中!

【大阪 / 横浜】インフラエンジニア・サーバーサイドエンジニア 積極採用中!

この記事をかいた人

About the author

しめじ

  CERTIFICATE:
    - TOEIC 835
    - LPIC304
    - AWS Solution Architect Associate
    - AWS Solution Architect Professional
    - GCP Professional Cloud Architect
    - IPA SC ( 未登録 )

かーごめ、かーごめ、
後ろのおじさん、だぁあれ。

おじさんだよぉ。( 2018 )