Ansibleを使用して開発サーバーをプロビジョニングしています。
常にいくつかのサービスを開始してほしい。この目的のハンドラーがありますが、条件なしでハンドラーの実行をトリガーするための最良の方法は何ですか?
このようなもの:
tasks:
- name: Trigger handler
run_handler: name=nginx-restart
Ansibleを使用して開発サーバーをプロビジョニングしています。
常にいくつかのサービスを開始してほしい。この目的のハンドラーがありますが、条件なしでハンドラーの実行をトリガーするための最良の方法は何ですか?
このようなもの:
tasks:
- name: Trigger handler
run_handler: name=nginx-restart
回答:
毎回ハンドラーをトリガーする必要がある場合は、次の2つのオプションがあります。
1)noopシェルコマンドを実行します。このコマンドは常に変更されたと報告します
- name: trigger nginx-restart
command: /bin/true
notify: nginx-restart
2)changed_when:と共にデバッグを使用して、ハンドラーをトリガーします
- debug: msg="trigger nginx-restart"
notify: nginx-restart
changed_when: true
オプション1およびチェックモードについても注意してください:check_mode: no
Ansibleバージョン2.2以降を使用している場合、またはそれよりalways_run: yes
前のバージョンを使用している場合、チェックモードでタスクがスキップされないように使用できます。私の手動テストでは、ハンドラーはチェックモードのままであるように見えますが、場合によっては注意してください。
changed_when
より多くのロジックを使用して、非ide等タスク(場合によっては複数回呼び出される可能性がある)をタスクではなくハンドラーとして実装しました。
1)すべてのハンドラーを常に強制するにはansible-playbook playbook.yml --force-handlers
、https://github.com/ansible/ansible/issues/4777に記載されているように、を実行します
2)プレイブック内の特定の時点で通知されたハンドラーを強制するには、メタタスクhttps://docs.ansible.com/playbooks_intro.htmlを使用できます。
tasks:
- shell: some tasks go here
- meta: flush_handlers
- shell: some other tasks
3)ただし、別のタスクの結果に関係なく、サービスが実行または再起動されていることを確認したいだけのようです。その場合、ハンドラーを使用せずに、Ansibleのservice
モジュールを呼び出す新しいタスクを使用してください:http : //docs.ansible.com/service_module.html
tasks:
- name: ensure ntp is running
service: name=ntp state=started enabled=yes
- name: always reload nginx
service: name=nginx state=reloaded
- name: always restart MySQL
service: name=mysql state=restarted
サービスの再起動は一つのことです。それが実行されていることを確認することは別です。実行さansible
れていることを確認したい場合nginx
、これを行います:
tasks:
- name: Ensure nginx is running
service: name=nginx state=started