2014-01-16 355 views
20

我打算在使用Ansible playbook的遠程服務器上執行一個shell腳本。如何使用Ansible在遠程服務器上執行shell腳本?

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 Intro to Playbooksuser參數更名爲remote_user在Ansible 1.4,所以你應該改變它,太

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

這是迄今爲止Ansible中的正確答案,而不是最佳實踐,更好地使用腳本模塊而不是使用副本和shell /命令。 –

+0

如果您需要在文件中更改變量,則可以使用模板和shell /命令。 EC2實例上的腳本模塊也有問題。這種方法對我很有用 – darkwing

+2

@JonasLibbrecht腳本模塊可能很有用,但copy +命令仍然是明智的選擇。甚至當腳本模塊的文檔給出的例子中,當copy +命令更好時「如果您依賴於分離的stdout和stderr結果鍵,請切換到複製+命令集而不是腳本。」其他我發現腳本問題的情況是使用具有Windows主機的Vagrant上的Linux腳本模塊無法在Windows上從GIT克隆的Windows終結行字符執行python/bash文件。 – kodstark

13

這是更好地使用script模塊爲此:
http://docs.ansible.com/script_module.html

+1

你能解釋爲什麼嗎? –

+4

它將複製操作和在遠程主機上運行腳本結合在一起。 這是一個例外,如果腳本是一個模板文件(例如,在劇本中使用Ansible變量動態填充腳本中的佔位符的地方)。在這種情況下,你可以使用'template'然後命令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

爲什麼這是低調的,這應該是正確的答案,而不是使用shell模塊。 –

+0

也許是因爲它用於複製和運行本地腳本,而不是僅僅在服務器上運行腳本? – Tobb

相關問題