ansible ad-hoc常用模块
ansible ad-hoc常用模块
Ansible ad-hoc是一种通过命令行批量管理的方式
格式:
ansible 主机集合 -m 模块名 -a "参数”
#查看语法
#ansible -h
Usage: ansible <host-pattern> [options]
常用的选项有:
-k 登录密码,提示输入SSH密码而不是假设基于密钥的验证
-C --check只是测试一下会改变什么内容,不会真正去执行;相反,试图预测一些可能发生的变化
-f FORKS, --forks=FORKS 并行任务数。NUM被指定为一个整数,默认是5
-l SUBSET, --limit=SUBSET 进一步限制所选主机/组模式 --limit=192.168.32.135 只对这个ip执行
-m MODULE_NAME, --module-name=MODULE_NAME 执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数
......
使用ansible-doc查看模块帮助文档
# ansible-doc -h
Usage: ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]
-j 以json格式显示所有模块信息
-l 列出所有的模块
-s 查看模块常用参数
# 直接跟模块名,显示模块所有信息(命令行中的用法)
# -s 后跟模块,显示playbook中文档信息(模块在playbook的用法)
多使用ansible-doc查看文档,会更快熟悉
命令相关常用模块
command
ansible默认的模块
[root@ela1 ~]# ansible localhost -m command -a 'whoami'
localhost | CHANGED | rc=0 >>
root
[root@ela1 ~]# ansible localhost -a 'whoami'
localhost | CHANGED | rc=0 >>
root
command模块没有shell特性,所以shell中的"<"
, ">"
, "|"
, ";"
, "&"
,"$"
等特殊字符或用法不能在command
模块中使用,如果需要使用,则用shell
模块
常用参数
- chdir 在命令运行之前,先切换到此目录
- creates 如果creates的文件存在,则后面不执行,不存在就执行
- removes 和creates相反,如果removes的文件存在,才执行后面的操作,不存在就不执行
当然creates,removes等可以指定多个
#chdir 先切换工作目录,再执行后面的命令
[root@ela1 ~]# ansible localhost -a 'chdir=/tmp pwd'
localhost | CHANGED | rc=0 >>
/tmp
#creates 如果creates的文件存在,则后面不执行;不存在,则执行
[root@ela1 ~]# ansible localhost -a 'creates=/etc/passwd pwd'
localhost | SUCCESS | rc=0 >>
skipped, since /etc/passwd exists
[root@ela1 ~]# ansible localhost -a 'creates=/etc/passwddddd pwd'
localhost | CHANGED | rc=0 >>
/root
#removes 如果removes的文件存在,才执行后面的操作,不存在就不执行
[root@ela1 ~]# ansible localhost -a 'removes=/etc/passwd pwd'
localhost | CHANGED | rc=0 >>
/root
[root@ela1 ~]# ansible localhost -a 'removes=/etc/passwdddd pwd'
localhost | SUCCESS | rc=0 >>
skipped, since /etc/passwdddd does not exist
raw模块
raw模块用于在远程主机上执行命令,其支持管道符与重定向
[root@ansible ~]# ansible 192.168.250.122 -m raw -a 'ps -ef | wc -l'
192.168.250.122 | CHANGED | rc=0 >>
215
Shared connection to 192.168.250.122 closed.
shell模块
https://docs.ansible.com/ansible/2.9/modules/shell_module.html
专门用来执行shell
命令的模块,和command
模块一样,参数基本一样,都有chdir,creates,removes
等参数
`free_form`参数 :必须参数,指定需要远程执行的命令,但是并没有具体的一个参数名叫free_form,具体解释参考 command 模块。
`chdir`参数 : 此参数的作用就是指定一个目录,在执行对应的命令之前,会先进入到 chdir 参数指定的目录中。
`creates`参数 :使用此参数指定一个文件,当指定的文件存在时,就不执行对应命令,可参考command 模块中的解释。
`removes`参数 :使用此参数指定一个文件,当指定的文件不存在时,就不执行对应命令,可参考 command 模块中的解释。
`executable`参数:默认情况下,shell 模块会调用远程主机中的 /bin/sh 去执行对应的命令,通常情况下,远程主机中的默认 shell 都是 bash。如果你想要使用其他类型的 shell 执行命令,则可以使用此参数指定某种类型的 shell 去执行对应的命令。指定 shell 文件时,需要使用绝对路径。
[root@ela1 ~]# ansible localhost -m shell -a 'ps -ef | wc -l'
localhost | CHANGED | rc=0 >>
209
[root@ela1 ~]# ansible localhost -m shell -a 'creates=/tmp/test.txt touch /tmp/test.txt && echo aaaa > /tmp/test.txt'
[WARNING]: Consider using the file module with state=touch rather than running 'touch'. 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.
localhost | CHANGED | rc=0 >>
#在配置文件中command_warnings=False,取消警告
[root@ela1 ~]# ansible localhost -m shell -a 'cat /tmp/test.txt'
localhost | CHANGED | rc=0 >>
aaaa
script模块
指定本地的脚本文件,到远程主机运行
选项同样有:chdir、creates、removes等
[root@ansible ~]# vim test.sh
#!/bin/bash
echo $PWD
[root@ansible ~]# ansible localhost -m script -a 'test.sh'
localhost | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "",
"stderr_lines": [],
"stdout": "/root\n",
"stdout_lines": [
"/root"
]
}
lineinfile|replace模块
#在修改单个文件的单行内容时可以使用lineinfile模块
[root@control ansible]# ansible test -m lineinfile -a "path=/etc/issue line='hello world'" #在/etc/issue文件中添加一行内容hello world,默认添加到最后,重复执行,基于幂等原则,不会创建多行内容
[root@control ansible]# ansible test -m lineinfile -a 'path=/etc/issue line="insert" insertafter="Kernel"' #将内容插入到Kernel行的后面
[root@control ansible]# ansible test -m lineinfile -a 'path=/etc/issue regexp='hello' line="ni hao" ' #在/etc/issue文件中正则匹配包含hello的行,把整行内容替换为ni hao
#如果无法匹配到hello,则在文件最后添加一行nihao
#如果有多行内容包含hello,则仅替换最后一行
#lineinfile会替换一整行,replace可以替换关键词
[root@control ansible]# ansible test -m replace -a "path=/etc/issue.net regexp=Kernel replace=Ocean" #将/etc/issue文件全文所有的KerneI替换为Ocean
ping模块
ping测试网络
ansible all -m ping
user模块
用户管理的模块
- name= : 创建的用户名
- state= : 此参数用于指定用户是否存在于远程主机中,可选值有 present、absent,默认值为 present,表示用户需要存在,当设置为 absent 时表示删除用户。
- remove: 当 state 的值设置为 absent 时,表示要删除远程主机中的用户。但是在删除用户时,不会删除用户的家目录等信息,这是因为 remove 参数的默认值为 no,如果设置为yes,在删除用户的同时,会删除用户的家目录。当 state=absent 并且 remove=yes 时,相当于执行 “userdel --remove” 命令。
- force= : 删除用户的时候删除家目录(布尔)
- system= : 创建系统用户
- uid= : 指定UID
- shell= : 指定shell
- home= : 指定用户家目录
- expires:过期时间
- passwd:指定密码,必须经加密过的密文
- group(s):多个组用groups,参数用逗号连接
ansible all -m user -a "name= state={present | absent} force= system= uid= shell= home= "
#密码经过hash算法处理
[root@ansible ~]# openssl passwd -1 -salt hello
Password: #输入的密码为123456
$1$hello$ZwmhCpcG.I1XIfVjdarKc1
#创建用户tom
[root@ansible ~]# ansible localhost -m user -a 'name=tom home=/opt/tom password=$1$hello$ZwmhCpcG.I1XIfVjdarKc1'
localhost | CHANGED => {
"append": false,
"changed": true,
"comment": "",
"group": 1003,
"home": "/opt/tom",
"move_home": false,
"name": "tom",
"password": "NOT_LOGGING_PASSWORD",
"shell": "/bin/bash",
"state": "present",
"uid": 1001
}
#测试,成功登陆
[root@ansible ~]# ssh tom@localhost
tom@192.168.250.122's password:
Last failed login: Thu Nov 11 16:50:51 CST 2021 from ela1 on ssh:notty
There were 6 failed login attempts since the last successful login.
[tom@ansible ~]$
#删除用户,并且删除家目录
[root@ansible ~]# ansible localhost -m user -a 'name=tom state=absent remove=yes'
group模块
- name参数:必须参数,用于指定要操作的组名称。
- state参数:用于指定组的状态,两个值可选,present,absent,默认为 present,设置为absent 表示删除组。
- gid参数:用于指定组的gid。
- system参数:设置值为yes,表示创建为系统组
#groups模块,创建mysql组,git为3306,为系统组
[root@ansible ~]# ansible all -m group 'name=mysql gid=3306 system=yes'
file模块
file模块主要用于远程主机上的文件操作,file模块包含如下选项:
force:需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
- group:定义文件/目录的属组
- mode:定义文件/目录的权限
- owner:定义文件/目录的属主
- path:必选项,定义文件/目录的路径
- recurse:递归的设置文件的属性,只对目录有效
- src:要被链接的源文件的路径,只应用于state=link的情况
- dest:被链接到的路径,只应用于state=link的情况
- state: directory:如果目录不存在,创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
例子:
#创建目录或文件
ansible 192.168.250.122 -m file -a 'path=/tmp/a/b state=directory owner=oracle'
ansible 192.168.250.122 -m file -a 'path=/tmp/test.txt state=file'
#创建软连接
ansible 192.168.250.122 -m file -a "src=/etc/fstab dest=/tmp/fstab state=link"
#删除
ansible 192.168.250.122 -m file -a "path=/tmp/fstab state=absent"
#touch文件
ansible 192.168.250.122 -m file -a "path=/tmp/test state=touch"
copy模块
copy 模块的作用就是拷贝文件,还有 fetch 模块。
不同的是fetch 模块是从远程主机中拉取文件到 ansible 管理主机,而 copy 模块是将 ansible 管理主机上的文件拷贝到远程主机中。
-
src参数 :用于指定需要copy的文件或目录。
-
dest参数 :用于指定文件将被拷贝到远程主机的哪个目录中,dest为必须参数。
-
content参数 :当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必有其一,否则会报错。
-
force参数 : 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖,可选值有yes和no,默认值为yes,表示覆盖,如果设置为no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变。
-
backup参数 : 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份,可选值有yes和no,当设置为yes时,会先备份远程主机中的文件,然后再将ansible主机中的文件拷贝到远程主机。
-
owner参数 : 指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错。
-
group参数 : 指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错。
-
mode参数 : 指定文件拷贝到远程主机后的权限,如果你想将权限设置为”rw-r--r--“,则可以使用mode=0644表示,如果你想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示。
#将本机文件copy到目标主机
[root@ansible ~]# ansible 192.168.250.122 -m copy -a 'src=/etc/passwd dest=/tmp/passwd'
template模块
创建一个模板文件,可以在文档内进行变量替换(jinjia2)
http://jinja.pocoo.org/docs/templates/
#创建模板文件
[root@ansible ~]# cat /tmp/test
hello {{name}}
#将模板传递到受控主机,并应用变量值
[root@ansible ~]# ansible 192.168.250.122 -m template -a 'src=/tmp/test dest=/tmp/test' -e 'name=tom'
#查看
[root@ansible ~]# cat /tmp/test
hello tom
yum模块
yum模块用于在指定节点机器上通过yum管理软件,其支持的参数主要有
- name:要管理的包名
- state:要进行的操作
state常用的值:
- latest:安装软件
- installed | present:安装软件(二选一)
- removed | absent:卸载软件(二选一)
其他参数:
download_dir
#指定下载软件包的存放路径,需要配合download_only一起使用
download_only
#只下载软件包,而不进行安装,和yum --downloadonly一样
list
:
installed #列出所有已安装的软件包
updates #列出所有可以更新的软件包
repos #列出所有的yum仓库
disable_gpg_check
参数:用于禁用对 rpm 包的公钥 gpg 验证。默认值为 no,表示不禁用验证,设置为 yes 表示禁用验证,即不验证包,直接安装。在对应的 yum 源没有开启 gpg 验证的情况下,需要将此参数的值设置为 yes,否则会报错而无法进行安装。
enablerepo
参数:用于指定安装软件包时临时启用的 yum 源。假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时将此参数的值设置为 yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源。
disablerepo
参数:用于指定安装软件包时临时禁用的 yum 源。某些场景下需要此参数,比如,当多个 yum 源中同时存在要安装的软件包时,你可以使用此参数临时禁用某个源,这样设置后,在安装软件包时则不会从对应的源中选择安装包。enablerepo 参数和 disablerepo 参数可以同时使用。
update_cache
参数:强制更新yum的缓存
conf_file
参数:指定远程yum安装时所依赖的配置文件(安装本地已有的包)。
例子:
# 列出所有已安装的软件包
[root@ansible ~]# ansible 192.168.250.122 -m yum -a 'list=installed'
# 列出所有可更新的软件包
[root@ansible ~]# ansible 192.168.250.122 -m yum -a 'list=updates'
#列出所有的yum仓库
[root@ansible ~]# ansible 192.168.250.122 -m yum -a 'list=repos'
#只下载软件包并到指定目录下
[root@ansible ~]# ansible 192.168.250.122 -m yum -a 'name=httpd download_only=yes download_dir=/tmp'
#安装软件包
[root@ansible ~]# ansible 192.168.250.122 -m yum -a 'name=httpd state=installed'
#卸载软件包
[root@ansible ~]# ansible 192.168.250.122 -m yum -a 'name=httpd state=removed'
#安装包组,类似yum groupinstall 'Development Tools',组用@
[root@ansible ~]# ansible 192.168.250.122 -m yum -a 'name="@Development Tools" state=installed'
pip模块
用于安装python中的包
# 查看模块参数
[root@ansible ~]# ansible-doc -s pip
# 使用pip时,需要保证被管理机器上有python-pip软件包
[root@ansible ~]# ansible 192.168.250.122 -m yum -a 'name=python-pip'
# 安装flask框架
[root@ansible ~]# ansible 192.168.250.122 -m pip -a 'name=flask'
service模块
[root@ansible ~]# ansible-doc -s service
name #指定需要管理的服务名
enabled #指定是否开机自启动
state: #指定服务状态
started #启动服务
stopped #停止服务
restarted #重启服务
reloaded #重载服务
# 启动服务,并设置开机自启动
[root@ansible ~]# ansible 192.168.250.122 -m service -a 'name=httpd state=started enabled=yes'
cron模块
计划任务模块,和cronteb -e一样,分时日月周
常用参数:
job #指定需要执行的任务
minute #分钟
hour #小时
day #天
month #月
weekday #周
name #对计划任务进行描述
state:
absetn #删除计划任务
一些其他的参数:
user
#指定计划任务属于哪个用户
special_time
参数:计划任务的时间设定格式为 @reboot 或者@hourly。@reboot 表示重启时执行,@hourly 表示每小时执行一次,相当于设置成”0 0 * * *” ,这种@开头的时间设定格式则需要使用 special_time 参数进行设置,special_time 参数的可用值有 reboot(重启后)、yearly(每年)、annually(每年,与yearly相同)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每时)。
disabled
: 当计划任务有名称时,我们可以根据名称使对应的任务”失效”(注释掉对应的任务)。注意,使用此参数时,除了需要指定任务的名称,还需要同时指定任务的job 以及任务的时间设定,而且任务的时间设定必须和对应任务完全相同,否则在注释任务的同时,任务的时间设定会被修改,除非你确定这样做。
backup
参数:如果此参数的值设置为 yes,那么当修改或者删除对应的计划任务时,会先对计划任务进行备份,然后再对计划任务进行修改或者删除,cron 模块会在远程主机的 /tmp 目录下创建备份文件,以 crontab 开头并且随机加入一些字符,具体的备份文件名称会在返回信息的 backup_file 字段中看到,推荐将此此参数设置为 yes。
示例:
#在 webserver 主机上创建计划任务,任务名称为”crontab test”,任务于每天1点5分执行,任务内容为输出test字符。
ansible webserver -m cron -a " name='crontab test' minute=5 hour=1 job='/bin/bash /root/test.sh' "
#查看webserver主机上的计划任务
ansible webserver -a 'crontab -l'
#移除webserver主机上的计划任务
ansible webserver -m cron -a 'name="crontab test" state=absent'
setup模块
系统相关信息的模块
setup模块的输出作为变量,可以在debug模块中调用
# 查看系统所有信息
[root@ansible ~]# ansible 192.168.250.122 -m setup
# filter 对系统信息进行过滤
[root@ansible ~]# ansible 192.168.250.122 -m setup -a 'filter=ansible_all_ipv4_addresses'
#显示cpu个数(只显示总的个数)
[root@ansible ~]# ansible 192.168.250.122 -m setup -a 'filter=ansible_processor_vcpus'
一些常用的信息:
ansible_all_ipv4_addresses:仅显示ipv4的信息。
ansible_all_ipv6_addresses: 所有的ipv6地址
ansible_devices:仅显示磁盘设备信息。
ansible_architecture: 系统的架构
ansible_date_time: 系统时间
ansible_default_ipv4: 系统的默认ipv4地址
ansible_distribution:显示是什么系统,例:centos,suse等。
ansible_distribution_major_version:显示是系统主版本。
ansible_distribution_version:仅显示系统版本。
ansible_machine:显示系统类型,例:32位,还是64位。
ansible_eth0:仅显示eth0的信息。
ansible_kernel:仅显示内核版本。
ansible_lvm:显示lvm相关信息。
ansible_memtotal_mb:显示系统总内存。
ansible_memfree_mb:显示可用系统内存。
ansible_memory_mb:详细显示内存情况。
ansible_swaptotal_mb:显示总的swap内存。
ansible_swapfree_mb:显示swap内存的可用内存。
ansible_mounts:显示系统磁盘挂载情况。
ansible_processor:显示cpu个数(具体显示每个cpu的型号)。
ansible_processor_cores: cpu的核数
ansible_processor_count: cpu的颗数
ansible_processor_vcpus:显示cpu个数(只显示总的个数)。
ansible_domain: 系统所在的域
ansible_fqdn: 系统的主机名
ansible_hostname: 系统的主机名,简写
ansible_os_family: 系统的家族
lvm模块
lvg模块:创建、删除卷组(VG), 修改卷组大小
state: present (创建) absent (删除)
lvm需要确保依赖:ansible test -m yum -a "name=lvm2" #安装Ivm2软件包
[root@control ansible]# ansible test -m lvg -a "vg=myvg pvs=/dev/sdb1" #创建名称为myvg的卷组,该卷组由/dev/sdb1组成
[root@control ansible]# ansible test -m lvg -a "vg=myvg pvs=/dev/sdb1,/dev/sdb2" #修改卷组大小
lvol模块:创建,删除逻辑卷(LV),修改逻辑卷大小
[root@control ansible]# ansible test -m lvol -a "lv=mylv vg=myvg size=2G" #使用myvg这个卷组创建一个名称为myIv的逻辑卷
[root@control ansible]# ansible test -m lvol -a "lv=mylv vg=myvg size=4G" #修改LV逻辑卷大小
[root@control ansible]# ansible test -m lvol -a "lv=mylv vg=myvg state=absent force=yes" #删除逻辑卷
[root@