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

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

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

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

【圧倒的 低コスト】Oracle Cloud 構築・運用保守・監視サービス

【圧倒的 低コスト】Oracle Cloud 構築・運用保守・監視サービス

【WordPress専用】高速 クラウド / サーバー『WebSpeed』

【WordPress専用】高速 クラウド / サーバー『WebSpeed』

【低コスト】Wasabi オブジェクトストレージ 構築・運用サービス

【低コスト】Wasabi オブジェクトストレージ 構築・運用サービス

【次世代】ゲーム専用データ分析エンジン『ThinkingEngine』

【次世代】ゲーム専用データ分析エンジン『ThinkingEngine』

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

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

【SNSアプリ開発】LINE カスタムアプリ開発サービス

【SNSアプリ開発】LINE カスタムアプリ開発サービス

【ECアプリ開発】Shopify カスタムアプリ開発サービス

【ECアプリ開発】Shopify カスタムアプリ開発サービス

【音声アプリ開発】Twilio カスタムアプリ開発サービス

【音声アプリ開発】Twilio カスタムアプリ開発サービス

【グローバル対応】北米リージョン・クラウド / サーバー サポート

【グローバル対応】北米リージョン・クラウド / サーバー サポート

【取材記事】サーバーサイド・バックエンドエンジニアを募集中

【取材記事】サーバーサイド・バックエンドエンジニアを募集中

【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
14,577
facebook twitter はてなブックマーク
【大阪 / 横浜】インフラエンジニア / サーバーサイドエンジニア 積極採用中!

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

この記事をかいた人

About the author

ふぇろろん

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

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

おじさんだよぉ。( 2018 )