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/

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@

posted @ 2021-11-15 11:21  EverEternity  阅读(178)  评论(0编辑  收藏  举报