Ansible,复制脚本,然后在远程机器上执行

3
我想将一个脚本复制到远程服务器并执行。我可以将它复制到目录/home/user/scripts,但当我运行ansible脚本时,它返回无法找到或访问'/home/user/scripts/servicios.sh'
完整的错误输出如下:
fatal: [192.168.1.142]: FAILED! => {"changed": false, "msg": "Could not find or access '/home/user/scripts/servicios.sh'"}

这是 Ansible 的剧本。
- 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 



2个回答

4
您无需创建目录并将脚本复制到目标(远程节点),脚本模块将为您完成这些操作。它需要脚本名称,后跟用空格分隔的参数列表。本地路径中的脚本将被传输到远程节点,然后执行。该脚本将通过远程节点上的shell环境进行处理。您之前遇到错误是因为脚本模块期望在Ansible控制器上(即您从其运行playbook的节点)找到路径/home/user/scripts/servicios.sh。要使其正常工作,您可以在脚本任务中指定正确的路径(/home/local/servicios.sh),而不是在远程节点上的/home/user/scripts/servicios.sh。因此,您可以像这样更改playbook:如果您想查看命令的结果,还可以将该命令的结果注册为变量。
---
- 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 模块。


毫无疑问,脚本模块更短且更不容易出错。 - RicHincapie
它将脚本复制到远程服务器的哪个目录?我们能否更改并从特定目录运行它? - undefined

1
脚本标签本身将脚本从本地机器传输到远程机器并在那里执行。
因此,脚本模块中指定的路径是本地机器而不是远程机器,即“/home/local/servicios.sh”而不是“/home/user/scripts/servicios.sh”。
由于您指定了应该在远程机器上的路径,因此ansible无法在给定路径上找到本地机器上的该脚本,导致出现给定错误。
因此,请按以下所示更新任务中的路径以获取本地路径。
- name: ejecutar script como sudo
  become: yes
  script: /home/local/servicios.sh

脚本不能在远程服务器上执行,应该通过本地机器执行到远程服务器。当您使用“script”标记时,脚本会被传输到远程机器,然后在那里执行。如果有一个你不想放在远程机器上,只想要执行的脚本,那么你可以使用 script 标记。如果你想要在远程机器上运行该脚本,那么你可以先将脚本复制到远程机器上,然后在那里执行。两种方法都是正确的,取决于哪种情况更适合您。

所以脚本不能在远程服务器内执行,而应该通过本地机器执行到远程服务器上? - Juan.
@thrash3d,根据您的查询,我已更新答案。 - Shubham Vaishnav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接