ansible实战应用系列教程4:执行ad hoc命令

执行ad hoc 临时命令

官网地址

Ad hoc临时命令是一种快速执行单个ansible task的方法,您不需要保存它以便以后再次运行。它们是简单的一行操作,不需要编写playbook就可以运行。

它们对于快速测试和更改非常有用。例如,您可以使用一个ad hoc命令来确保在一组服务器上的/etc/hosts文件中存在某个行。您可以使用另一个工具在许多不同的机器上有效地重新启动服务,或者确保某个特定软件包是最新的。您还可以使用它在一台或多台主机上运行任意命令,以运行程序或收集信息。

Ad hoc命令是一个非常有用的工具来快速执行简单的task。它们确实有自己的局限性,通常你会想要使用一个ansible playbook来实现的全部操作。然而,在许多情况下,ad hoc命令正是您需要的快速完成简单task的工具。

Running Ad Hoc Commands

使用ansible命令运行临时命令

ansible host-pattern -m module [-a ‘module arguments’][-i inventory]

host-pattern参数用于指定应该在其上运行临时命令的托管主机。它可以是inventory中的特定托管主机或主机组。您已经看到它与–list-hosts选项一起使用,该选项显示特定host-pattern的主机。

host-pattern是inventory中定义的主机或主机组,可以为ip、hostname、inventory中的group组名、具有“.”或“*”或“:”等特殊字符的匹配型字符串,host-pattern是必须项,不可忽略。

-i选项来指定一个不同的inventory位置,而不是当前Ansible配置文件中的默认位置。

-m选项以模块的名称作为参数,模块的名称应该在目标主机上运行。模块是执行来实现你的task的小程序。有些模块不需要额外的信息,但其他模块需要额外的参数来指定它们的操作细节。

-a选项代表这些模块参数。

最简单的ad hoc临时命令之一使用ping模块。这个模块不执行ICMP ping,但是检查基于python的模块是否可以在托管主机上运行。例如,下面的ad hoc临时命令确定目录中的所有托管主机是否可以运行标准模块:

[student@workstation dep-manage]$ ansible-m ping all
localhost | SUCCESS => {
   "changed": false, 
   "ping": "pong"
}

servera.lab.example.com | SUCCESS => {
   "changed": false, 
   "ping": "pong"
}

Performing Tasks with Modules in Ad Hoc Commands

modules模块是临时命令用来完成任务的工具。Ansible提供了数百个模块,做不同的事情。您通常可以找到一个经过测试的、特殊用途的模块,它可以作为标准安装的一部分完成您需要的工作。

ansible-doc -l命令列出了系统上安装的所有模块。然后,您可以使用ansible-doc按名称查看特定模块的文档,并找到关于模块采用哪些参数作为选项的信息。例如,下面的命令显示了ping模块的文档,它没有选项:

[student@taijitao-server ansible-dev]$ ansible-doc ping
> ANSIBLE.BUILTIN.PING    (/usr/lib/python3.9/site-packages/ansible/modules/ping.py)

        A trivial test module, this module always returns `pong' on successful contact. It does not make sense in playbooks, but it is useful from
        `/usr/bin/ansible' to verify the ability to login and that a usable Python is configured. This is NOT ICMP ping, this is just a trivial test
        module that requires Python on the remote-node. For Windows targets, use the [ansible.windows.win_ping] module instead. For Network targets, use
        the [ansible.netcommon.net_ping] module instead.

ADDED IN: historical

OPTIONS (= is mandatory):

- data
        Data to return for the `ping' return value.
        If this parameter is set to `crash', the module will cause an exception.
        [Default: pong]
        type: str


ATTRIBUTES:

        check_mode:
          description: Can run in check_mode and return changed status prediction without
            modifying target
          support: full
        diff_mode:
          description: Will return details on what has changed (or possibly needs changing
            in check_mode), when in diff mode
          support: none
        platform:
          description: Target OS/families that can be operated against
          platforms: posix
          support: N/A

大多数模块都带有参数。模块可用的参数列表可以在模块的文档中找到。Ad hoc令使用-a选项将参数传递给模块。当不需要参数时,从ad hoc命令中省略-a选项。如果需要指定多个参数,则以带引号的空格分隔列表的形式提供它们。

例如,下面的临时命令使用user模块确保新用户存在,并在taijitao-node2.example.com上拥有4000的UID:

[student@taijitao-server ansible-dev]$ sudo ansible -m user -a 'name=newbie uid=4000 state=present' node2 -b
node2 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": true,
    "comment": "",
    "create_home": true,
    "group": 4000,
    "home": "/home/newbie",
    "name": "newbie",
    "shell": "/bin/bash",
    "state": "present",
    "system": false,
    "uid": 4000
}
[student@taijitao-server ansible-dev]$ sudo ansible -m shell -a 'id newbie' node2
node2 | CHANGED | rc=0 >>
uid=4000(newbie) gid=4000(newbie)=4000(newbie)

大多数模块都是幂等的,这意味着它们可以安全运行多次,如果系统已经处于正确的状态,它们将不做任何事情。例如,我们可以再次运行前面的ad hoc命令,我们应该看到它没有任何变化:

Running Commands with the command Module

command模块允许管理员在托管主机的命令行上执行任意命令。使用-a选项将要执行的命令指定为模块的参数。例如,下面的命令在mymanagedhosts主机模式引用的托管主机上执行hostname命令。

[student@taijitao-server ansible-dev]$ ansible all -m command -a '/usr/bin/hostname'
node1 | CHANGED | rc=0 >>
taijitao-node1.example.com
node2 | CHANGED | rc=0 >>
taijitao-node2.example.com

前面的临时命令示例为每个托管主机返回两行输出。第一行是状态报告,它显示执行临时操作的托管主机的名称以及操作的结果。第二行是使用Ansible命令模块远程执行的命令的输出。

为了更好地可读性和对临时命令输出的解析,管理员可能会发现,为托管主机上执行的每个操作提供一行输出是很有用的。您可以使用-o选项以单行格式显示可执行的临时命令的输出。

[student@taijitao-server ansible-dev]$ ansible all -m command -a '/usr/bin/hostname' -o
node1 | CHANGED | rc=0 | (stdout) taijitao-node1.example.com
node2 | CHANGED | rc=0 | (stdout) taijitao-node2.example.com

command模块允许管理员在托管主机上快速执行远程命令。shell在托管主机上不处理这些命令。因此,它们不能访问shell环境变量或执行shell操作,如重定向和管道。

对于命令需要shell处理的情况,管理员可以使用shell模块。与command模块一样,您可以将要执行的command作为参数传递给ad hoc命令中的模块。Ansible然后在托管主机上远程执行命令。与command模块不同,command是通过托管主机上的shell进行处理的。因此,shell环境变量是可访问的,shell操作,如重定向和管道也可以使用。

下面的示例说明了command模块和shell模块之间的区别。如果尝试使用这两个模块执行内置Bash命令集,则只有使用shell模块时才会成功。

[student@taijitao-server ansible-dev]$  ansible localhost -m command -a set
localhost | FAILED | rc=2 >>
[Errno 2] 没有那个文件或目录: b'set'
[student@taijitao-server ansible-dev]$  ansible localhost -m shell -a set
localhost | CHANGED | rc=0 >>
BASH=/bin/sh
BASHOPTS=cmdhist:complete_fullquote:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_EXECUTION_STRING=set
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="4" [2]="20" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.4.20(1)-release'
DEBUGINFOD_URLS='https://debuginfod.centos.org/ '
DIRSTACK=()
. . . output omitted.

command和shell都需要在托管主机上安装一个工作的Python。第三个模块raw可以绕过模块子系统,直接在远程shell上运行命令。这在管理不能安装Python的系统(例如,网络路由器)时非常有用。它也可以用来在还没有Python的主机上安装Python。

配置ad hoc临时命令连接

托管主机连接和特权升级的设置可以在可配置Ansible configuration file中配置,还可以使用临时命令中的选项定义它们。当使用临时命令中的选项定义时,设置优先于可执行配置文件中配置的那些设置。下表显示了每个配置文件设置的类似命令行选项。

在这里插入图片描述

在使用命令行选项配置这些设置之前,可以通过咨询ansible --help的输出来确定它们当前定义的值。

[student@taijitao-server ansible-dev]$ ansible --help |grep become
usage: ansible [-h] [--version] [-v] [-b] [--become-method BECOME_METHOD]
               [--become-user BECOME_USER]
               [-K | --become-password-file BECOME_PASSWORD_FILE]
  --become-password-file BECOME_PASSWORD_FILE, --become-pass-file BECOME_PASSWORD_FILE
  -K, --ask-become-pass
  control how and which user you become as on target hosts
  --become-method BECOME_METHOD
                        `ansible-doc -t become -l` to list valid choices.
  --become-user BECOME_USER
  -b, --become          run operations with become (does not imply password

ansible远程执行命令模块

​ Ansible可以执行远程命令的模块有三个:command、shell、raw。应尽量避免使用这三个模块来执行命令,因为其他模块大部分都是幂等性的,可以自动进行更改跟踪。command、shell、raw不具备幂等性。

command、shell模块:

要求受管主机上安装Python。command可以在受管主机上执行shell命令,但是不支持环境变量和操作符(例如 ‘|’, ‘<’, ‘>’, ‘&’),shell模块调用的/bin/sh指令执行。

raw模块:

不需要受管主机上安装Python,直接使用远程shell运行命令,通常用于无法安装Python的系统(例如网络设备等)。
• command、shell、raw 和 script 这四个模块的作用和用法都类似,都用于远程执行命令或脚本:
• command 模块:执行简单的远程 shell 命令,但不支持解析特殊符号 < > | ; & 等,比如需要重定向时不能使用 command 模块,而应该使用shell模块。但command 模块更安全,因为他不受用户环境的影响, 也很大的避免了潜在的 shell 注入风险
• shell 模块:和command相同,但是支持解析特殊 shell 符号,但这样有潜在的 shell 注入风险
• raw 模块:执行底层 shell 命令。command 和 shell 模块都是通过目标主机上的 python 代码启动 /bin/bash 来执行命令的,但目标主机上可能没有安装 python,这时只能使用 raw 模块在远程主机上直接启动
• script 模块:在远程主机上执行脚本文件 ,和 raw 模块一样,不要求目标主机上已经装好 python

command模块 可以执行which能看到的命令
shell模块 可以执行shell内建的命令以及command模块可以执行的命令。
raw(执行裸命令) 用于管理网络设备,不需要Python环境的支持。shell和command模块都需要Python模块支持。
关于ansbile工具的shell、command、script、raw模块的区别和使用场景:

1、command模块 [执行远程命令]
[root@node1 ansible]# ansible testservers -m command -a 'uname -n'
2、script模块 [在远程主机执行主控端的shell/python脚本 ]  (使用相对路径)
[root@node1 ansible]# ansible testservers -m script -a '/etc/ansible/test.sh
3、shell模块 [执行远程主机的shell/python脚本]
[root@node1 ansible]# ansible testservers -m shell -a 'bash /root/test.sh'
4、raw模块 [类似于command模块、支持管道传递]
[root@node1 ansible]# ansible testservers -m raw -a "ifconfig eth0 |sed -n 2p |awk '{print \$2}' |awk -F: '{print \$2}'"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太极淘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值