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

时间:2019-09-05 17:54:42

标签: bash ansible

我想将脚本复制到远程服务器,然后执行它。我可以将其复制到目录/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 



2 个答案:

答案 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模块。

相关问题