如何使用Ansible在远程服务器上执行shell脚本?

2skhul33  于 2022-11-16  发布在  Shell
关注(0)|答案(8)|浏览(487)

我计划使用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

当我运行行动手册时,传输成功,但脚本未执行。

mzsu5hc0

mzsu5hc01#

您可以使用脚本模块
范例

- name: Transfer and execute a script.
  hosts: all
  tasks:

     - name: Copy and Execute the script 
       script: /home/user/userScript.sh
5cnsuln7

5cnsuln72#

local_action在本地服务器上运行命令,而不是在hosts参数中指定的服务器上运行。
将“执行脚本”任务更改为

- name: Execute the script
  command: sh /home/test_user/test.sh

它应该做到这一点。
您不需要在命令行中重复sudo,因为您已经在行动手册中定义了它。
根据Ansible Intro to Playbooksuser参数在Ansible 1.4中被重命名为remote_user,因此您也应对其进行更改

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
omhiaaxx

omhiaaxx4#

因为有人想要一个特别的命令

ansible group_or_hostname -m script -a "/home/user/userScript.sh"

或使用相对路径

ansible group_or_hostname -m script -a "userScript.sh"
lvmkulzt

lvmkulzt5#

与所有其他的答案和评论相反,使用script模块有一些缺点,尤其是当你在远程主机(而不是本地主机)上运行它时。以下是ansible官方文档的片段:

**编写Ansible模块通常比推送脚本更可取。**将您的脚本转换为Ansible模块可获得奖励积分!

ssh连接插件将在执行脚本时通过-tt强制执行伪tty分配。伪tty没有stderr通道,所有stderr都发送到stdout。如果您依赖于单独的stdout和stderr结果关键字,请切换到任务的copy+命令集,而不是使用脚本。
如果本地脚本的路径包含空格,则需要用引号括起来。
Windows目标也支持此模块。
例如,使用script模块为localhost以外的任何主机运行此脚本,请注意脚本的stdoutstderr

#!/bin/bash

echo "Hello from the script"

nonoexistingcommand

echo "hello again"

你会得到像下面这样的东西;请注意,stdout合并了所有stderr。(理想情况下,line 6: nonoexistingcommand: command not found应该在stderr中)因此,如果您在脚本输出的stdout中搜索某个子字符串,可能会得到不正确的结果。注意:

ok: [192.168.122.83] => {
    "script_out": {
        "changed": true,
        "failed": false,
        "rc": 0,
        "stderr": "Shared connection to 192.168.122.83 closed.\r\n",
        "stderr_lines": [
            "Shared connection to 192.168.122.83 closed."
        ],
        "stdout": "Hello from the script\r\n/home/ps/.ansible/tmp/ansible-tmp-1660578527.4335434-35162-230921807808160/my_script.sh: line 6: nonoexistingcommand: command not found\r\nhello again\r\n",
        "stdout_lines": [
            "Hello from the script",
            "/home/ps/.ansible/tmp/ansible-tmp-1660578527.4335434-35162-230921807808160/my_script.sh: line 6: nonoexistingcommand: command not found",
            "hello again"
        ]
    }
}

文档不鼓励用户使用脚本模块;考虑将脚本转换为ansible模块;下面是我编写的一个simple post,它解释了如何将脚本转换为ansible模块。

mfuanj7w

mfuanj7w6#

由于未定义任何有关“脚本”的内容,意味着复杂性、内容、运行时、运行时环境、大小、要执行的任务等未知,因此可能会使用不推荐的方法,如“How to copy content provided in command prompt with special chars in a file using Ansible?

---
- hosts: test
  become: false
  gather_facts: false

  tasks:

  - name: Exec sh script on Remote Node
    shell:
      cmd: |
        date
        ps -ef | grep ssh
        echo "That's all folks"
    register: result

  - name: Show result
    debug:
      msg: "{{ result.stdout }}"

其仅是multi-line shell command(注解:...只是内联代码),并生成以下输出

TASK [Show result] ****************************************************
ok: [test.example.com] =>
  msg: |-
    Sat Sep 3 21:00:00 CEST 2022
    root        709      1  0 Aug11 ?        00:00:00 /usr/sbin/sshd -D
    root     123456    709 14 21:00 ?        00:00:00 sshd: user [priv]
    user     123456 123456  1 21:00 ?        00:00:00 sshd: user@pts/0
    root     123456 123456  0 21:00 pts/0    00:00:00 grep ssh
    That's all folks

我们可以添加更多的行、复杂性、必要的输出等。
因为script模块-传输后在远程节点上运行本地脚本-备注

  • 编写Ansible模块通常比推送脚本更可取。*

我还建议您熟悉编写自己的模块,正如在the answer of P....中已经提到的那样

ukdjmx9f

ukdjmx9f7#

如果脚本存在于本地机器上,则可以使用模板模块将其复制到远程机器上并执行。

- name: Copy script from local to remote machine
   hosts: remote_machine
   tasks:
    - name: Copy  script to remote_machine
      template: src=script.sh.2 dest=<remote_machine path>/script.sh mode=755
    - name: Execute script on remote_machine
      script: sh <remote_machine path>/script.sh
11dmarpk

11dmarpk8#

您可以在ansible上执行本地脚本,而不必将文件传输到远程服务器,方法如下:

ansible my_remote_server -m shell -a "`cat /localpath/to/script.sh`"

相关问题