2、Ansible基础二
Ansible常用模块
ping模块
command模块
shell模块
user模块
group模块
yum模块
systemd模块
unarchive模块
archive模块
get_url模块
fetch模块
copy模块
script模块
blockinfile模块
lineinfile模块
setup模块
ping模块
command模块
shell模块
user模块
group模块
yum模块
systemd模块
unarchive模块
archive模块
get_url模块
fetch模块
copy模块
script模块
blockinfile模块
lineinfile模块
setup模块
Ansible常用模块
Ansible当中有非常多的模块可供我们使用,比如常见的执行命令、用户或用户组管理、包管理、文件系统管理等等,每个模块都有自己独特的功能,同时每个模块都有自己特定的参数,来定义对应模块的执行策略;
那么为了演示各模块的具体使用方法,我们主机配置清单文件内的具体内容,如下;
[cce@doorta ~]# cat /etc/ansible/hosts
[centos:children]
db
app
[centos:vars]
ansible_ssh_user=root
ansible_ssh_pass=caichangen
ansible_ssh_port=22
[db]
172.16.1.1
[app]
172.16.1.2
ping模块
ping模块用于检查指定节点机器是否连通,用法很简单,不涉及参数,主机如果在线,则回复pong,如下示例;
[cce@doorta ~]# ansible centos -m ping -o
172.16.1.2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"},"changed": false,"ping": "pong"}
172.16.1.1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"},"changed": false,"ping": "pong"}
command模块
command模块主要就是用于执行bash指令的,如果省略-m选项,那么ansible默认就会使用command模块,同时command模块下面也有很多参数可供我们定义,常用如下;
chdir:在执行指令之前,先切换到指定目录;
creates:指定文件存在时,取消执行指令;
removes:指定文件不存在时,取消执行指令;
对于command模块来讲,它的语法有点特殊,具体在远程主机执行的指令不需要使用任何参数来指定,值需要将command的参数放在指令前面即可,如下示例;
[cce@doorta ~]# ansible db -m command -a 'chdir=/tmp pwd' -o
172.16.1.1 | CHANGED | rc=0 | (stdout) /tmp
shell模块
shell模块和command模块功能非常相似,都是执行命令的模块,但是shell模块支持特殊符号,shell模块默认不转义命令,允许使用重定向、大于、小于、管道和布尔值等,甚至还支持shell运算符运算符"&&"、"||",同时,它的参数,和command模块也是一样的,如下;
chdir:在执行指令之前,先切换到指定目录;
creates:指定文件存在时,取消执行指令;
removes:指定文件不存在时,取消执行指令;
对于shell模块,它的使用方式和command模块基本是一摸一样的,如下示例;
[cce@doorta ~]# ansible db -m shell -a 'chdir=/tmp removes=/tmp/1 pwd' -o
172.16.1.1 | SUCCESS | rc=0 | (stdout) skipped, since /tmp/1 does not exist # /tmp/1文件不存在,所以取消执行指令了
user模块
user模块主要就是用来管理目标主机上面的用户的,我们可以使用user模块来创建用户、删除用户和修改用户等操作,同样的,因为用户管理存在着大量的可变性,所以,user模块的参数也非常的多,如下;
name:指定用户名;
password:指定用户密码;
create_home:是否创建家目录,取值yes/no;
home:指定用户的家目录位置;
group:指定基本组;
groups:指定附加组;
shell:指定用户登录shell环境;
uid:指定用户UID;
state:指定用户状态,present为创建,absent为删除;
move_home:假如此用户已经存在,取值yes为覆盖家目录,取值no为创建为此用户创建另外一个家目录,两个家目录通过uid区分;
generate_ssh_key:创建用户的同时是否为此用户创建ssh密钥文件,取值yes/no;
remove:删除用户时是否删除用户目录,取值yes/no;
user模块涉及到大量到参数,所以使用方式也是多变的,user模块与上述的几个模块不一样,user模块主要是通过参数来进行配置远程主机的,如下示例;
# 创建一个UID为1024,且基本组为root的用户
[cce@doorta ~]# ansible all -m user -a 'user=test uid=1024 group=root create_home=yes state=present' -o
# 删除名为test的用户,并删除家目录
[cce@doorta ~]# ansible all -m user -a 'user=test state=absent remove=yes' -o
group模块
group模块就是用来管理远程主机的用户组的,它相对于user模块来讲,就比较简单了,参数非常少,如下;
gid:指定组的id号;
name:指定组名;
state:指定创建组还是删除组,取值present为创建,absent为删除;
system:指定该组是否为系统组,取值yes/no;
group模块的使用和user模块是一样的,它们都是通过参数来执行指令的一类模块,如下;
# 创建组
[cce@doorta ~]# ansible all -m group -a 'gid=1000 name=test state=present system=no' -o
# 删除组
[cce@doorta ~]# ansible all -m group -a 'gid=1000 name=test state=absent system=no' -o
yum模块
yum模块的主要作用就是借助yum工具用来进行软件包管理的,它的参数其实也非常的多,但是大部分基本都用不上,常用的有如下几项;
conf_file:指定YUM源配置文件路径;
disable_gpg_check:关闭YUM的gpg_check配置;
name:指定需要安装的软件名称,也可以传递一个URL或者一个本地的RPM包的路径 ;
state:指定是安装软件包还是更新或者卸载软件包,取值present为安装软件包,取值latest为更新软件包,取值absent为删除软件包;
对于yum模块的使用也非常的简单,只不过该模块涉及到网络请求,所以在执行时可能耗时较长,如下;
# 安装软件包
[cce@doorta ~]# ansible all -m yum -a 'name=nginx' -o
# 卸载软件包
[cce@doorta ~]# ansible all -m yum -a 'name=nginx state=absent' -o
systemd模块
systemd模块是专用于Centos 7之上的服务管理模块,主要是用来管理systemd类型的服务启动和停止,以及开启启动等相关设置,参数如下;
arguments:给命令行提供一些选项;
enabled:是否开机启动,取值yes/no;
name:操作的服务名称;
pattern:定义一个模式,如果通过status指令来查看服务的状态时,没有响应,就会通过ps指令在进程中根据该模式进行查找,如果匹配到,则认为该服务依然在运行;
runlevel:指定开机启动的运行级别;
daemon_reload:重载systemd;
state:对当前服务执行启动,停止、重启、重新加载等操作,可以取值started、stopped、restarted、reloaded;
systemd模块的使用分为两类,一类为服务状态管理,二类为开机自启管理,如下示例;
# 启动服务,并开启开机自启
[cce@doorta ~]# ansible all -m systemd -a 'name=nginx state=started enabled=yes'
# 停止服务,并关闭开机自启
[cce@doorta ~]# ansible all -m systemd -a 'name=nginx state=stopped enabled=no'
unarchive模块
unarchive模块主要用于解压tar、zip格式类型的压缩文件,该模块的参数也较多,但是主要注意一个参数即可,即copy参数,如果copy参数为yes,那么dest为ansible控制端主机的路径,即,将本地压缩文件传到远端主机并解压,反之,如果copy参数为no,dest为被控端主机路径,表示直接在被控端主机dest指定的路径下寻找压缩包文件;
creates:指定一个文件名,当该文件存在时,则解压指令不执行;
src:压缩包的路径,具体是在被控端主机还是控制端主机,取决于copy的值;
dest:控制端主机的路径,即文件解压的父目录,该目录必须存在;
copy:默认为yes,表示将ansible控制端主机的src路径的文件,拷贝到远程主机,并解压到远程主机的dest目录,值为no表示将被控端主机上路径为src的文件解压到被控端主机的dest目录;
owner:指定解压后的文件的属主;
group:指定解压后的文件的属组;
mode:指定解压后的文件的权限;
unarchive模块的使用主要就是需要注意copy参数的值,它决定了包的来源,如下示例;
# 将文件传到远端主机,并解压到指定目录
[cce@doorta ~]# ansible all -m unarchive -a 'copy=yes src=/Users/cce/tar.tar.gz dest=/tmp/cce'
# 直接将远端主机的某个文件。解压到指定目录
[cce@doorta ~]# ansible all -m unarchive -a 'copy=no src=/tmp/tar.tar.gz dest=/tmp/cce'
archive模块
archive模块主要用于压缩文件,该模块并不像unarchive模块,它并没有copy这类属性,它主要就是用于将被控远端主机的某个目录进行压缩的一个模块,具体参数如下;
path:控制端主机的路径,即需要压缩的目录绝对路径;
dest:压缩后文件名称获取全路径;
remove:压缩完成之后,是否删除源文件,取值yes/no,默认为no;
format:指定打包压缩的类型,如bz2、gz、tar、xz、zip;
owner:指定解压后的文件的属主;
group:指定解压后的文件的属组;
mode:指定解压后的文件的权限;
archive相对unarchive模块来讲,简单得多,直接指定要压缩的目录/文件和压缩完成后存放的路径即可,如下示例;
# 压缩远端主机指定的文件进行压缩,并存储到指定的路径下
[cce@doorta ~]# ansible all -m archive -a 'path=/tmp/yum.log remove=no dest=/tmp/cce.tar.gz format=tar'
get_url模块
get_url模块可以用于在HTTP、HTTPS或者FTP上下载文件,它有点类似wget,同时,该模块的参数也不少,如下示例;
url:指定下载文件的URL;
url_username:用于HTTP Basic认证的用户名;
url_password:用于HTTP Basic认证的密码;
validate_certs:表示是否校验SSL证书是否过期,默认取值为yes;
dest:指定下载文件存放的路径;
owner:指定下载文件的属主;
group:指定下载文件的属组;
mode:指定下载文件的权限;
timeout:设置下载超时时间;
get_url模块的使用方式非常的简单,只需要给定url和dest两个必须的参数即可,如下示例;
# 下载文件到/tmp目录
[cce@doorta ~]# ansible all -m get_url -a 'url=http://old.doorta.com/software/frpc.ini dest=/tmp owner=root mode=644 group=root'
fetch模块
fetch模块主要用于将被控主机的文件拉取到本地来,常用于数据备份,该模块的参数也不多,如下示例;
src:指定被控主机内要拉取的文件绝对路径;
dest:指定拉取文件到本地的哪个目录;
get_url模块的使用方式非常的简单,只需要给定url和dest两个必须的参数即可,如下示例;
# 拉取远端主机文件到本地指定目录下
[cce@doorta ~]# ansible all -m fetch -a 'src=/etc/rc.local dest=/tmp flat=no'
copy模块
copy模块和fetch模块相反,它的主要用于控制端主机的文件发送到远端主机,常用于文件分发,该模块是使用最广泛的一个模块,它的参数也非常多,如下示例;
src:用于指定需要copy的文件或目录,如果路径是一个目录,它将递归复制,同时如果路径使用"/"来结尾,则只复制目录里的内容,如果没有使用"/"来结尾,则包含目录在内的整个内容全部复制,一个复制目录里面的内容,一个直接复制目录;
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表示;
others:所有的file模块里的选项都可以在这里使用;
copy模块最主要的作用就是用来做配置文件分发,如下示例;
# 分发配置文件到远端主机的指定目录,如果远端主机存在同名文件,则先备份
[cce@doorta ~]# ansible all -m copy -a 'src=/etc/fstab.hd dest=/root backup=yes'
script模块
script模块的主要作用就是在远端主机执行本地的脚本,它和command命令一样,具体的脚本命令无需任何参数指定,直接将本地的脚本绝对路径放在参数最后即可;
chdir:此参数的作用就是指定一个目录,在执行对应的命令之前,会先进入到chdir参数指定的目录中;
creates:当指定的文件存在时,就不执行对应命令;
removes:当指定的文件不存在时,就不执行对应命令;
script模块的使用非常的简单,它一般来讲,无需任何参数,直接给定本地脚本路径即可,如下示例;
# 在被控主机上执行本地脚本
[cce@doorta ~]# ansible all -m script -a '/etc/uptime.sh'
blockinfile模块
blockinfile模块,可以帮助我们在被控机上指定的文件中插入一段文本,并且在插入文本的同时,打上一个标记,以便在以后的操作中可以通过标记找到这段文本,该模块存在众多参数,如下;
path:指定需要操作远端主机的文件绝对路径;
block:指定需要在远端主机文件中插入的文本内容;
marker:用于指定标记符,即一个开始标记一个结束标记,默认开始标记为# BEGIN ANSIBLE MANAGED BLOCK,结束标记为# END ANSIBLE MANAGED BLOCK;
state:有两个可选值,present和absent,如果远端主机的文件中已经存在对应标记的文本,取值present会更新对应段落,取值absent,则从该文件中删除对应标记的段落;
insertafter:默认值为EOF,即在文件的末尾插入文本;
insertbefore:默认值为BOF,即在文件的开头插入文本;
backup:是否在修改远端主机的文件之前对该文件进行备份;
create:当远端主机操作的文件不存在时,是否创建,取值yes/no;
blockinfile模块主要关注一个属性,即state,当state取值为present时,表示插入或者更新文件内的内容,取值absent表示删除文件内的内容,如下示例;
# 在远端主机指定的文件新增内容
[cce@doorta ~]# ansible all -m blockinfile -a 'path=/etc/fstab block="cce" state=present'
# 在远端主机指定的文件删除内容
[cce@doorta ~]# ansible all -m blockinfile -a 'path=/etc/fstab block="cce" state=absent'
lineinfile模块
lineinfile模块的主要作用就是实现类似sed的操作,可以通过内容,或者正则表达式来替换远端主机指定文件内的内容,该模块的参数也非常的多,如下示例;
path:指定需要操作的远端主机的文件绝对路径;
line:指定用来替换或者删除的内容;
regexp:表示使用正则表达式来匹配对应的行,匹配成功则将内容进行替换或者删除,如果有多行匹配,对于替换只会替换匹配到的最后一行,对于删除将会直接删除所有匹配项;
state:表示是执行替换操作,还是删除操作,取值present则替换匹配到的文本,取值absent则删除匹配的文本;
create:当要操作的文件并不存在时,是否创建对应的文件,默认为false;
backup:是否在修改文件之前对文件进行备份,默认为false;
insertafter:借助insertafter可以将文本插入到指定的行后,insertafter参数的值可以设置为EOF或者正则表达式,默认为EOF,如果将insertafter的值设置为正则表达式,表示将文本插入到匹配到正则的行后,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数将会被忽略;
insertbefore:将文本插入到指定行之前,insertbefore的值可以设置为BOF或者正则表达式,BOF表示插入到文档开头,默认为BOF,如果将insertbefore设置为正则表达式,表示将文本插入到匹配到正则的行之前,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数被忽略;
backrefs:默认情况下,当根据正则替换文本时,即使regexp参数中的正则存在分组,再line参数中也不能对正则中的分组行进行引用,除非将backrefs参数的值设置为yes,backrefs=yes表示开启后向引用,这样,line参数中就能对regexp参数中的分组进行后向引用了。backrefs=yes除了能开启后向引用功能,还有另一个作用,默认情况下,当使用正则表达式替换对应行时,同时设置了backrefs=yes,那么当正则没有匹配到任何的行时,则不会对文件进行任何操作,相当于保持文件不变。
lineinfile模块的使用相对于上述的所有模块,可以说是最复杂的一个模块,涉及到各种场景,如下示例;
# 将远端主机正则为"^SELINUX\="的行替换为SELINUX=disabled
[cce@doorta ~]# ansible all -m lineinfile -a 'path=/etc/selinux/config line='SELINUX=disabled' regexp="^SELINUX\=" state=present'
# 在远端主机正则为"^SELINUX\="的行前面新增一行数据
[cce@doorta ~]# ansible all -m lineinfile -a 'path=/etc/selinux/config line='SELINUX=disabled' state=present insertbefore="^SELINUX\="'
# 删除远端主机正则为".*disabled"匹配到的行
[cce@doorta ~]# ansible all -m lineinfile -a 'path=/etc/selinux/config regexp=".*disabled$" state=absent'
# 在远端主机首部添加文本
[cce@doorta ~]# ansible all -m lineinfile -a 'path=/etc/selinux/config line="cce" insertbefore=BOF state=present'
# 在远端主机尾部添加文本
[cce@doorta ~]# ansible all -m lineinfile -a 'path=/etc/selinux/config line="cce" insertbefore=BOF state=absent'
# 使用正则分组,将regexp中的分组匹配到到数据放在line参数中引用
[cce@doorta ~]# ansible all -m lineinfile -a 'path=/etc/selinux/config line="\1disabled" regexp="^(SELINUX=).*" state=present backrefs=yes'
setup模块
setup模块的主要作用就是收集远端主机的信息,如CPU、内存、磁盘、IP等等信息,这些信息,我们在Playbook中一般都会大量使用,比如根据主机信息的不同来执行不同的操作,setup模块收集到的信息非常多,我们可以通过一些标识符来过滤处我们想要的信息,这些标识符有很多,如下示例
ansible_all_ipv4_addresses:仅显示ipv4的信息;
ansible_devices:仅显示磁盘设备信息;
ansible_distribution:显示是操作系统类型;
ansible_distribution_major_version:显示是系统主版本;
ansible_distribution_version:仅显示系统版本;
ansible_machine:显示CPU架构,是32位,还是64位;
ansible_eth0:仅显示eth0的信息;
ansible_hostname:仅显示主机名;
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_vcpus:显示cpu个数(只显示总的个数;
ansible_python_version:显示python版本;
那么想要使用这些标识符去过滤信息,就需要借助setup的filter参数来实现,使用filter来指定具体需要过滤的标识符,如下示例;
# 收集远端主机CPU架构
[cce@doorta /usr/local/Project/linux]# ansible all -m setup -a 'filter=ansible_machine' -o
172.16.1.2 | SUCCESS => {"ansible_facts": {"ansible_machine": "x86_64","discovered_interpreter_python": "/usr/bin/python"},"changed": false}
172.16.1.1 | SUCCESS => {"ansible_facts": {"ansible_machine": "x86_64","discovered_interpreter_python": "/usr/bin/python"},"changed": false}