2014-01-16 14 views
20

私は、Ansibleプレイブックを使用してリモートサーバー上でシェルスクリプトを実行する予定です。Ansibleを使用してリモートサーバー上でシェルスクリプトを実行する方法は?

test.sh:

touch test.txt 

脚本:

--- 
- name: Transfer and execute a script. 
    hosts: server 
    user: test_user 
    sudo: yes 
    tasks: 
    - name: Transfer the script 
     copy: src=test.sh dest=/home/test_user mode=0777 

    - name: Execute the script 
     local_action: command sudo sh /home/test_user/test.sh 

私は脚本を実行すると、転送が正常に発生したが、スクリプトが実行されていません。

+0

[スクリプト](http://docs.ansible.com/script_module.html)モジュール、これを行うませませんか? –

答えて

19

local_actionローカルサーバー上で、hostsパラメーターで指定したサーバーではなくコマンドを実行します。

- name: Execute the script 
    command: sh /home/test_user/test.sh 

に、あなたの「スクリプトを実行」タスクを変更

、それはそれを行う必要があります。

すでにコマンドラインで定義されているため、コマンドラインでsudoを繰り返す必要はありません。

パラメータがAnsible 1.4にremote_userに名前が変更されましたuserAnsible Intro to Playbooksによるので、あなたはそれを変更する必要があり、あまりにも

remote_user: test_user 

ので、脚本はなります:

--- 
- name: Transfer and execute a script. 
    hosts: server 
    remote_user: test_user 
    sudo: yes 
    tasks: 
    - name: Transfer the script 
     copy: src=test.sh dest=/home/test_user mode=0777 

    - name: Execute the script 
     command: sh /home/test_user/test.sh 
+0

これはAnonymousのベストプラクティスではなく、正しい答えであり、copyとshell/commandを使う代わりにスクリプトモジュールを使うのが良いです。 –

+0

ファイル内で変数を変更する必要がある場合は、テンプレートとシェル/コマンドを使用できます。 EC2インスタンスのスクリプトモジュールにも問題がありました。このメソッドは私のために働いた – darkwing

+2

@ JonasLibbrechtスクリプトモジュールが便利かもしれないが、copy +コマンドはまだ分かりやすいオプションです。スクリプトモジュールのドキュメントでも、copy +コマンドがより優れている場合の例が示されています。「stdoutとstderrの結果キーを区別している場合は、スクリプトを使用する代わりにcopy +コマンドセットに切り替えてください。私がスクリプトの問題を発見した他のケースでは、Windowsホストスクリプトモジュールを持つVagrant上のLinuxを使用しているので、WindowsのGITからクローンされたWindowsエンドライン文字でpython/bashファイルを実行できません。 – kodstark

13

それはscriptモジュールを使用することをお勧めしますそのために:
http://docs.ansible.com/script_module.html

+1

理由を説明できますか? –

+4

コピーアクションとリモートホスト上のスクリプトを1つのスイングで組み合わせて実行します。 例外は、スクリプトがテンプレートファイルの場合です(プレイ中にAnatives変数を使用してスクリプトのプレースホルダを動的に埋め込むなど)。この場合、 'template'の後ろに' command sh ... 'が続きます –

+0

@ 343_Guilty_Spark上記の文に関しては、スクリプトはテンプレートファイルとして定義されている例を与えることができます – ambikanair

43

を使用できscriptモジュール

- name: Transfer and execute a script. 
    hosts: all 
    tasks: 

    - name: Copy and Execute the script 
     script: /home/user/userScript.sh 
+1

なぜこれを減らしたのですか?これは、シェルモジュールを使用する代わりに正しい答えにする必要があります。 –

+0

おそらく、サーバー上でスクリプトを実行するのではなく、ローカルスクリプトをコピーして実行するためですか? – Tobb

関連する問題