私のプレイブックは以下の通りです:
- hosts : mygroup
user : user
sudo : yes
tasks :
- name : Copy script
copy : 'src=/home/user/Scripts/logchecker.py dest=/opt/root2/logchecker.py owner=root group=root mode=755'
- name : Execute script
command : '/usr/bin/python /opt/root2/logchecker.py'
ファイルのアップロードは機能していますが、実行が失敗しています。サーバー上で直接スクリプトを問題なく実行できるにもかかわらずです。何か間違ったことをしているのでしょうか?
答え1
期待通りに動作する同様のプレイブックを使用しました:
# playbook.yml
---
- hosts: ${target}
sudo: yes
tasks:
- name: Copy file
copy: src=../files/test.py dest=/opt/test.py owner=howardsandford group=admin mode=755
- name: Execute script
command: /opt/test.py
そしてtest.py:
#!/usr/bin/python
# write to a file
f = open('/tmp/test_from_python','w')
f.write('hi there\n')
プレイブックの実行:
ansible-playbook playbook.yml --extra-vars "target=the_host_to_run_script_on"
番組:
PLAY [the_host_to_run_script_on] ***************************************************************
GATHERING FACTS ***************************************************************
ok: [the_host_to_run_script_on]
TASK: [Copy file] *************************************************************
changed: [the_host_to_run_script_on]
TASK: [Execute script] ********************************************************
changed: [the_host_to_run_script_on]
PLAY RECAP ********************************************************************
the_host_to_run_script_on : ok=3 changed=2 unreachable=0 failed=0
リモートホストでは次のようになります。
$ cat /tmp/test_from_python
hi there
私たちのセットアップにはいくつかの違いがあります:
- コピーとコマンドパラメータを一重引用符で囲んでいません
- シェバンは、コマンドラインから/usr/bin/pythonを指定するのではなく、Pythonインタープリターを設定します。
- スクリプトの所有者を、rootではなく、自分のユーザー名とsudoersのプライマリグループに設定しました。
うまくいけば、これが違いがどこにあるかについて正しい方向を指し示すことができるでしょう。
答え2
使用するには以下のプラグインスクリプトのみが必要です
---
- hosts: ${target}
become: true
tasks:
- name: Copy and Execute the script
script: /opt/test.py