徐亮伟, 江湖人称标杆徐。多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型电商运维工作。
个人博客"徐亮伟架构师之路"累计受益数万人。
点击传送至个人课程主页
最新运维体系化课程+大量企业案例实战,让高并发集群架构的学习不再零散与难以实践课程传送门
1.自动化运维的含义
1.手动运维时代
2.自动化运维时代
3.自动化运维工具给运维带来的好处
2.Ansible 基础及安装
1.什么是Ansible
Ansible是python 中的一套模块,系统中的一套自动化工具,只需要使用ssh
协议连接及可用来系统管理、自动化执行命令等任务。
2.Ansible优势
1、ansible不需要单独安装客户端,也不需要启动任何服务
2、ansible是python中的一套完整的自动化执行任务模块
3、ansible playbook,采用yaml配置,对于自动化任务执行一目了然
4、ansible 模块较多,对于自动化的场景支持较丰富
3.Ansible架构
1、连接插件connectior plugins用于连接主机 用来连接被管理端
2、核心模块 core modules 连接主机实现操作, 它依赖于具体的模块来做具体的事情
3、自定义模块 custom modules,根据自己的需求编写具体的模块
4、插件 plugins,完成模块功能的补充
5、剧本 playbooks,ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行
6、主机清单 inventor,定义ansible需要操作主机的范围
最重要的一点是 ansible是模块化的 它所有的操作都依赖于模块
4.Ansible安装
[root@m01 ~]# yum install ansible -y
#检查ansible版本
[root@m01 ~]# ansible --version
ansible 2.6.1
3.Ansible inventory
/etc/ansible/hosts
主机资产清单文件,用于定义被管理主机的认证信息, 例如ssh登录用户名、密码以及key相关信息。如何配置Inventory
文件
1.主机支持主机名通配以及正则表达式,例如web[1:3].oldboy.com
代表三台主机
2.主机支持基于非标准的ssh端口,例如web1.oldboy.com:6666
3.主机支持指定变量,可对个别主机的特殊配置,如登陆用户,密码
4.主机组支持指定变量[group_name:vars]
,同时支持嵌套组[game:children]
场景一、基于密码连接
[root@oldboy.com ~]# cat /etc/ansible/hosts
#方式一、主机+端口+密码
[webservers]
10.0.0.31 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
10.0.0.41 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
#方式二、主机+端口+密码
[webservers]
web[1:2].oldboy.com ansible_ssh_pass='123456'
#方式三、主机+端口+密码
[webservers]
web[1:2].oldboy.com
[webservers:vars]
ansible_ssh_pass='123456'
场景二、基于密钥连接,需要先创建公钥和私钥,并下发公钥至被控端
利用非交换式工具实现批量分发公钥与批量管理服务器
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.41
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.31
#方式一、主机+端口+密钥
[group_name]
10.0.0.31:22
10.0.0.41
#方式二、别名+主机+端口+密钥
[group_name]
nfs-node1 ansible_ssh_host=10.0.0.31 ansible_ssh_port=22
场景三、主机组使用方式
#方式一、主机组变量+主机+密码
[group_name1]
10.0.0.31
10.0.0.41
[group_name1:vars]
ansible_ssh_pass='123456'
#方式二、主机组变量+主机+密钥
[group_name2]
10.0.0.7
10.0.0.8
#定义多组,多组汇总整合
# webservers组包括两个子组[apapche,nginx]
[webservers:children]
[group_name1]
[group_name2]
4.Ansible Ad-Hoc
1.什么是ad-hoc模式
ad-hoc简而言之,就是“临时命令”,不会保存
ansible中有两种模式, 分别是ad-hoc模式和playbook模式
2.ad-hoc模式的使用场景
场景一,在多台机器上,查看某个进程是否启动
场景二,在多台机器上,拷贝指定日志文件到本地,等等
3.ad-hoc模式的命令使用
4.ad-hoc模式的常用模块
Ansible执行返回->颜色信息说明
黄色:对远程节点进行相应修改
绿色:对远程节点不进行相应修改,或者只是对远程节点信息进行查看
红色:操作执行命令有异常
紫色:表示对命令执行发出警告信息(可能存在的问题,给你一下建议)
1.command
命令模块
# 默认模块, 执行命令
[root@m01 ~]# ansible oldboy -a "hostname"
# 如果需要一些管道操作,则使用shell
[root@m01 ~]# ansible oldboy -m shell -a "ifconfig|grep eth0" -f 50
# -f =forks /etc/ansible/ansible.cfg #结果返回的数量
2.script
脚本模块
# 编写脚本
[root@m01 ~]# mkdir -p /server/scripts
[root@m01 ~]# cat /server/scripts/yum.sh
#!/usr/bin/bash
yum install -y iftop
#在本地运行模块,等同于在远程执行,不需要将脚本文件进行推送目标主机执行
[root@m01 ~]# ansible oldboy -m script -a "/server/scripts/yum.sh"
3.yum
安装软件模块
[root@m01 ~]# ansible oldboy -m yum -a "name=httpd state=installed"
name #指定要安装的软件包名称
state #指定使用yum的方法
installed,present #安装软件包
removed,absent #移除软件包
latest #安装最新软件包
4.copy
文件拷贝模块
# 推送文件模块
[root@m01 ~]# ansible oldboy -m copy -a "src=/etc/hosts dest=/tmp/test.txt"
# 在推送覆盖远程端文件前,对远端已有文件进行备份,按照时间信息备份
[root@m01 ~]# ansible oldboy -m copy -a "src=/etc/hosts dest=/tmp/test.txt backup=yes"
# 直接向远端文件内写入数据信息,并且会覆盖远端文件内原有数据信息
[root@m01 ~]# ansible oldboy -m copy -a "content='bgx' dest=/tmp/oldboy"
src #推送数据的源文件信息
dest #推送数据的目标路径
backup #对推送传输过去的文件,进行备份
content #直接批量在被管理端文件中添加内容
group #将本地文件推送到远端,指定文件属组信息
owner #将本地文件推送到远端,指定文件属主信息
mode #将本地文件推送到远端,指定文件权限信息
5.file
文件配置模块
[root@m01 ~]# ansible oldboy -m file -a "path=/tmp/oldboy state=directory"
[root@m01 ~]# ansible oldboy -m file -a "path=/tmp/tt state=touch mode=555 owner=root group=root"
[root@m01 ~]# ansible oldboy -m file -a "src=/tmp/tt path=/tmp/tt_link state=link"
path #指定远程主机目录或文件信息
recurse #递归授权
state
directory #在远端创建目录
touch #在远端创建文件
link #link或hard表示创建链接文件
absent #表示删除文件或目录
mode #设置文件或目录权限
owner #设置文件或目录属主信息
group #设置文件或目录属组信息
6.service
服务模块
[root@m01 ~]# ansible oldboy -m service -a "name=crond state=stopped enabled=yes"
name # 定义要启动服务的名称
state # 指定服务状态
started #启动服务
stopped #停止服务
restarted #重启服务
reloaded #重载服务
enabled #开机自启
7.group
组模块
[root@m01 ~]# ansible oldboy -m group -a "name=oldgirl gid=888"
name #指定创建的组名
gid #指定组的gid
state
absent #移除远端主机的组
present #创建远端主机的组(默认)
8.user
模块
#创建用户指定uid和gid,不创建家目录也不允许登陆
[root@m01 ~]# ansible oldboy -m user -a "name=oldgirl uid=888 group=888 shell=/sbin/nologin create_home=no"
#将明文密码进行hash加密,然后进行用户创建
[root@m01 ~]# ansible localhost -m debug -a "msg={{ 'bgx' | password_hash('sha512', 'salt') }}"
localhost | SUCCESS => {
"msg": "$6$salt$WP.Kb1hMfqJG7dtlBltkj4Um4rVhch54R5JCi6oP73MXzGhDWqqIY.JkSOnIsBSOeXpKglY7gUhHzY4ZtySm41"
}
[root@m01 ~]# ansible oldboy -m user -a 'name=xlw password=$6$salt$WP.Kb1hMfqJG7dtlBltkj4Um4rVhch54R5JCi6oP73MXzGhDWqqIY.JkSOnIsBSOeXpKglY7gUhHzY4ZtySm41 create_home=yes shell=/bin/bash'
uid #指定用户的uid
group #指定用户组名称
groups #指定附加组名称
password #给用户添加密码
shell #指定用户登录shell
create_home #是否创建家目录
8.crond
定时任务模块
# 正常使用crond服务
[root@m01 ~]# crontab -l
* * * * * /bin/sh /server/scripts/yum.sh
# 使用ansible添加一条定时任务
[root@m01 ~]# ansible oldboy -m cron -a "minute=* hour=* day=* month=* weekday=* job='/bin/sh /server/scripts/test.sh'"
[root@m01 ~]# ansible oldboy -m cron -a "job='/bin/sh /server/scripts/test.sh'"
# 设置定时任务注释信息,防止重复,name设定
[root@m01 ~]# ansible oldboy -m cron -a "name='cron01' job='/bin/sh /server/scripts/test.sh'"
# 删除相应定时任务
[root@m01 ~]# ansible oldboy -m cron -a "name='ansible cron02' minute=0 hour=0 job='/bin/sh /server/scripts/test.sh' state=absent"
# 注释相应定时任务,使定时任务失效
[root@m01 scripts]# ansible oldboy -m cron -a "name='ansible cron01' minute=0 hour=0 job='/bin/sh /server/scripts/test.sh' disabled=no"
9.mount
模块
[root@m01 ~]# ansible oldboy -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=present"
[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=mounted"
[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=unmounted"
[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=absent"
present # 开机挂载,仅将挂载配置写入/etc/fstab
mounted # 挂载设备,并将配置写入/etc/fstab
unmounted # 卸载设备,不会清除/etc/fstab写入的配置
absent # 卸载设备,会清理/etc/fstab写入的配置
10.ansible查看帮助方法
[root@m01 ~]# ansible-doc -l --- 查看所有模块说明信息
[root@m01 ~]# ansible-doc copy --- 表示指定查看某个模块参数用法信息