AnsibleのホストにSSH経由でアクセスできなくなった場合は、電子メールを受信したいと思います。
私はその仕事をするために演劇を書こうとしました(下記参照)。事実を収集した後に接続できないホストは削除されるため、電子メールの送信は接続できないホストに対しては実行されません。
-name:ホストアクセシビリティの確認 スポンサー:みんな 仕事: - local_action: shell ssh デプロイ@{{ansible_hostname}} echo OK 登録:check_ssh - local_action: デバッグメッセージ = "{{check_ssh.stdout}}" いつ:check_ssh.stdout! =「わかりました」
ありがとうございます。
答え1
これが私の解決策ですansible > 2.0
。
- name: Check host accessibility
hosts: all
user: deploy
gather_facts: no
tasks:
- block:
- command: echo OK
- assert:
that:
- ansible_play_hosts == ansible_play_hosts_all
rescue:
- name: send email when something goes wrong (pe, cannot reach a machine)
local_action:
module: mail
host: localhost
to: < email here >
from: < email here >
subject: 'Host check - {{ (ansible_play_hosts_all | difference(ansible_play_hosts)) | first }}'
body: 'Cannot login into the machine'
when: inventory_hostname == "< hostname of main server here >"
これが私が提供できる最高のソリューションです。残念ながら、ホストがだとは思わansible
ないので、セクションは呼び出されません。ホストの総数と比較して、最後の操作を実行したホストの数を計算する問題を修正しました。異なる場合は、少なくとも1つのホストがあることを意味するので、アサーションを実行してそのセクションに進みます。 2番目の問題は、アサーションがすべてのホストで機能するため、電子メールを送信するホストを1つだけ選択する必要があることです(この場合はAnsibleがインストールされているサーバーを選択しました)。unreachable
failed
rescue
unreachable
rescue
答え2
私はPythonスクリプトを使用するのが最も簡単なソリューションであることを知りました(少なくとも私のAnsibleバージョン1.7ではコールバックプラグインよりも簡単です)。
#!/usr/bin/env python
from __future__ import print_function
import ansible.inventory
import ansible.runner
from subprocess import Popen, PIPE
import sys
TO = "root"
def message(subject, body):
p = Popen(["mail", "-s", subject, TO], stdin=PIPE)
p.communicate(input=body)
res = p.wait()
if res != 0:
print("Failed to send message", file=sys.stderr)
def main():
im = ansible.inventory.Inventory()
runner = ansible.runner.Runner(
module_name='command',
module_args='sh -c "echo OK"',
sudo=True,
)
run = runner.run()
nosudo = set(run["dark"].keys())
runner = ansible.runner.Runner(
module_name='command',
module_args='sh -c "echo OK"',
sudo=False,
inventory=ansible.inventory.Inventory(list(nosudo)),
)
run = runner.run()
nonet = set(run["dark"].keys())
nosudo = nosudo - nonet
for host in nosudo:
message("Host check: %s" % host,
"Cannot execute 'sudo -u root ...' as user 'deploy'.")
for host in nonet:
message("Host check: %s" % host,
"Cannot login into the machine.")
if __name__ == '__main__':
main()