ansible的常用ad-hoc命令

本文深入解析了Ansible ad-hoc命令的使用方法,包括shell、command、service、script、setup、yum、cron、file、copy、synchronize、get_url、unarchive、wait_for和authorized_key模块的参数与功能。这些模块覆盖了远程主机的文件管理、服务控制、定时任务、软件安装、文件同步、URL下载和权限管理等多个方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ad-hoc常用命令

下面列出了很多模块.但实际在ad-hoc命令中用的最多的是shell或command模块,这两个模块,可以替代我们完成绝大多数的需求,其余模块更多的是在ansible-playbook中编写使用,来进行较为复杂的操作,作为参考使用,ansbile的模块有许多,同时也可以自己编写一些模块,这里只列出会用到的一些模块及模块参数,其余模块请参考ansible官方手册

anisble的shell界面命令语法:ansible host(主机/主机组/嵌套主机) -m module -a ‘args’.

  • ping模块:用于测试远程主机是否可以进行远程连接控制
[root@ansible ansible]# ansible test -m ping
192.168.31.106 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
  • command和shell模块:command不能解析变量(如$HOME)和某些操作符("<", “>”, “|”, “;“以及”&”),可以使用shell模块来代. shell模块执行命令的方式是在远程使用/bin/sh来执行的,如/bin/sh ping

chdir # 在执行命令前,先cd到指定的目录下
creates # 用于判断命令是否要执行。如果指定的文件(可以使用通配符)存在,则不执行。
removes # 用于判断命令是否要执行。如果指定的文件(可以使用通配符)不存在,则不执行

[root@ansible ansible]# ansible slave -m  command -a 'cat /etc/hostname'
192.168.31.106 | CHANGED | rc=0 >>
slave
#默认使用command模块,所以可以不用指定
[root@ansible ansible]# ansible slave -a 'cat /etc/hostname'
192.168.31.106 | CHANGED | rc=0 >>
slave

  • service 模块:服务管理

enabled:可选参数,yes/no,表示是否开机自启,不使用该参数为no name:服务名,必选参数 state:
对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)
sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟

#启动被控主机的httpd服务
[root@ansible ansible]# ansible slave -m service -a 'name=httpd state=started'
  • script模块:将本地脚本发送到远程主机上执行

chdir # 在远程执行脚本前先切换到此目录下。
creates # 当此文件存在时,不执行脚本。可用于实现幂等性。
removes # 当此文件不存在时,不执行脚本。可用于实现幂等性。
free_form= # 本地待执行的脚本路径、选项、参数。之所以称为free_form,是因为它是脚本名+选项+参数。

#将ansible端/opt/test.sh发送到各被控节点上执行,但如果被控节点的/test下有hello.txt,则不执行
[root@ansible opt]# ansible slave -m script -a 'chdir=/test creates=/test/hello.txt /opt/test.sh hello  '
192.168.31.106 | SKIPPED

  • setup模块:获取远程主机信息
  • filter:过滤获取的信息
获取远程主机所有信息
[root@ansible ansible]# ansible slave -m setup

使用filter获取远程主机内存信息和ip
[root@ansible ansible]# ansible slave -m setup -a 'filter=ansible_memory_mb'
[root@ansible ansible]# ansible slave -m setup -a 'filter=ansible_default_ipv4' 
  • yum模块:yum安装模块
  • name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径
    • state:状态仅有卸载选择,三个选项都是卸载(present,absent,latest)
[root@ansible ansible]# ansible slave -m yum -a 'name=lrzsz'
  • cron模块:定时任务模块

backup:对远程主机上的原任务计划内容修改之前做备份
cron_file:如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划
day:日(1-31,/2,……)
hour:小时(0-23,/2,……)
minute:分钟(0-59,/2,……)
month:月(1-12,/2,……)
weekday:周(0-7,*,……)
job:要执行的任务,依赖于state=present
name:该任务的描述
special_time:指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourl
state:确认该任务计划是创建还是删除
user:以哪个用户的身份执行

每小时的1分和42分重启一次httpd
[root@ansible facts]# ansible slave -m cron -a 'name="restart httpd" minute="1,42" job="systemctl restart httpd"'
192.168.31.106 | CHANGED => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "restart httpd"
    ]
}

删除stop httpd定时任务
[root@ansible facts]# ansible slave -m cron -a 'name="restart httpd" state=absent '
192.168.31.106 | CHANGED => {
    "changed": true, 
    "envs": [], 
    "jobs": []
}
  • file模块:文件操作模块

force:需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group:定义文件/目录的属组
mode:定义文件/目录的权限
owner:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归的设置文件的属性,只对目录有效
src:要被链接的源文件的路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state: directory:如果目录不存在,创建目录
- file:即使文件不存在,也不会被创建
- link:创建软链接
- hard:创建硬链接
- touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
- absent:删除目录、文件或者取消链接文件

#在根目录下创建test目录
[root@ansible ~]# ansible slave -m file -a 'path=/test state=directory'
192.168.31.106 | CHANGED => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/test", 
    "size": 6, 
    "state": "directory", 
    "uid": 0
}

#在test目录下创建1.txt文件
[root@ansible ~]# ansible slave -m file -a 'path=/test/1.txt state=touch'
192.168.31.106 | CHANGED => {
    "changed": true, 
    "dest": "/test/1.txt", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "size": 0, 
    "state": "file", 
    "uid": 0
}

#软连接/etc/pass到test目录下
[root@ansible ~]# ansible slave -m file -a 'src=/etc/passwd state=link dest=/test/passwd'
192.168.31.106 | CHANGED => {
    "changed": true, 
    "dest": "/test/passwd", 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "size": 11, 
    "src": "/etc/passwd", 
    "state": "link", 
    "uid": 0
}

  • copy模块:将本地文件复制到远程主机

backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no
content:用于替代"src",可以直接设定指定文件的值
dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
directory_mode:递归的设定目录的权限,默认为系统默认权限
force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
others:所有的file模块里的选项都可以在这里使用
src:要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/“来结尾,则只复制目录里的内容,如果没有使用”/"来结尾,则包含目录在内的整个内容全部复制,类似于rsync

#将本地的opt目录下的文件复制到远程主机的test目录下,复制前进行本地备份,如果远程主机文件存在进行强制覆盖
[root@ansible opt]# ls
1.txt  2.txt  3.txt  test.sh

[root@ansible opt]# ansible slave -m copy -a 'src=/opt/ dest=/test/ backup=yes force=no'
192.168.31.106 | CHANGED => {
    "changed": true, 
    "dest": "/test/", 
    "src": "/opt/"
}
  • synchronize模块:同步模块模块,需要安装rsync

src:源文件路径
dest:目标路径
mode:默认为push,可选push或pull,push将本地文件推送到远程主机,pull将远程主机文件拉取到本地
delete:是否同步内容文件(如果远程主机文件和本地推送目录的文件不同,会删除掉不同的文件,保持远程主机和本地目录文件相同)

#同步本机opt目录下的所有文件到远程主机test目录,并保持一致
[root@ansible opt]# ansible slave -m synchronize -a 'src=/opt/ dest=/test/ delete=yes'
192.168.31.106 | CHANGED => {
    "changed": true, 
    "cmd": "/usr/bin/rsync --delay-updates -F --compress --delete-after --archive --rsh=/usr/bin/ssh -S none -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null --out-format=<<C
HANGED>>%i %n%L /opt/ root@192.168.31.106:/test/",     "msg": ".d..t...... ./\n*deleting   delete.txt\n", 
    "rc": 0, 
    "stdout_lines": [
        ".d..t...... ./", 
        "*deleting   delete.txt"
    ]
}

#拉取远程主机的hosts文件到opt目录下
[root@ansible opt]# ansible slave -m synchronize -a 'src=/etc/hosts dest=/opt/ mode=pull'
192.168.31.106 | CHANGED => {
    "changed": true, 
    "cmd": "/usr/bin/rsync --delay-updates -F --compress --archive --rsh=/usr/bin/ssh -S none -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null --out-format=<<CHANGED>>%i %n%L
 root@192.168.31.106:/etc/hosts /opt/",     "msg": ">f+++++++++ hosts\n", 
    "rc": 0, 
    "stdout_lines": [
        ">f+++++++++ hosts"
    ]
}

  • get_url模块:用于从http,https.ftp等通过url下载模块

url:必选项,url路径
dest:下载存放路径
timeout:下载超时时间

#下载jenkins源码包
[root@ansible opt]# ansible slave -m get_url -a 'url=http://mirrors.jenkins.io/war/latest/jenkins.war dest=/test  timeout=30'
192.168.31.106 | CHANGED => {
    "changed": true, 
    "checksum_dest": null, 
    "checksum_src": "84808b91ce08dc4087e95e08fbffc021d4230b96", 
    "dest": "/test/jenkins.war", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "4b8296a7f8e6db12ea07bce9e75dc3a7", 
    "mode": "0644", 
    "msg": "OK (76002068 bytes)", 
    "owner": "root", 
    "size": 76002068, 
    "src": "/root/.ansible/tmp/ansible-tmp-1547532648.8-223259639386748/tmpgZoUF1", 
    "state": "file", 
    "status_code": 200, 
    "uid": 0, 
    "url": "http://mirrors.jenkins.io/war/latest/jenkins.war"
}

unarchive模块:解压缩模块,将本地压缩包,解压到远程主机指定目录,如果已经存在则不解压缩

dest:远程主机上的一个路径,即文件解压的路径,目录必须存在
src: 压缩文件路径
remote_src:远端是否已经存在,默认false

# 复制ansible端的foo.tgz文件到远端并解包
- unarchive:
    src: foo.tgz
    dest: /var/lib/foo

# 直接解包远端已经存在的文件- unarchive:
    src: /tmp/foo.zip
    dest: /usr/local/bin
    remote_src: True

# 从url上下载压缩包,然后进行解压
- unarchive:
    src: https://example.com/example.zip
    dest: /usr/local/bin
    remote_src: True

wait_for模块:等待执行模块,由上个任务完成后并达到预期的值,然后进行下一步操作,通常用于检测端口是否存活,文件是否存在,或文件中的字符串

delay # 在检查操作进行之前等待的秒数
host # 等待这个主机处于启动状态,默认为127.0.0.1
port # 等待这个端口已经开放
path # 这个文件是否已经存在
search_regex # 在文件中进行正则匹配
state # present/started/stopped/absent/drained.默认started
当检查的是一个端口时:
started:保证端口是开放的
stopped:保证端口是关闭的
当检查的是一个文件时:
present/started:在检查到文件存在才会继续
absent:检查到文件被移除后才会继续
sleep # 两次检查之间sleep的秒数,默认1秒
timeout # 检查的等待超时时间(秒数,默认300)

      [root@ansible opt]# ansible slave -m wait_for -a 'timeout=10 port=80 delay=10'
192.168.31.106 | FAILED! => {
    "changed": false, 
    "elapsed": 10, 
    "msg": "Timeout when waiting for 127.0.0.1:80"
}
[root@ansible opt]# ansible slave -m wait_for -a 'timeout=5 port=80 delay=3'
192.168.31.106 | SUCCESS => {
    "changed": false, 
    "elapsed": 3, 
    "path": null, 
    "port": 80, 
    "search_regex": null, 
    "state": "started"
}

authorized_key模块:指定公钥文件,进行分发

key= # 公钥路径,可以是本地文件,可以是url地址。
# 本地文件时使用{{ lookup(‘file’, ‘~/.ssh/id_rsa.pub’) }},
# url使用https://github.com/username.keys。
manage_dir # 是否创建或修改目标authorized_keys所在目录的所有者和权限。默认为yes。
# 使用自定义的目标路径时,必须设置为no或false
path # authorized_keys所在的目录,默认为家目录下的.ssh目录中
state # present/absent,是否将密钥添加到目标authorized_keys文件中。
user= # 添加到远程哪个用户下的authorized_keys文件

#将本地的公钥传输到远程主机root用户的家目录下,-k表示输入远程密码
[root@ansible opt]# ansible slave -m authorized_key -a "key={{lookup('file','~/.ssh/id_rsa.pub')}} state=present user=root"  -k
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值