我想将脚本复制到远程服务器,然后执行它。我可以将其复制到目录/home/user/scripts
,但是当我运行ansible脚本时,它将返回Could not find or access '/home/user/scripts/servicios.sh'
完整的错误输出是:
fatal: [192.168.1.142]: FAILED! => {"changed": false, "msg": "Could not find or access '/home/user/scripts/servicios.sh'"}
这是有趣的剧本
- name: correr script
hosts: all
tasks:
- name: crear carpeta de scripts
file:
path: /home/user/scripts
state: directory
- name: copiar el script
copy:
src: /home/local/servicios.sh
dest: /home/user/scripts/servicios.sh
- name: ejecutar script como sudo
become: yes
script: /home/user/scripts/servicios.sh
答案 0 :(得分:1)
script标记本身会将脚本从本地计算机传输到远程计算机,并在那里执行。
因此,脚本模块中指定的路径是本地计算机的路径,而不是远程计算机的路径,即if('A' == 65)
而不是/home/local/servicios.sh
当您指定了应该在远程计算机上的路径时,ansible无法在给定路径的本地计算机上找到该脚本,从而导致给定错误。
因此,如下所示,将任务中的路径更新为本地路径,
/home/user/scripts/servicios.sh
因此脚本无法在远程服务器内部执行,因此应 通过本地计算机执行到远程吗?
@ thrash3d不,不是那样的。当您使用- name: ejecutar script como sudo
become: yes
script: /home/local/servicios.sh
标记时,脚本将传输到远程计算机,然后在该计算机上执行。如果有一个脚本不想放在远程计算机上,而只想执行它,则可以使用脚本标签。
如果要在远程计算机上使用该脚本,则可以先在远程计算机上复制脚本,然后在该计算机上执行。
两种方法都是正确的,哪种情况更适合您,这取决于您。
答案 1 :(得分:1)
您无需创建目录并将脚本复制到目标(远程节点),脚本模块即可为您完成。它采用脚本名称,后跟一个用空格分隔的参数列表。 path处的本地脚本将被传输到远程节点,然后执行。该脚本将通过远程节点上的Shell环境进行处理。您收到错误消息是因为脚本模块期望Ansible控制器(从其运行剧本的节点)上的路径/home/user/scripts/servicios.sh
。要使其正常工作,您可以在脚本任务中指定正确的路径(/home/local/servicios.sh
),而不是远程节点上的路径/home/user/scripts/servicios.sh
。因此,您可以像这样更改剧本:如果您愿意,也可以将该命令的结果注册为变量。
---
- name: correr script
hosts: all
become: yes
tasks:
- name: ejecutar script como sudo
script: /home/local/servicios.sh
register: console
- debug: msg="{{ console.stdout }}"
- debug: msg="{{ console.stderr }}"
如果不想使用脚本模块,而您有兴趣创建目录并将脚本明确复制到目标(远程节点)并运行它,该怎么办?不用担心,您仍然可以像这样使用命令模块:
---
- name: correr script
hosts: all
become: yes
tasks:
- name: crear carpeta de scripts
file:
path: /home/user/scripts
state: directory
- name: copiar el script
copy:
src: /home/local/servicios.sh
dest: /home/user/scripts/servicios.sh
- name: ejecutar script como sudo
command: bash /home/user/scripts/servicios.sh
register: console
- debug: msg="{{ console.stdout }}"
- debug: msg="{{ console.stderr }}"
但是我强烈建议您使用script
模块。