实验环境
网络环境
底层系统
系统都为: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*"