プログラマーの調べ物

プログラマーが調べ物をするときに役に立つサイトを作ります。

Ansibleでリモートサーバのコマンドやシェルスクリプトを実行

リモートのサーバ上にあるhoge.shを実行してみる。

# cat hoge.sh
#!/bin/sh

echo "hogeeee"
exit 0
[root@localhost script]#

これをAnsibleホストから実行するには、以下のようなPlaybookを書く。

$ cat command.yml
- name: execute shell script
  hosts: all
  tasks:
    - name: execute hoge.sh
      command: "/root/script/hoge.sh"

以下のコマンドで実行。

ansible-playbook -i hosts command.yml

結果はこんな感じになる。

$ ansible-playbook -i hosts command.yml

PLAY [execute shell script] ******************************************************************

TASK [Gathering Facts] ***********************************************************************
ok: [vm-machine]

TASK [execute hoge.sh] ***********************************************************************
changed: [vm-machine]

PLAY RECAP ***********************************************************************************
vm-machine                 : ok=2    changed=1    unreachable=0    failed=0

では、exit 1で終了した場合はどうなるのか? 実行するスクリプトexit 1で終了するように変更。

cat hoge.sh
#!/bin/sh

echo "hogeeee"
exit 1
[root@localhost script]#

すると…

$ ansible-playbook -i hosts command.yml

PLAY [execute shell script] ******************************************************************

TASK [Gathering Facts] ***********************************************************************
ok: [vm-machine]

TASK [execute hoge.sh] ***********************************************************************
fatal: [vm-machine]: FAILED! => {"changed": true, "cmd": ["/root/script/hoge.sh"], "delta": "0:00:00.003313", "end": "2017-07-15 22:40:10.164897", "failed": true, "rc": 1, "start": "2017-07-15 22:40:10.161584", "stderr": "", "stderr_lines": [], "stdout": "hogeeee", "stdout_lines": ["hogeeee"]}
        to retry, use: --limit @/home/sysmgr/ansible/command.retry

PLAY RECAP ***********************************************************************************
vm-machine                 : ok=1    changed=0    unreachable=0    failed=1

ちゃんとエラーで終了した旨を通知してくれる。