【新卒 / 中途採用】サーバー / クラウドエンジニア 募集中!【大阪】

【新卒 / 中途採用】サーバー / クラウドエンジニア 募集中!【大阪】

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

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

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

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

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

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

【音声アプリ開発】Twilio アプリ開発サービス』

【音声アプリ開発】Twilio アプリ開発サービス』

【メッセージアプリ】LINE アプリ開発サービス

【メッセージアプリ】LINE アプリ開発サービス

【対談記事】彼らはどのようにサービスを移管しているのか?インフラ担当会社ビヨンドと共に内情を明かす

【対談記事】彼らはどのようにサービスを移管しているのか?インフラ担当会社ビヨンドと共に内情を明かす

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

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

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


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

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

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

- name: rename-conffile
  shell: mv /etc/hoge/main.cf /etc/hoge/main.cf_backup

- name: conf-add
  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-conffile-confirm
  stat: path=/etc/hoge/main.cf_backup
  register: result

- name: rename-conffile
  shell: mv /etc/hoge/main.cf /etc/hoge/main.cf_backup
  when: not result.stat.exists

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

rename-conffile-confirmという処理を見て下さい。

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

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

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

when: not result.stat.exists

resultがTrueでない場合のみget-backupの処理を実行します。

実際に条件が一致した時に処理が実施されないことを確認してみます。
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-conffile-confirm] ******************************************
ok: [192.168.33.72]

TASK [hoge : rename-conffile] **************************************************
skipping: [192.168.33.72]

TASK [hoge : conf-add] *********************************************************
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には様々な条件分岐をさせることができます。
詳しく知りたい方は是非、公式のドキュメントを読んでみて下さい!
公式ドキュメント


この記事をかいた人

About the author

讃岐佳介

  CERTIFICATE:
    - TOEIC 835
    - LPIC304
    - AWS Solution Architect Associate
    - GCP Professional Cloud Architect