Python スクリプトをアップロードして実行するための Ansible プレイブック

Python スクリプトをアップロードして実行するための Ansible プレイブック

私のプレイブックは以下の通りです:

- 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

関連情報