主要内容:
部署Ansible、Ansible基础命令(Ansible ad-hoc命令格式、Ansible-doc帮助)、Ansible模块常用:脚本与命令模块、文件与账户模块、软件与服务模块、逻辑卷模块
补充:touch 除创建文件外,若再创建相同文件时,只会修改文件的时间信息,内容不变;
一、Ansible概述
Ansible 是一种开源的自动化工具,由 Red Hat 公司支持,首次发布于2012年,作者Michael DeHaan(Cobbler作者)后来被RedHat收购。主要用于配置管理、应用部署、任务自动化和 IT 基础设施自动化,基于Python开发,能实现批量系统配置、批量程序部署、批量运行命令、批量修改服务器密码、批量安装软件包、批量修改配置等功能。
Ansible 以其简单性、易用性和强大的功能而受到广泛欢迎。以下是 Ansible 的一些关键特性:
1. 无代理架构:Ansible 采用无代理架构,这意味着它不需要在目标主机上安装任何额外的软件或代理。它通过 SSH(默认情况下)或 WinRM(用于 Windows 主机)与目标主机通信,执行任务和配置管理。
2. 基于 YAML 的 Playbooks:Ansible 使用 YAML(YAML Ain't Markup Language)格式编写 Playbooks,这是一种人类可读的数据序列化语言。Playbooks 定义了一系列任务,这些任务可以按顺序执行,以实现自动化目标。
3. 模块化设计:Ansible 提供了大量的模块,用于执行各种任务,如文件操作、软件包管理、服务管理等。用户还可以编写自定义模块,以满足特定需求。
4. 幂等性:Ansible 的设计理念之一是幂等性,即无论执行多少次相同的操作,结果都应该是一样的。这意味着如果配置已经符合预期状态,Ansible 不会进行不必要的更改。
5. 强大的生态系统:Ansible 拥有一个活跃的社区和丰富的生态系统,提供了大量的 Playbooks、角色和模块,可以快速实现各种自动化任务。
6. 支持多种平台:Ansible 支持管理各种操作系统,包括 Linux、Windows、网络设备等。
7. 易于扩展:Ansible 的设计使其易于扩展和集成。用户可以编写自定义模块、插件和扩展,以满足特定的自动化需求。
8. 集中式管理:Ansible 通过一个控制节点(通常是 Ansible 服务器)来管理所有目标主机,这使得集中式管理和监控变得非常方便。
使用场景:
- 配置管理:自动化配置操作系统和应用程序。
- 应用部署:自动化应用程序的部署和更新。
- 任务自动化:自动化日常的 IT 任务,如备份、监控等。
- IT 基础设施自动化:自动化整个 IT 基础设施的部署和管理,包括虚拟机、容器、网络设备等。
1、Ansible原理概述
- ① 控制端主机安装Ansible,自带很多模块(模块就是脚本,默认8000多个Python脚本);
- ② ansible通过ssh远程被管理主机,将控制端的模块(脚本)或命令传输到被管理主机;(脚本放在被管理主机的tmp目录中进行执行,退出ssh后将脚本rm删除)
- ③ 在被管理端主机执行模块(脚本)或命令,执行不同的模块或命令可以实现不同的功能;
- ④ 最后ansible退出ssh远程。
注意:绝大多数模块(脚本)都需要参数才能执行成功,类似于shell脚本的位置变量!
Ansible的两种执行方式:
1)Ansible ad-hoc是一种通过命令行批量管理的方式,基本格式如下
格式:ansible 主机集合 -m 模块名 -a "参数"
选项:[--list-hosts] //固定选项,查看主机清单(列表)
2)Playbook(剧本)
常用模块:Command、Shell、Script
- Command 和 Shell 模块的区别:command不支持bash特性,如管道和重定向等功能,所有需要调用shell的功能都无法使用;
- Shell 模块会启动shell执行命令。不可以使用shell模块执行交互命令,如vim、top;
- Script 允许在本地写脚本,拷贝到被管理端并执行脚本,可以不是shell脚本(如python、perl脚本等),可以没有-x;
2、部署Ansible
整体思路:创建实验主机(控制端和被控制端)、配置SSH实验环境、安装Ansible自动化软件、修改Ansible配置;
环境要求:操作系统为RHEL8,配置主机名称、IP地址、YUM源
控制节点要求:
- 1)域名解析(为了方便后期操作,可不做)
- 2)配置SSH密钥(ansible是基于ssh实现远程控制)
- 3)安装Ansible软件
被控制节点要求:
- 1)Ansible默认通过SSH协议管理机器
- 2)被管理主机要开启SSH服务,并允许控制主机登录
- 3)被管理主机需要安装有Python(默认RHEL8安装)
步骤1:准备基础环境
1)控制节点(Control)
修改/etc/hosts,在文件中手动添加如下内容,修改该文件的目的是做域名解析
[root@control ~]# vim /etc/hosts
...
192.168.4.253 control
192.168.4.11 node1 Control
192.168.4.12 node2
192.168.4.13 node3
192.168.4.14 node4
192.168.4.15 node5
— 验证:使用ping命令依次ping所有主机的域名
[root@control ~]# ping node1
2)配置SSH密钥实现免密码登录(非常重要)
注意:Ansible是基于SSH远程的原理实现远程控制,需实现免密登录被管理端主机
[root@control ~]# ssh-keygen -f /root/.ssh/id_rsa -N '' //生成SSH密钥
[root@control ~]# for i in node{1..5} //通过for循环传递公钥
> do
> ssh-copy-id $i //拷贝密钥到远程被管理端主机
> done
提示:拷贝密钥到远程主机时需要输入对方主机的密码才可完成密钥拷贝
验证:使用ssh命令依次测试所有主机的远程访问
[root@control ~]# ssh node1
3)上传软件压缩包
[root@localhost 2]# scp ansible_soft.tar.gz root@192.168.4.253:/root
ansible_soft.tar.gz 100% 14MB 24.3MB/s 00:00
[root@control ~]# tar -xf ansible_soft.tar.gz //解压ansible_soft.tar.gz
[root@control ~]# ls
anaconda-ks.cfg ansible_soft ansible_soft.tar.gz
[root@control ~]# cd ansible_soft/
[root@control ansible_soft]# ls
ansible-2.8.5-2.el8.noarch.rpm
libsodium-1.0.18-2.el8.x86_64.rpm
python3-bcrypt-3.1.6-2.el8.1.x86_64.rpm
python3-paramiko-2.4.3-1.el8.noarch.rpm
python3-pynacl-1.3.0-5.el8.x86_64.rpm
sshpass-1.06-9.el8.x86_64.rpm
[root@control ansible_soft]# dnf -y install * //【*】代表所有,安装rpm包
步骤2:修改配置文件(主配置文件:ansible.cfg)
Ansible 配置文件检测顺序:
1. 首先检测 ANSIBLE_CONFIG 变量定义的配置文件(默认没有这个变量)
2. 其次检查 当前目录下的./ansible.cfg文件(该当前目录指~/ansible/ansible.cfg)
注意:Ansible在当前目录下找配置文件,所以需要切换到Ansible目录
3. 再次检查 当前用户家目录 下 ~/ansible.cfg 文件
4. 最后检查/etc/ansible/ansible.cfg文件(可参考该文件)
1) 修改主配置文件
[root@control ~]# mkdir ~/ansible //创建ansible目录(以当前目录方式)
[root@control ~]# vim ~/ansible/ansible.cfg //新建主配置文件
[defaults]
inventory = ~/ansible/inventory //指定主机清单配置文件(需手动创建)
#forks = 5 //ssh并发数量(默认并发数为5)
#host_key_checking = False //是否校验密钥(第一次ssh时是否提示yes/no)
注意:指定主机清单配置文件inventory可以是任意文件名,但手动创建主机清单文件时,必须按照主配置文件 inventory 定义的一致;
2)创建并修改主机清单文件
[root@control ~]# vim ~/ansible/inventory
[test] //定义主机组(组名称任意)
node1 //定义组中的具体主机,组中包括一台主机node1
[proxy]
node2
[webserver]
node[3:4] //node[3:4]等同于node3和node4
[database]
node5
[cluster:children] //嵌套组(children为关键字),嵌套组可以在组中包含其他组
webserver
database
- 补充:清单中定义的node,非hostname主机名,而是/etc/hosts文件中解析的node,若需要定义IP,则将node换成IP即可(不能node,IP并用)
- 补充:嵌套组(children为关键字),嵌套组可以在组中包含其他组
- 补充:不建议定义组[all],[all]包含清单中所有的主机
示例1:Ansible ad-hoc应用一(针对命令)
要求:command、shell、script
- 1)测试主机列表中的主机是否可以ping通
- 2)查看被管理主机的服务器信息(如时间、版本、内存等)
- 3)学习ansible-doc命令的用法
- 4)测试command与shell模块的区别
- 5)使用script模块在远程主机执行脚本(装软件包、启服务)
Ansible ad-hoc是一种通过命令行批量管理的方式,命令基本格式如下:
- 格式:ansible 主机集合 -m 模块名 -a "参数"
- 选项:[--list-hosts] //固定选项,查看主机清单(列表)
通过ansible-doc获取帮助:
[root@control ansible]# ansible-doc -l //列出所有模块
a10_server Manage A10 Networks ...
a10_server_axapi3 Manage A10 Networks ...
...[root@control ansible]# ansible-doc -l | grep yum //在所有模块中过滤关键词
yum Manages packages wit...
yum_repository Add or remove YUM re...[root@control ansible]# ansible-doc yum //查看模块帮助
> YUM (/usr/lib/python3.6/site-packages/ansible/modules/packaging/os/yum.py)Installs, upgrade, downgrades, removes, and lists packages andgroups with the `yum' package manager. This module only workson Python 2. If you require Python 3 support see the [dnf]module.* This module is maintained by The Ansible Core Team* note: This module has a corresponding action plugin.
...
Ansible输出的结果:
Success,Changed,Warning,Failed
① SUCCESS 执行成功
② CHANGED 执行成功且发生修改
③ WARRING 告警提示
④ FAILED 执行失败
步骤1:测试环境
1)查看主机列表
[root@control ~]# cd ansible //切换到ansible路径中执行ansible操作
[root@control ansible]# ansible all --list-hosts //查看所有主机列表hosts (5):node1node2node3node4node5
注意:必须切换到ansible路径中执行ansible操作
2)Ping模块测试远程主机(ping测试多个主机或组时,中间使用逗号【,】分隔)
[root@control ansible]# ansible node1 -m ping //调用ping模块
node1 | SUCCESS => { //输出结果SUCCESS"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": false,"ping": "pong"
}
}
[root@control ansible]# ansible node1,webserver -m ping //测试主机和组
[root@control ansible]# ansible all -m ping //测试所有主机
提示:模块叫 ping,不会发送任何ICMP协议的 ping 数据包,控制端主机仅仅是ssh远程被管理端主机并执行模块ping,检查其是否有python环境,能顺利远程并且有Python环境就会返回正确的提示信息,否则报错;
常见报错:未在配置文件路径~/ansible执行ansible操作
[root@control ~]# ansible all --list-hosts[WARNING]: provided hosts list is empty, only localhost is available. Note
that the implicit localhost does not match 'all'
常见报错:UNREACHABLE不能到达的,SSH连接访问失败
node1 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
"unreachable": true
}
- 问题分析:Failed失败,connect连接,via通过,permission权限,denied被拒绝
Failed to connect to host via ssh(通过ssh远程连接到主机失败)
Permission denied(因无法连接,所以权限被拒绝)
- 解决办法:手动ping和ssh主机,验证是否可以实现免密码登录。
3)测试command默认模块及参数(命令)
模块就是脚本(多数为Python脚本),多数脚本都支持参数
补充:默认模块为command,一般可忽略(比其它模块更节省资源)
格式:ansible 主机集合 -m command -a “命令”
[root@control ansible]# ansible node1 -m command -a "date" //查看时间
node1 | CHANGED | rc=0 >>
Thu Apr 22 16:33:14 CST 2021
[root@control ansible]# ansible node1 -a "date" //command为默认模块可忽略
node1 | CHANGED | rc=0 >>
Thu Apr 22 16:33:37 CST 2021[root@control ansible]# ansible node1 -a "uname -r" //查看内核版本
node1 | CHANGED | rc=0 >>
4.18.0-193.el8.x86_64[root@control ansible]# ansible node1,node2 -a "uptime" //查看CPU负载
node2 | CHANGED | rc=0 >>16:52:55 up 2:27, 2 users, load average: 0.00, 0.00, 0.00
node1 | CHANGED | rc=0 >>16:52:55 up 2:27, 2 users, load average: 0.00, 0.00, 0.00[root@control ansible]# ansible node1,proxy -a "date" //查看时间(主机、组)
node1 | CHANGED | rc=0 >>
Thu Apr 22 16:57:16 CST 2021
node2 | CHANGED | rc=0 >>
Thu Apr 22 16:57:16 CST 2021[root@control ansible]# ansible all -a " ip address show" //查看所有主机网卡信息
4)测试shell模块及参数(支持bash特性,命令)
command和shell模块的区别:command不支持bash的特性,如管道和重定向等功能,但是shell模块可以支持;注意不可以使用shell模块执行交互命令(如vim、top等)
格式:ansible 主机集合 -m shell -a “命令”
[root@control ansible]# ansible test -m shell -a "ps aux | wc -l" //查看进程数量
node1 | CHANGED | rc=0 >>
117
[root@control ansible]# ansible test -m shell -a "who" //查看登陆主机信息
node1 | CHANGED | rc=0 >>
root pts/0 Apr 22 14:27 (192.168.4.254)
root pts/1 Apr 22 17:47 (192.168.4.253)
[root@control ansible]# ansible test -m shell -a "touch /tmp/test.txt" //创建文件
node1 | CHANGED | rc=0 >>
补充:使用shell模块创建文件会有Warning警告提示属于正常,提示使用“file”模块来创建文件;
常见报错:
[root@control ansible]# ansible test -m command -a "ps | wc -l" //报错
[root@control ansible]# ansible test -m command -a "ls &" //报错
5)测试script模块及参数(脚本)
script模块会把-a后面的脚本拷贝到被管理端主机,并执行脚本,注意要拷贝的脚本的相对路径或绝对路径(相对路径为以识别配置文件的ansible路径)
格式:ansible 主机集合 -m script -a “要拷贝的脚本的相对路径或绝对路径”
[root@control ansible]# vim ~/ansible/test.sh
#!/bin/bash
dnf -y install httpd
systemctl start httpd
echo "ANSIBLE" > /var/www/html/index.html
[root@control ansible]# ansible test -m script -a "./test.sh" //执行脚本
— 验证:
[root@node1 ~]# cat /var/www/html/index.html
ANSIBLE
[root@node1 ~]# curl 192.168.4.11
ANSIBLE
[root@node1 ~]# systemctl status httpd
[root@node1 ~]# ss -anptul | grep :80
示例2:Ansible ad-hoc应用二(针对文件)
案例要求:file、copy、fetch、lineinfile、replace
- 1)远程目标主机新建文件和目录、修改文件或目录的权限
- 2)在远程目标主机创建链接文件
- 3)删除远程目标主机上的文件或目录
- 4)将控制端本地的文件拷贝到被管理端
- 5)从被管理端下载文件到本地
- 6)修改远程目标主机上的文件内容
补充:很多ansible模块都具有幂等性的特征且更专业性。虽然command、shell、script为“万能模块”,但没有幂等性,每次执行已执行过的任务会报错;
幂等性:任意次执行所产生的影响均与一次执行的影响相同(对已执行过的任务不再执行)
1)file模块及参数
file模块可以创建/删除文件、目录、链接;修改权限与属性等(ansible-doc file)
语法:ansible 主机集合 -m file -a “参数”
参数:path 指定要创建的文件或目录的名称
参数:state=touch创建文件,state=directory创建目录,state=link创建链接
参数:owner=指定所有者,group=指定所属组,mode=指定要修改的权限
参数:state=absent代表删除,state=present代表创建(可忽略)
① 创建文件
[root@control ansible]# ansible test -m file -a "path=/tmp/file.txt state=touch" //在node1中创建文件/tmp/file.txt
[root@control ansible]# ansible test -a "ls /tmp/file.txt" //验证
node1 | CHANGED | rc=0 >>
/tmp/file.txt
解释:控制端主机ssh远程node1,将file.py脚本(file模块)拷贝到node1,在node1主机执行./file.py,参数:path=/tmp/file.txt state=touch;执行后控制端退出ssh。注意file.py脚本必须有参数才可执行,否着脚本执行无意义
② 创建目录
[root@control ansible]# ansible test -m file -a "path=/tmp/mydir state=directory" //在node1中创建目录/tmp/mydir
[root@control ansible]# ansible test -a "ls -ld /tmp/mydir" //验证
node1 | CHANGED | rc=0 >>
drwxr-xr-x. 2 root root 6 Apr 23 09:49 /tmp/mydir
解释:远程test组中所有主机创建目录,path后面指定要创建的目录的名称
③ 创建链接
[root@control ansible]# ansible test -m file -a "src=/etc/hosts path=/tmp/host.txt state=link"
[root@node1 ~]# ls -l /tmp/host.txt //验证
lrwxrwxrwx. 1 root root 10 Apr 23 10:46 /tmp/host.txt -> /etc/hosts
解析:给/etc/hosts文件创建一个链接文件/tmp/host.txt(src指定源文件,path是软链接文件名 state=link 创建链接),相当于执行命令 ln -s /etc/hosts /tmp/host.txt
④ 修改权限
[root@control ansible]# ansible test -m file -a "path=/tmp/file.txt owner=sshd group=adm mode=0777" //在node1对创建的文件修改归属关系和权限
[root@control ansible]# ansible test -a "ls -ll /tmp/file.txt" //验证
node1 | CHANGED | rc=0 >>
-rwxrwxrwx. 1 sshd adm 0 Apr 23 09:31 /tmp/file.txt
解释:修改文件或目录权限,path后面指定要修改的文件名或目录名称,owner后面指定所有者,group后面所属组,mode后面指定要修改的权限(0777中第一个0代表的是无特殊权限,如SUID、SGID等)
⑤ 删除目录
[root@control ansible]# ansible test -m file -a "path=/tmp/mydir state=absent" //在node1中删除目录
[root@control ansible]# ansible test -a "ls /tmp/mydir" //验证
node1 | FAILED | rc=2 >>
ls: cannot access '/tmp/mydir': No such file or directorynon-zero return code
解析:state=absent代表删除(删除目录)
⑥ 删除文件
[root@control ansible]# ansible test -m file -a "path=/tmp/file.txt state=absent" //在node1中删除文件
[root@control ansible]# ansible test -a "ls /tmp/file.txt" //验证
node1 | FAILED | rc=2 >>
ls: cannot access '/tmp/file.txt': No such file or directorynon-zero return code
解析:state=absent代表删除(删除文件)
常见报错:检查state的值是否有字母错误,例子中输入的是touc,不是touch。
[root@control ansible]# ansible test -m file -a "path=/tmp/file.txt state=touc"
node1 | FAILED! => {… …"changed": false,"msg": "value of state must be one of: absent, directory, file, hard, link, touch, got: touc"
}
- 问题分析:value(值),must(必须),be(是),of(…的),one(一个)
value of state must be one of:(state的值必须是后面给出的其中一个值)
常见错误:file模块不支持nmae这个参数
node1 | FAILED! => {… …"msg": "Unsupported parameters for (file) module: nmae Supported parameters include: _diff_peek, _original_basename, access_time, access_time_format, attributes, backup, content, delimiter, directory_mode,follow, force, group, mode, modification_time, modification_time_format, owner,path, recurse, regexp, remote_src, selevel, serole, setype, seuser, src, state,unsafe_writes"
}
- 问题分析:unsupported不支持,parameters参数,supported支持的,include包括
- 解决办法:检查模块的参数是否有字母错误,上面错误案例将name错写为nmae。
2)copy 模块及参数
copy模块可以将文件拷贝到远程主机 (ansible-doc copy)
格式:ansible 主机集合 -m copy -a “scr=源文件 dest=目标文件/目录”
参数:src代表源文件,dest代表目标文件
注意:若需要拷贝目录到被控制端主机,则需要将源目录打成压缩包再拷贝;
[root@control ansible]# echo AAA > ~/AJ.txt //新建测试文件
[root@control ansible]# ansible test -m copy -a "src=~/AJ.txt dest=/root"
[root@control ansible]# ansible test -a "ls /root" //验证
node1 | CHANGED | rc=0 >>
AJ.txt
解释:把管理端本机的测试文件AJ.txt拷贝到test组中node1主机的/root/目录,src代表源文件,dest代表目标文件;
[root@control ansible]# echo ABA > ~/AJ.txt //重定向新的内容
[root@control ansible]# ansible test -m copy -a "src=~/AJ.txt dest=/root"
[root@control ansible]# ansible test -a "cat ~/AJ.txt" //验证
node1 | CHANGED | rc=0 >>
ABA
解释:修改管理端本机的测试文件AJ.txt拷贝到test组中node1主机的/root/目录,内容覆盖为新内容;
[root@control ansible]# ansible test -m copy -a "src=~/AJ.txt dest=/root/AJ2.txt"
[root@control ansible]# ansible test -a "ls /root" //验证
node1 | CHANGED | rc=0 >>
AJ.txt
AJ2.txt
解释:把管理端本机的测试文件AJ.txt再次拷贝到test组中node1主机的/root/目录并将文件名改成AJ2.txt,没有该文件则创建;
3)fetch模块及参数
fetch模块与copy类似,但是作用相反,可以将其他主机的文件拷贝到本地(ansible-doc fetch)
格式:ansible 主机集合 -m fetch -a “src=下载文件路径 dest=目标文件/目录”
注意:不能下载目录,如果需要下载目录,可以先打包后再下载
[root@control ansible]# ansible all -m fetch -a "src=/etc/hostname dest=~/"
[root@control ansible]# cd
[root@control ~]# ls //验证
AJ.txt ansible ansible_soft.tar.gz node2 node4
anaconda-ks.cfg ansible_soft node1 node3 node5
解释:将远程test组中所有主机的hostname文件下载到本地家目录
4)lineinfile|replace模块及参数
修改单个文件的单行内容时可使用lineinfile模块,lineinfile会替换一整行(ansible-doc lineinfile)
格式:ansible 主机集合 -m lineinfile -a “path=指定文件 line=’添加单行的内容’”
参数:path=指定文件 line=添加单行的内容’
注意:基于幂等原则,重复执行,不会创建多行内容
[root@node1 ~]# cat /etc/issue //修改前
\S
Kernel \r on an \m
[root@control ansible]# ansible test -m lineinfile -a "path=/etc/issue line='Hello world'"
[root@node1 ~]# cat /etc/issue //验证
\S
Kernel \r on an \m
Hello world
解释:在/etc/issue文件中添加一行内容hello world,默认添加到最后,line后面跟的是需要添加的文件内容
5)修改单个文件的关键词,使用replace模块,可以替换关键词(ansible-doc replace)
格式:ansible 主机集合 -m replace -a “path=指定文件 regexp 旧内容 replace 新内容 ”
参数:regexp后面是需要替换的旧内容(正则);replace后面是需要替换的新内容
[root@node1 ~]# cat /etc/issue.net //修改前
\S
Kernel \r on an \m
[root@control ansible]# ansible test -m replace -a "path=/etc/issue.net regexp=Kernel replace=Ocean"
[root@node1 ~]# cat /etc/issue.net //验证
\S
Ocean \r on an \m
解释:将node1主机中/etc/issue.net文件全文所有的Kernel替换为Ocean
示例3:Ansible ad-hoc应用三
案例要求:user、yum_repository、yum、service、lvg、lvol
- 1)远程目标主机创建、删除系统账户;设置系统账户属性、修改账户密码
- 2)为目标主机创建、删除yum源配置文件;远程目标主机安装、卸载软件包
- 3)使用service模块管理远程主机的服务
- 4)创建、删除逻辑卷
1)user模块及参数
user模块可以实现Linux系统账户管理(ansible-doc user)
格式:ansible 主机集合 -m user -a “参数”
参数:name=指定用户
参数:uid指定用户ID号,group指定用户属于哪个基本组(基本组唯一),groups指定用户属于哪些附加组,home指定用户的家目录,password修改密码
① 添加用户
[root@node1 ~]# id tuser1 //修改前
id: 'tuser1': no such user
[root@control ansible]# ansible test -m user -a "name=tuser1"
[root@node1 ~]# id tuser1 //验证
uid=1000(tuser1) gid=1000(tuser1) groups=1000(tuser1)
解释:控制端主机SSH远程test组中的node1主机,将user.py脚本(user模块)拷贝到node1并执行./user.py name=tuser1,(相当于执行useradd tuser1,useradd没有参数则无意义),默认state的值为present,代表创建用户;执行后控制端退出SSH远程连接;
② 添加用户(指定uid、group基本组、groups附加组、home家目录)
[root@node1 ~]# id tuser2 //修改前
id: 'tuser2': no such user
[root@control ansible]# ansible test -m user -a "name=tuser2 uid=1010 group=adm groups=daemon,root home=/home/tuser2"
[root@node1 ~]# id tuser2 //验证
uid=1010(tuser2) gid=4(adm) groups=4(adm),2(daemon),0(root)
解释:创建账户并设置对应的账户属性,uid指定用户ID号,group指定用户属于哪个基本组,groups指定用户属于哪些附加组,home指定用户的家目录
③ 为用户创建密码
[root@control ansible]# ansible test -m user -a "name=tuser1 password=‘123’"
注意:该方式加密可以修改成功,但/etc/shadow能看到明文密码,所以需要对密码加密
[root@control ansible]# ansible test -m user -a "name=tuser1 password={{'abc' | password_hash('sha512')}}"
[root@node1 ~]# sed -n '/^tuser1/p' /etc/shadow
tuser1:$6$gY2CJSYKit3MP8k6$YMno1XfoZPtD8iLrqoreWv63WS3/SywIZAsPjcaUM6Ym1xpDf929l5L6Kks2H55dikxWDmflM5UxE1STIfxRe.:18740:0:99999:7:::
- 注意:【password={{}}】,双花括号是固定语法
- 注意:password无幂等性,执行多少次相同任务,都能成功执行;
解释:修改账户密码,用户名是tuser1,密码是abc,密码经过sha512加密
④ 删除用户
[root@control ansible]# ansible test -m user -a "name=tuser1 state=absent"
[root@control ansible]# id tuser1 //验证,用户tuser1已删除
id: 'tuser1': no such user
[root@node1 ~]# ls /home/ //删除了用户,但家目录还在
tuser1 tuser2
解释:删除账户tuser1,state=absent代表删除账户,name指定要删除用户名是什么
⑤ 删除用户(包括家目录、邮箱)
注意:不加remove=true参数,用户的家目录不会被删除,相当于执行userdel tuser1,若需要删除用户家目录,只能通过新建别的脚本或直接到tuser1的家目录进行删除等操作;
[root@control ansible]# ansible test -m user -a "name=tuser2 state=absent remove=true"
[root@node1 ~]# id tuser2 //验证,用户tuser2已删除
id: 'tuser2': no such user
[root@node1 ~]# ls /home/ //家目录已删除
tuser1
[root@node1 ~]# ls /var/spool/mail/ //用户邮箱已删除
tuser1
解释:删除tuser2账户同时删除家目录、邮箱,相当于执行userdel -r tuser2
补充:remote可以写true或yes,false或no
2)yum_repository模块
使用yum_repository可以创建或修改yum源配置文件(ansible-doc yum_repository)
格式:ansible 主机集合 -m yum_repository -a “name=仓库标识 description=描述 baseurl=yum源路径 gpgcheck=0 [enabled=1]”
① 新建一个yum源配置文件
[root@control ansible]# ansible test -m yum_repository -a "name=myyum description=hello baseurl=ftp://8.8.8.8/centos gpgcheck=0"
node1 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true,"repo": "myyum","state": "present"
}
[root@control ansible]# ansible test -a "ls /etc/yum.repos.d/" //验证
node1 | CHANGED | rc=0 >>
myyum.repo[root@node1 ~]# cat /etc/yum.repos.d/myyum.repo //验证
[myyum]
name = hello
baseurl = ftp://8.8.8.8/centos
gpgcheck = 0
补充:可以不填写enabled=1,默认开启;gpgcheck可以写no或者0
② 基于幂等性,修改yum源文件内容
[root@control ansible]# ansible test -m yum_repository -a "name=myyum description=test baseurl=ftp://9.9.9.9/centos gpgcheck=1"
[root@node1 ~]# cat /etc/yum.repos.d/myyum.repo //验证
[myyum]
baseurl = ftp://9.9.9.9/centos
gpgcheck = 1
name = test
③ 删除YUM源文件
[root@control ansible]# ansible test -m yum_repository -a "name=myyum state=absent"
[root@node1 ~]# cat /etc/yum.repos.d/myyum.repo //验证
cat: /etc/yum.repos.d/myyum.repo: No such file or directory
④ 创建多个yum源
- 方法1:可直接再创建repo的方式,最终拥有两个repo文件;
- 方法2:相同repo写入两个仓库信息,使用参数“file=文件名”,文件名同名即可;
[root@control ansible]# ansible test -m yum_repository -a "file=myyum name=yum description=test baseurl=ftp://6.6.6.6/centos gpgcheck=1"
[root@node1 yum.repos.d]# cat myyum.repo //验证
[myyum]
baseurl = ftp://9.9.9.9/centos
gpgcheck = 1
name = test[yum]
baseurl = ftp://6.6.6.6/centos
gpgcheck = 1
name = test
补充:修改同名的.repo文件,即可在一个仓库文件中创建多条仓库信息;
3)yum模块及参数
使用yum模块可以安装、卸载、升级软件包(ansible-doc yum)
格式:ansible 主机集合 -m yum -a “name=软件包 state=present/absent/latest”
参数:state=present安装 | absent卸载 | latest升级
① 安装软件包
[root@control ansible]# ansible test -m yum -a "name=unzip state=present"
[root@node1 ~]# rpm -q unzip //验证
unzip-6.0-43.el8.x86_64
解释:安装unzip软件包,state默认为present(可忽略)
② 升级软件包
[root@control ansible]# ansible test -m yum -a "name=unzip state=latest"
解释:升级unzip软件包,软件名称可以是*,代表升级所有软件包
③ 卸载软件包
[root@control ansible]# ansible test -m yum -a "name=unzip state=absent"
[root@node1 ~]# rpm -q unzip
package unzip is not installed
解释:调用yum模块,卸载unzip软件包,state=absent代表卸载软件
4)service模块及参数
service为服务管理模块启动、关闭、重启、开机自启服务等(ansible-doc service)
格式:ansible 主机集合 -m service -a “name=服务名 state=started/stopped/restarted”
格式:ansible 主机集合 -m service -a “name=服务名 enabled=yes/1/true”
参数:state:started启动 | stopped关闭 | restarted重启服务
参数:enabled:yes设置开机启动
补充:systemctl程序认start、enable;ansible认started、enabled(其它同理)
① 调用service模块,启动httpd服务
[root@control ansible]# ansible test -m yum -a "name=httpd" //调用yum模块,安装httpd软件包
[root@control ansible]# ansible test -a "rpm -q httpd"
node1 | CHANGED | rc=0 >>
httpd-2.4.37-21.module+el8.2.0+5008+cca404a3.x86_64[root@control ansible]# ansible test -m service -a "name=httpd state=started"
[root@node1 ~]# systemctl status httpd //验证
● httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor pres>Active: active (running) since Fri 2021-04-23 16:21:09 CST; 19s ago
...
② 调用service模块,关闭httpd服务
[root@control ansible]# ansible test -m service -a "name=httpd state=stopped"
[root@node1 ~]# systemctl status httpd //验证
● httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor pres>Active: inactive (dead)
...
③ 调用service模块,重启httpd服务
[root@control ansible]# ansible test -m service -a "name=httpd state=restarted"
④ 调用service模块,设置httpd服务开机自启(enabled可以写yes、1、true)
[root@control ansible]# ansible test -m service -a "name=httpd enabled=yes"
5)逻辑卷相关模块lvg模块、lvol模块及参数
lvg模块,创建、删除卷组(VG),修改卷组大小(ansible-doc lvg)
格式:ansible 主机集合 -m lvg -a “vg=卷组名 pvs=单个或多个物理卷”
格式:ansible 主机集合 -m lvg -a “vg=卷组名 state=absent”
参数:state:present创建 | absent删除
例如:
1)实验前需给对应的被控制端主机添加额外磁盘并给磁盘创建2个空闲分区
[root@node1 ~]# parted /dev/vdb //步骤省略
[root@node1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 253:0 0 30G 0 disk
`-vda1 253:1 0 20G 0 part /
vdb 253:16 0 20G 0 disk
|-vdb1 253:17 0 3.7G 0 part
`-vdb2 253:18 0 3.7G 0 part
2)安装lvm2软件包,安装后才有pvcreate、vgcreate、lvcreate等命令
[root@control ansible]# yum provides lvcreate //根据服务名查找对应软件包
lvm2-8:2.03.08-3.el8.x86_64
...
[root@control ansible]# ansible test -m yum -a "name=lvm2" //安装lvm2
[root@node1 ~]# rpm -q lvm2 //验证查看
lvm2-2.03.08-3.el8.x86_64
① 创建名称为myvg的卷组,卷组由/dev/vdb1组成(分区名称要根据实际情况填写)
[root@control ansible]# ansible test -m lvg -a "vg=myvg pvs=/dev/vdb1"
[root@node1 ~]# vgs //验证VG #PV #LV #SN Attr VSize VFreemyvg 1 0 0 wz--n- 3.72g 3.72g
② 修改卷组大小,通过卷组中添加一个设备/dev/sdb2,实现卷组的扩容
[root@control ansible]# ansible test -m lvg -a "vg=myvg pvs=/dev/vdb1,/dev/vdb2"
[root@node1 ~]# vgs //验证VG #PV #LV #SN Attr VSize VFreemyvg 2 0 0 wz--n- <7.45g <7.45g
lvol模块,创建、删除逻辑卷(LV),修改逻辑卷大小(ansible-doc lvol)
格式:ansible 主机集合 -m lvol -a “lv=逻辑卷名 vg=卷组名 size=大小”
格式:ansible 主机集合 -m lvol -a “lv=逻辑卷名 vg=卷组名 state=absent force=yes”
参数:state:present创建 | absent删除
① 使用myvg这个卷组创建一个名称为mylv的逻辑卷,大小为1G
[root@control ansible]# ansible test -m lvol -a "lv=mylv vg=myvg size=1G"
[root@node1 ~]# lvs //验证LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convertmylv myvg -wi-a----- 1.00g
[root@node1 ~]# lvscanACTIVE '/dev/myvg/mylv' [1.00 GiB] inherit
② 修改LV逻辑卷大小为3G
[root@control ansible]# ansible test -m lvol -a "lv=mylv vg=myvg size=3G"
[root@node1 ~]# lvs //验证LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convertmylv myvg -wi-a----- 3.00g
③ 删除逻辑卷,force=yes是强制删除(因Ansible认为逻辑卷还有数据,所以要强制)
[root@control ansible]# ansible test -m lvol -a "lv=mylv vg=myvg state=absent force=yes"
④ 删除卷组myvg(需要先删除逻辑卷才能删除卷组)
[root@control ansible]# ansible test -m lvg -a "vg=myvg state=absent"
思维导图:
小结:
本篇章节为【第二阶段】AUTOMATION-DAY4 的学习笔记,这篇笔记可以初步了解到 部署Ansible、Ansible基础命令(Ansible ad-hoc命令格式、Ansible-doc帮助)、Ansible模块常用:脚本与命令模块、文件与账户模块、软件与服务模块、逻辑卷模块。
Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解