Ansible Ad-hoc命令执行模块实战教程

 更新时间:2024年02月26日 09:25:43   作者:FuShudi  
Ad-hoc是Ansible下临时执行的一条命令,对于复杂的命令会使用playbook。Ad-hoc的执行依赖于模块,ansible官方提供了大量的模块,这篇文章主要介绍了Ansible Ad-hoc命令执行模块 ,需要的朋友可以参考下

Ad-hoc

Ad-hoc简介

  • Ad-hoc是Ansible下临时执行的一条命令,对于复杂的命令会使用playbook。Ad-hoc的执行依赖于模块,ansible官方提供了大量的模块。如command,file,copy,shell等
  • 帮助查询
    • ansible-doc -l 列出所有模块
    • ansible-doc -s module 查看某个模块的参数
    • ansible-doc module 查看某个模块更详细的信息

Ad-hoc命令说明

  • 命令说明
    ansible 主机或组 -m 模块名 -a '模块参数' ansible参数
    • 主机和组:就是你要在哪些主机上执行这个命令,必须是配置文件里面定义好的
    • 模块名:可以通过ansibel-doc -l查看目前安装的模块,然后过滤出你想要的,默认不指定时,使用的时command模块,可以在配置文件里面找到 "module_name = command"改掉这个
    • 模块参数:可以通过ansible-doc 来查看模块需要使用哪些参数,以及具体用法
    • ansible参数:可以通过ansible 的帮助查到,有很多参数可以使用,比如是否提权,是否输入密码等等

Ad-hoc示例

[devops@node1 ansible]$ ansible node1 -m shell -a 'whoami'
node1 | CHANGED | rc=0 >>
root
# 使用ad-hoc创建一个目录
[devops@node1 ansible]$ ansible node1 -m shell -a 'mkdir /ansibel'
[WARNING]: Consider using the file module with state=directory rather than running 'mkdir'.  If you
need to use command because file is insufficient you can add 'warn: false' to this command task or
set 'command_warnings=False' in ansible.cfg to get rid of this message.
node1 | CHANGED | rc=0 >>

这里我们可以看到,使用shell模块创建一个目录的时候他有一个警告,大概就是说让我们考虑使用file模块去创建目录,但是这个是警告,并不是报错,这个目录也是被创建出来了

[devops@node1 ansible]$ sudo ls /ansibel -d
/ansibel

这就是一些简单的使用案例

命令执行模块

1. command模块

该模块通过-a跟上要执行的命令可以直接执行,不过命令里面不能带一些符号(|,>,<,&),否则会不成功。

# 正常的
[devops@node1 ansible]$ ansible all -m command -a 'whoami'
node1 | CHANGED | rc=0 >>
root
node2 | CHANGED | rc=0 >>
root
# 错误的
[devops@node1 ansible]$ ansible all -m command -a 'whoami > /opt/who.txt'
node2 | FAILED | rc=1 >>
whoami: extra operand ‘>'
Try 'whoami --help' for more information.non-zero return code
node1 | FAILED | rc=1 >>
whoami: extra operand ‘>'
Try 'whoami --help' for more information.non-zero return code

看到了吧,我想把输出内容重定向到某个文件内他是会报错的,那我们如果有这种需求改怎么做呢?来看下一个模块

2. shell模块

shell模块的用法基本和command一样,不过他是通过/bin/sh执行,所以shell模块可以执行任何命令,报错刚刚command不能执行的重定向操作

# 不带重定向
[devops@node1 ansible]$ ansible node1 -m shell -a 'whoami'
node1 | CHANGED | rc=0 >>
root
# 带重定向
[devops@node1 ansible]$ ansible node1 -m shell -a 'whoami > /opt/who.txt'
node1 | CHANGED | rc=0 >>
# 查看文件内容
[devops@node1 ansible]$ cat /opt/who.txt 
root

这个模块确实是可以执行一些command执行不了的操作,shell模块还有一些选项

  • chdir: 在执行命令前,先切换到指定的目录,默认工作目录是用户的home目录
  • creates:一个文件名,当该文件存在,那么命令就不会执行
  • removes:一个文件名,当该文件不存在,那么命令不会执行
    后面这两个可能有点难以理解,我们通过实验来看看
    creates实验:
# 我们刚刚不是在node1上创建了一个/opt/who.txt吗?node2上是没有的,那么我们选择就来指定这个文件
[devops@node1 ansible]$ ansible all -m shell -a 'creates=/opt/who.txt whoami'
node1 | SUCCESS | rc=0 >>
skipped, since /opt/who.txt exists
node2 | CHANGED | rc=0 >>
root

看到了吧,node1上有这个文件,那么它是没有去执行的,他直接跳过了,但是node2上没有这个文件,那么它执行了whoami这个命令

removes实验:

[devops@node1 ansible]$ ansible all -m shell -a 'removes=/opt/who.txt whoami'
node1 | CHANGED | rc=0 >>
root
node2 | SUCCESS | rc=0 >>
skipped, since /opt/who.txt does not exist

通过这2个实验应该能理解这俩选项的作用了吧

3. raw模块

这个模块的用法和shell是一样的,不同点在于它没有chdir,creates和removes选项,其他都是一样一样的

4. script模块

这个模块就比较有意思了,他是将你主控端的脚本直接在被控端上执行,注意,他并不会将这个文件传过去

[devops@node1 ansible]$ cat test.sh 
#!/bin/bash
ifconfig |grep netmask | awk -F" " '{print $2}'

注意看这个脚本,是在node1上的,也就是主控端,我们来使用过scripts模块来执行一下这个脚本,看看它是不是没有将文件传过去

[devops@node1 ansible]$ ansible all -m script -a 'test.sh'
node2 | CHANGED => {
    "changed": true,
    "rc": 0,
    "stderr": "Shared connection to node2 closed.\r\n",
    "stderr_lines": [
        "Shared connection to node2 closed."
    ],
    "stdout": "/home/devops/.ansible/tmp/ansible-tmp-1708832697.440758-6677-176602102106477/test.sh: line 2: ifconfig: command not found\r\n",
    "stdout_lines": [
        "/home/devops/.ansible/tmp/ansible-tmp-1708832697.440758-6677-176602102106477/test.sh: line 2: ifconfig: command not found"
    ]
}
node1 | CHANGED => {
    "changed": true,
    "rc": 0,
    "stderr": "Shared connection to node1 closed.\r\n",
    "stderr_lines": [
        "Shared connection to node1 closed."
    ],
    "stdout": "192.168.100.210\r\n192.168.200.131\r\n127.0.0.1\r\n192.168.122.1\r\n",
    "stdout_lines": [
        "192.168.100.210",
        "192.168.200.131",
        "127.0.0.1",
        "192.168.122.1"
    ]
}

这里可以看到,他执行成功了,返回的是主机上所有的IP地址,然后我们去node2上看看这个文件是否不存在,不在node1上看是因为这个文件本来就是node1上写的,因为node1就是主控节点,它同时也是被控

[devops@node1 ansible]$ ansible node2 -m shell -a 'find / -name test.sh'
node2 | CHANGED | rc=0 >>

我们可以看到,使用find去查到这个文件名他没有任何的输出,那么就是没有找到,也就是没有这个文件

到此这篇关于Ansible Ad-hoc命令执行模块的文章就介绍到这了,更多相关Ansible Ad-hoc模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Linux shell select菜单选择实现代码

    Linux shell select菜单选择实现代码

    主要介绍了Bash Shell中的select命令简单使用示例,通常用于流程控制功能的实现,需要的朋友可以参考下
    2021-07-07
  • Linux下实现SNMP一键安装的Shell脚本

    Linux下实现SNMP一键安装的Shell脚本

    这篇文章主要介绍了Linux下实现SNMP一键安装的Shell脚本,非常实用,需要的朋友可以参考下
    2014-07-07
  • Bash Shell中单引号和双引号的区别小结

    Bash Shell中单引号和双引号的区别小结

    在Bash中,单引号和双引号都能定义字符串,但它们处理变量扩展、特殊字符的方式不同,本文就来介绍一下Bash Shell中单引号和双引号的区别小结,感兴趣的可以了解一下
    2024-11-11
  • Shell脚本调试 -n -v -x -c的具体用法

    Shell脚本调试 -n -v -x -c的具体用法

    本文主要介绍了Shell脚本调试 -n -v -x -c的具体用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Bash Shell字符串操作小结

    Bash Shell字符串操作小结

    这篇文章主要介绍了Bash Shell字符串操作总结,包含取长度、截取、查找位置、替换等等,需要的朋友可以参考下
    2014-05-05
  • Linux shell常用的73条命令总结

    Linux shell常用的73条命令总结

    对于经常使用linux系统的朋友们来说,基本常用的shell命令是少不了的,下面这篇文中就为大家总结了Linux shell的常用命令,有需要的朋友们可以参考借鉴,下面来一起学习学习吧。
    2017-01-01
  • 详解Linux中atime,mtime,ctime的使用场景

    详解Linux中atime,mtime,ctime的使用场景

    这篇文章主要介绍了Linux的三个时间atime,mtime,ctime详细说明与使用场景,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-10-10
  • linux中systemctl详细理解及常用命令解析

    linux中systemctl详细理解及常用命令解析

    systemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动,本文给大家介绍linux中systemctl详细理解及常用命令,感兴趣的朋友一起看看吧
    2025-04-04
  • 实现shell终端代码分享(可用户登录 实现系统命令)

    实现shell终端代码分享(可用户登录 实现系统命令)

    实现shell终端代码分享,实现用户登录,系统命令使用,大家参考实现吧
    2013-12-12
  • Shell中echo如何输出颜色字体

    Shell中echo如何输出颜色字体

    在CentOS/Redhat系统中,可以使用`echo -e`结合ANSI转义码来输出彩色文本,基本格式是`echo -e "\033[样式;前景色;背景色m文本\033[0m"`,常用颜色码包括31(红色)、32(绿色)等,建议定义变量简化代码,并注意终端兼容性和非交互式环境
    2026-03-03

最新评论