linux ansible 常用模块详解

实验环境

网络环境

底层系统

系统都为:Red Hat Enterprise Linux release 8.0 (Ootpa)

ansible主机清单

 

模块介绍

先复习一下ansible指令的基本使用方法

ansible <host-pattern> [-m module_name] [-a args]
host  为主机名或IP,组名字
-m    为调用哪个模块
-a    为参数指令

查询一下至今版本ansible有多少个模块

[root@ansible ~]# ansible-doc -l |wc
3387 11758 267534

可看出现今已有3387个模块,虽然模块众多,但最常用的模块也就2,30个而已,针对特定业务只用10几个模块

常用模块帮助文档参考:https://docs.ansible.com/ansible/latest/modules/modules_by_category.html

Command 模块

功能:在远程主机执行命令,此为默认模块,可忽略-m选项

command模块在远程主机执行命令,不支持管道、重定向等shell的特性。常用的参数如下

  • chdir:在远程主机上运行命令前要提前进入的目录;
  • creates:在命令运行时创建一个文件,如果文件已存在,则不会执行创建任务;
  • removes:在命令运行时移除一个文件,如果文件不存在,则不会执行移除任务;
  • executeable:指明运行命令的shell程序;

示例:

[root@ansible ~]# ansible web1 -a 'chdir=/etc cat redhat-release'
进入到web1组内主机的etc目录查看redhat-release查询版本号

[root@ansible ~]# ansible web1 -a "creates=/test.txt"
web1组在/目录创建test.txt

[root@ansible ~]# ansible web1 -a "removes=/test.txt"
web1组在/目录删除test.txt

[root@ansible /]# ansible all -a "useradd yu"
所有主机创建yu用户

[root@ansible /]# ansible all -a "echo 123456|passwd --stdin yu"
所有主机修改yu用户的密码

 

 

shell模块

shell模块在远程主机执行命令,相当于调用远程主机的Shell进程,然后在该Shell下打开一个子Shell运行命令。和command模块的区别是它支持Shell特性:如管道、重定向等。

简单来说就是command的增强版,个人使用指令时一般用shell模块而不用command模块

示例:

[root@ansible /]# ansible web1 -m shell -a "echo hello world > /1.txt"
192.168.26.3 | CHANGED | rc=0 >>
192.168.26.2 | CHANGED | rc=0 >>
[root@ansible /]# ansible web1 -m shell -a "echo hello world"
192.168.26.3 | CHANGED | rc=0 >>
hello world
192.168.26.2 | CHANGED | rc=0 >>
hello world

还可以将shell模块设置为默认模块,代替command模块,从而输入指令时省略-m参数,更加方便

方法:

[root@ansible /]# vi /etc/ansible/ansible.cfg
修改下面这一行
module_name = shell
:wq

 

 

Script模块

功能:在远程主机上运行ansible服务器上的脚本

示例:

[root@ansible /]# vi test.sh
#!/bin/bash
hostname
:wq
[root@ansible /]# ansible web1 -m script -a /test.sh

 

 

Copy模块

功能:从ansible服务器主控端复制文件到远程主机,常见的参数如下:

  • dest:       指出复制文件的目标目录位置,使用绝对路径。如果源是目录,则目标也要是目录,如果目标文件已存在,会覆盖原有内容;
  • src:         指出源文件的路径,可以使用相对路径和绝对路径,支持直接指定目录。如果源是目录,则目标也要是目录;
  • mode:    指出复制时,目标文件的权限,可选;
  • owner:   指出复制时,目标文件的属主,可选;
  • group:   指出复制时目标文件的属组,可选;
  • content:指出复制到目标主机上的内容,不能和src一起使用,相当于复制content指明的数据到目标文件中;
  • backup:   备份远程节点上的原始文件,在拷贝之前。如果发生什么意外,原始文件还能使用。

示例:

[root@ansible /]# ansible web1 -m copy -a "src=/test.sh dest=/data owner=yu mode=755 backup=yes"

在主机查看一下

[root@web1-1 /]# cd /data/
[root@web1-1 data]# ll test.sh 
-rwxr-xr-x. 1 yu root 21 7月 2 02:42 test.sh

 

 

Fetch模块

功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录,常见参数:

  • dest:       指出复制文件的目标目录位置,使用绝对路径。
  • src:         指出源文件的路径,可以使用相对路径和绝对路径。

示例:

[root@web1-1 data]# touch yu.txt
[root@ansible data]# ansible 192.168.26.2 -m fetch -a "src=/data/ dest=/data/yu.txt"
[root@ansible /]# tree /data/
/data/
├── 192.168.26.2
│   └── data
│       └── yu.txt
└── test.sh
2 directories, 2 files
看出data目录内已经看到自动创建了192.168.26.2文件夹和刚传输的yu.txt

 

 

File模块

功能:设置文件属性,常用参数:

  • path:       必须参数,用于指定要操作的文件或目录
  • sate:        设置为directory时,ansible就知道操作的是目录;设置为touch时,ansible就知道操作的是文件;设置为link时,就是创建软链接文件;设置hard时,就是hard创建硬链接文件; 设置为absent时,”absent”为缺席之意,就是删除目标。
  • src:          当state设置为link或者hard时,表示我们想要创建一个软链或者硬链,所以,我们必须指明软链或硬链链接的哪个文件.
  • force:      当state=link的时候,可配合此参数强制创建链接文件,当force=yes时,表示强制创建链接文件。
  • owner:    用于指定被操作文件的属主,属主对应的用户必须在远程主机中存在,否则会报错。
  • group:    用于指定被操作文件的属组,属组对应的组必须在远程主机中存在,否则会报错。
  • mode:    用于指定被操作文件的权限.

示例:

[root@ansible /]# ansible web1 -m file -a "path=/data/testfile1 state=touch owner=yu group=yu"
为web1组在data创建testfile文件

[root@ansible /]# ansible web2 -m file -a "path=/data/testfile state=directory"
为web1组在data创建testfile目录

[root@ansible /]# ansible 192.168.26.2 -m file -a "src=/data/test.sh dest=/data/testfile-link state=link"
在192.168.26.2主机上为test.sh创建软连接

 

 

unarchive模块

功能:解包解压缩

实现有两种用法:
1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes
2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no

常见参数:

  • copy:             默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,如果设置为copy=no,会在远程主机上寻找src源文件
  • remote_src:和copy功能一样且互斥,yes表示在远程主机,不在ansible主机,no表示文件在ansible主机上
  • src:                源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,如果是远程主机上的路径,则需要设置copy=no
  • dest:              远程主机上的目标路径
  • mode:           设置解压缩后的文件权限
  • owner:    用于指定被操作文件的属主,属主对应的用户必须在远程主机中存在,否则会报错。
  • group:    用于指定被操作文件的属组,属组对应的组必须在远程主机中存在,否则会报错。

示例:

[root@ansible data]# tar -zcvf /data/test.tgz /data/*
创建测试用的压缩包

[root@ansible /]# ansible all -m unarchive -a "src=/data/test.tgz dest=/data/"
接着去主机中的/data目录查看,已经解压完成

[root@ansible /]# ansible all -m unarchive -a "src=https://example.com/example.zip dest=/data copy=no"
从网上下载压缩包并解压到主机上,这样子压缩包本身不是ansible服务器上,所以需要设置copy=no

 

 

Archive模块

功能:打包压缩,常用参数:

  • path:       指定要压缩的文件或目录路径
  • dest:        压缩后文件存放的位置
  • format:    指定压缩的类型:bz2,gz,tar,xz,zip,tgz
  • owner:    用于指定被操作文件的属主,属主对应的用户必须在远程主机中存在,否则会报错。
  • group:    用于指定被操作文件的属组,属组对应的组必须在远程主机中存在,否则会报错。
  • mode:    用于指定被操作文件的权限.

示例:

[root@ansible /]# ansible web1 -m archive -a "path=/var/log/ dest=/data/log.tar.bz2 format=bz2 owner=yu mode=0600"

 

 

Hostname模块

功能:管理主机名,常用参数:

  • name:   指明主机名

示例:

[root@ansible /]# ansible 192.168.26.2 -m hostname -a "name=web1-1"

不推荐时间web1组或者all全部一次性修改,因为会导致主机名都为重复的

 

 

Cron模块

功能:计划任务,常用参数:

  • minute:      指定分钟的值,若=5,则表示每5分钟,不设置,默认为*全部,下列关于时间的参数都为此
  • hour:          指定小时的值
  • day:            指定天数的值
  • month:       指定月份的值
  • weekday:    指定周几的值
  • user:        此参数用于设置当前计划任务属于哪个用户,当不使用此参数时, 默认为管理员用户
  • jog:              此参数用于指定计划的任务中需要实际执行的命令或者脚本
  • name :        此参数用于设计划任务的名称
  • state:          当计划任务有名称时,我们可以根据名称修改或删除对应的任务,当删除计划任务时,需要将state的值设置为absent
  • backup:      如果此参数的值设置为yes,那么当修改或者删除对应的计划任务时,会先对计划任务进行备份,然后再对计划任务进行修改或者删除,cron模块会在远程主机的/tmp目录下创建备份文件。
  • disabled     yes为禁用,no则为启用

示例:

[root@ansible /]# vi mysql_backup.sh
mysqldump -A -F --single-transaction --master-data=2 -q -uroot |gzip > /data/mysql_date +%F_%T.sql.gz
:wq
创建一个备份数据库的脚本

[root@ansible /]# ansible 192.168.26.2 -m cron -a "hour=2 minute=30 weekday=1-5 name="backup mysql" job=/root/mysql_backup.sh"
为192.168.26.2创建一个时间任务,周1-5每天的2:30执行备份数据库脚本,任务名称为back mysql

[root@ansible /]# ansible all -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 192.168.26.1 &>/dev/null' name=Synctime"
为所有主机主机创建计划任务,以ansible服务器为基准更新时间

[root@ansible /]# ansible all -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 192.168.26.1 &>/dev/null' name=Synctime disabled=yes"
将刚刚的计划任务禁用

[root@ansible /]# ansible all -m cron -a "name='backup mysql' state=absent"
将备份数据库的计划任务删除

 

 

Yum_repository模块

功能:模块可以帮助我们管理远程主机上的 yum 仓库,常用参数:

  • name:            必须参数,用于指定要操作的唯一的仓库ID,也就是”.repo”配置文件中每个仓库对应的”中括号”内的仓库ID。
  • baseurl:         此参数用于设置 yum 仓库的 baseurl。
  • description:  此参数用于设置仓库的注释信息,也就是”.repo”配置文件中每个仓库对应的”name字段”对应的内容。
  • file:                 此参数用于设置仓库的配置文件名称,即设置”.repo”配置文件的文件名前缀,在不使用此参数的情况下,默认以 name 参数的仓库ID作为”.repo”配置文件的文件名前缀,同一个”.repo” 配置文件中可以存在多个 yum 源。
  • enabled:        此参数用于设置是否激活对应的 yum 源,此参数默认值为 yes,表示启用对应的 yum 源,设置为 no 表示不启用对应的 yum 源。
  • gpgcheck:     此参数用于设置是否开启 rpm 包验证功能,默认值为 no,表示不启用包验证,设置为 yes 表示开启包验证功能。
  • gpgcakey:     当 gpgcheck 参数设置为 yes 时,需要使用此参数指定验证包所需的公钥。
  • state:             默认值为 present,当值设置为 absent 时,表示删除对应的 yum 源。

示例:

[root@ansible /]# ansible web1 -m yum_repository -a 'name=aliEpel description="alibaba EPEL" baseurl=https://mirrors.aliyun.com/epel/$releasever\Server/$basearch/ file=alibaba'
在 web1 主机上设置ID为 aliEpel 的 yum 源,仓库配置文件路径为 /etc/yum.repos.d/alibaba.repo。

 

 

Yum模块

功能:管理软件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其它版本,常用参数:

  • name:                                        程序包名称,可以带上版本号。若不指明版本,则默认为最新版本;
  • state=present|atest|absent:指明对程序包执行的操作:present表明安装程序包,latest表示安装最新版本的程序包,absent表示卸载程序包;
  • disablerepo:                            在用yum安装时,临时禁用某个仓库的ID;
  • enablerepo:                            在用yum安装时,临时启用某个仓库的ID;
  • conf_file:                                 yum运行时的配置文件,而不是使用默认的配置文件;
  • disable_gpg_check=yes|no:       是否启用完整性校验功能;

yum准备本地仓库

[root@ansible /]# ansible web1 -m shell -a "rm -rf /etc/yum.repos.d/*"
[root@ansible /]# ansible web1 -m copy -a "src=/etc/yum.repos.d/y.repo dest=/etc/yum.repos.d/"
[root@ansible /]# ansible web1 -m shell -a "mount /dev/cdrom /mnt"
[root@ansible /]# ansible web1 -m shell -a "yum makecache"

示例:

[root@ansible /]# ansible web1 -m yum -a "name=httpd"
web1组安装名为httpd的服务

[root@ansible /]# ansible web1 -m shell -a "rpm -qa |grep httpd"
192.168.26.3 | CHANGED | rc=0 >>
httpd-2.4.37-30.module_el8.3.0+561+97fdbbcc.x86_64
192.168.26.2 | CHANGED | rc=0 >>
httpd-2.4.37-10.module+el8+2764+7127e69e.x86_64
检查服务是否安装成功

[root@ansible /]# ansible web1 -m yum -a "name=httpd state=absent"
卸载httpd服务

[root@ansible /]# ansible web1 -m shell -a "rpm -a |grep httpd"
192.168.26.3 | FAILED | rc=1 >>
non-zero return code
192.168.26.2 | FAILED | rc=1 >>
non-zero return code
再检查一次,成功删除

 

 

Service模块

service模块为用来管理远程主机上的服务的模块。常见的参数如下:

  • name:                             被管理的服务名称;
  • state=started|stopped|restarted:      动作包含启动,关闭或重启;
  • enable=yes|no:            表示是否设置该服务开机自启动;
  • runlevel:                        如果设定了enabled开机自启动,则要定义在哪些运行目标下自动启动;

示例:

[root@ansible /]# ansible web1 -m service -a "name=httpd enabled=yes state=started"
设置web1组的httpd启动与开机自动启动

 

 

User模块

user模块主要用于管理远程主机上的用户账号。常见的参数如下:

  • name:                           必选参数,账号名称;
  • state=present|absent:          创建账号或者删除账号,present表示创建,absent表示删除;
  • system=yes|no:          是否为系统账户;
  • uid:                                用户UID;
  • group:                           用户的基本组
  • groups:                         用户的附加组;
  • shell:                             默认使用的shell;
  • home:                           用户的家目录;
  • mve_home=yes|no:如果设置的家目录已经存在,是否将已存在的家目录进行移动;
  • pssword:                     用户的密码,建议使用加密后的字符串;
  • comment:                用户的注释信息;
  • remore=yes|no:      当state=absent时,是否要删除用户的家目录;

示例:

[root@ansible /]# ansible all -m user -a "name=yu2 system=yes uid=502 group=root groups=root shell=/etc/nologin home=/home/yu2 password=123456"
为所有主机创建yu2用户,其中账号为系统用户,uid为502,所属组与附加组为root,不允许本地登录,家目录为/home/yu2,密码为123456

 

 

Group模块

功能:管理组,常用参数:

  • name:   必须参数,用于指定要操作的组名称;
  • state:     用于指定组的状态,两个值可选,present,absent,默认为 present,设置为absent 表示删除组;
  • gid:        用于指定组的gid;
  • system=yes|no:          是否为系统组;

示例:

[root@ansible /]# ansible all -m group -a "name=test gid=88 system=yes"
为所有主机添加test系统组,gid为88

[root@ansible /]# ansible all -m group -a "name=test state=absent"
删除所有主机的test组

 

 

Lineinfile模块

ansible在使用sed进行替换时,经常会遇到需要转义的问题,而且ansible在遇到特殊符号进行替换时,存在问题,无法正常进行替换 。其实在ansible自身提供了两个模块:lineinfile模块和replace模块,可以方便的进行替换

功能:相当于sed,可以修改文件内容,常见参数:

  • path:          必须参数,指定要操作的文件。
  • line :             使用此参数指定文本内容。
  • regexp:      使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
  • state:           当想要删除对应的文本时,需要将state参数的值设置为absent,absent为缺席之意,表示删除,state的默认值为present。
  • backrefs:     默认情况下,当根据正则替换文本时,即使regexp参数中的正则存在分组,在line参数中也不能对正则中的分组进行引用,除非将backrefs参数的值设置为yes。backrefs=yes表示开启后向引用,这样,line参数中就能对regexp参数中的分组进行后向引用了,这样说不太容易明白,可以参考后面的示例命令理解。backrefs=yes除了能够开启后向引用功能,还有另一个作用,默认情况下,当使用正则表达式替换对应行时,如果正则没有匹配到任何的行,那么line对应的内容会被插入到文本的末尾,不过,如果使用了backrefs=yes,情况就不一样了,当使用正则表达式替换对应行时,同时设置了backrefs=yes,那么当正则没有匹配到任何的行时,则不会对文件进行任何操作,相当于保持原文件不变。
  • insertafter:借助insertafter参数可以将文本插入到“指定的行”之后,insertafter参数的值可以设置为EOF或者正则表达式,EOF为End Of File之意,表示插入到文档的末尾,默认情况下insertafter的值为EOF,如果将insertafter的值设置为正则表达式,表示将文本插入到匹配到正则的行之后,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。
  • insertbefore:  借助insertbefore参数可以将文本插入到“指定的行”之前,insertbefore参数的值可以设置为BOF或者正则表达式,BOF为Begin Of File之意,表示插入到文档的开头,如果将insertbefore的值设置为正则表达式,表示将文本插入到匹配到正则的行之前,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。
  • backup:   是否在修改文件之前对文件进行备份。
  • create:     当要操作的文件并不存在时,是否创建对应的文件。

示例:

[root@ansible /]# ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=enforcing'"
所有主机将selinux配置文件 SELINUX=开头那行修改成SELINUX=enforcing从而开启selinux

[root@ansible /]# ansible all -m lineinfile -a 'dest=/etc/fstab state=absent regexp="^#"'
所有主机将fstab配置文件中所有注释#号去掉

[root@ansible /]# ansible web1 -m lineinfile -a "path=/etc/httpd/conf/httpd.conf regexp='^DocumentRoot' line='DocumentRoot \"/data\"'"
替换web1组httpd配置文件中的DocumentRoot "" 替换为 DocumentRoot "/data"

 

 

Replace模块

该模块有点类似于sed命令,主要也是基于正则进行匹配和替换,常用参数

  • path :        必须参数,指定要操作的文件,2.3版本之前,只能使用 dest, destfile, name指定要操作的文件,2.4版本中,仍然可以使用这些参数名,这些参数名作为 path 参数的别名使用。
  • regexp:        必须参数,指定一个 python 正则表达式,文件中与正则匹配的字符串将会被替换。
  • replace :   指定最终要替换成的字符串。
  • backup:    是否在修改文件之前对文件进行备份,最好设置为yes。

示例:

[root@ansible /]# ansible all -m replace -a "path=/etc/fstab regexp='^(UUID.*)' replace='#\1'"
为所有主机fstab配置文件中的uuid行,开头全部加#号注释

[root@ansible /]# ansible all -m replace -a "path=/etc/fstab regexp='^#(.*)' replace='\1'"
为所有主机fstab配置文件中的所有#号注释去掉

 

 

Setup模块

功能: setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度,可以使用,常见参数:

  • filter:    用于进行条件过滤。如果设置,仅返回匹配过滤条件的信息。

示例:

[root@ansible /]# ansible all -m setup -a "filter=ansible_python_version"
 192.168.26.2 | SUCCESS => {
"ansible_facts": {
"ansible_python_version": "3.6.8",
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
192.168.26.4 | SUCCESS => {
"ansible_facts": {
"ansible_python_version": "3.6.8",
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
192.168.26.3 | SUCCESS => {
"ansible_facts": {
"ansible_python_version": "3.6.8",
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
查看所有主机的python版本

示例:

[root@ansible /]# ansible all -m setup
[root@ansible /]# ansible all -m setup -a "filter=ansible_nodename"
[root@ansible /]# ansible all -m setup -a "filter=ansible_hostname"
[root@ansible /]# ansible all -m setup -a "filter=ansible_domain"
[root@ansible /]# ansible all -m setup -a "filter=ansible_memtotal_mb"
[root@ansible /]# ansible all -m setup -a "filter=ansible_memory_mb"
[root@ansible /]# ansible all -m setup -a "filter=ansible_memfree_mb"
[root@ansible /]# ansible all -m setup -a "filter=ansible_os_family"
[root@ansible /]# ansible all -m setup -a "filter=ansible_distribution_major_version"
[root@ansible /]# ansible all -m setup -a "filter=ansible_distribution_version"
[root@ansible /]# ansible all -m setup -a "filter=ansible_processor_vcpus"
[root@ansible /]# ansible all -m setup -a "filter=ansible_all_ipv4_addresses"
[root@ansible /]# ansible all -m setup -a "filter=ansible_architecture"
[root@ansible /]# ansible all -m setup -a "filter=ansible_processor*"

 

 

作者: 红烧悠鸽
本文采用 CC BY-NC-SA 4.0 协议
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇