我计划使用Ansible剧本在远程服务器上执行shell脚本。
空白test.sh文件:
touch test.sh
行动手册:
---
- 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
当我运行行动手册时,传输成功,但脚本未执行。
8条答案
按热度按时间mzsu5hc01#
您可以使用脚本模块
范例
5cnsuln72#
local_action
在本地服务器上运行命令,而不是在hosts
参数中指定的服务器上运行。将“执行脚本”任务更改为
它应该做到这一点。
您不需要在命令行中重复sudo,因为您已经在行动手册中定义了它。
根据Ansible Intro to Playbooks,
user
参数在Ansible 1.4中被重命名为remote_user
,因此您也应对其进行更改因此,行动手册将变成:
ghg1uchk3#
最好使用
script
模块:http://docs.ansible.com/script_module.html
omhiaaxx4#
因为有人想要一个特别的命令
或使用相对路径
lvmkulzt5#
与所有其他的答案和评论相反,使用
script
模块有一些缺点,尤其是当你在远程主机(而不是本地主机)上运行它时。以下是ansible官方文档的片段:**编写Ansible模块通常比推送脚本更可取。**将您的脚本转换为Ansible模块可获得奖励积分!
ssh连接插件将在执行脚本时通过-tt强制执行伪tty分配。伪tty没有stderr通道,所有stderr都发送到stdout。如果您依赖于单独的stdout和stderr结果关键字,请切换到任务的copy+命令集,而不是使用脚本。
如果本地脚本的路径包含空格,则需要用引号括起来。
Windows目标也支持此模块。
例如,使用
script
模块为localhost以外的任何主机运行此脚本,请注意脚本的stdout
和stderr
。你会得到像下面这样的东西;请注意,
stdout
合并了所有stderr
。(理想情况下,line 6: nonoexistingcommand: command not found
应该在stderr
中)因此,如果您在脚本输出的stdout中搜索某个子字符串,可能会得到不正确的结果。注意:文档不鼓励用户使用脚本模块;考虑将脚本转换为ansible模块;下面是我编写的一个simple post,它解释了如何将脚本转换为ansible模块。
mfuanj7w6#
由于未定义任何有关“脚本”的内容,意味着复杂性、内容、运行时、运行时环境、大小、要执行的任务等未知,因此可能会使用不推荐的方法,如“How to copy content provided in command prompt with special chars in a file using Ansible?“
其仅是multi-line shell command(注解:...只是内联代码),并生成以下输出
我们可以添加更多的行、复杂性、必要的输出等。
因为
script
模块-传输后在远程节点上运行本地脚本-备注我还建议您熟悉编写自己的模块,正如在the answer of P....中已经提到的那样
ukdjmx9f7#
如果脚本存在于本地机器上,则可以使用模板模块将其复制到远程机器上并执行。
11dmarpk8#
您可以在ansible上执行本地脚本,而不必将文件传输到远程服务器,方法如下: