【讲清楚,说明白!】Ansible运维自动化初步解析

(1)运维自动化发展历程及技术应用
【讲清楚,说明白!】Ansible运维自动化初步解析
随着运维自动化的发展,企业搭建生产环境经历的过程由最原始的本地部署方式,再到选择IaaS的基础设施即服务时代,接着到选择PaaS的平台即服务时代,最后到选择SaaS的软件即服务时代的过程。下图就是用形象的方式展示了运维自动化的发展历程。
【讲清楚,说明白!】Ansible运维自动化初步解析
(2)运维工程师的核心职责
平台架构组建:负责参与并审核架构设计的合理性和可运维性,搭建运维平台技术架构,通过开源解决方案,以确保在产品发布之后能高效稳定的运行,保障并不断提升服务的可用性,确保用户数据安全,提升用户体验。
日常运营保障:负责用运维技术或者运维平台确保产品可以高效的发布上线,负责保障产品7*24H稳定运行,在此期间对出现的各种问题可以快速定位并解决;在日常工作中不断优化系统架构和部署的合理性,以提升系统服务的稳定性。
性能、效率优化:用自动化的工具/平台提升软件在研发生命周期中的工程效率、不断优化架构、提升部署效率、优化资源利用率支持产品的不断迭代,需要不断的进行架构优化调整。以确保整个产品能够在功能不断丰富和复杂的条件下,同时保持高可用性。
(3)企业实际应用场景分析
(3.1)Dev开发环境
使用者:程序员
功能:程序员开发软件,测试BUG的环境
管理者:程序员
(3.2)测试环境
使用者:QA测试工程师
功能:测试经过Dev环境测试通过的软件的功能
管理着:运维
说明:测试环境往往有多套,测试环境满足测试功能即可,不宜过多。测试人员希望测试环境有多套,公司的多产品线并发,即多个版本,意味着多个版本同步测试;通常测试环境有多少套和产品线数量保持一样
(3.3)发布环境:代码发布机,有些公司为堡垒机(安全屏障)
使用者:运维
功能:发布代码至生产环境
管理者:运维(有经验)
发布机:往往需要有2台(准备)
(3.4)生产环境
使用者:运维,少数情况开放权限给核心开发人员,极少数公司将权限完全开放给开发人员并维护
功能:对用户提供公司产品的服务
管理者:只能是运维
生产环境服务器数量:一般比较多,且应用非常重要,往往需要自动工具协助部署配置应用
(3.5)灰度环境:(生产环境的一部分)
使用者:运维
功能:在全量发布代码前将代码的功能面向少量精准用户发布的环境,可基于主机或用户执行灰度发布
案例:共100台生产服务器,先发布其中的10台服务器,这10台服务器就是灰度服务器
管理者:运维
灰度环境:往往该版本功能变更较大,为保险起见特意先让一部分用户优化体验功能,待这部分用户使用没有重大问题的时候,再全量发布至所有服务器
(3.6)程序发布
预发布验证:新版本的代码先发布到服务器(跟线上环境配置完全相同,只是未接入到调度器)
程序发布:不能导致系统故障或造成系统完全不可用;不能影响用户体验
灰度发布:
发布路径:/webapp/tuangou-1.1
/webapp/tuangou
/webapp/tuangou-1.2
发布过程:在调度器上下线一批主机(标记为maintance状态)-->关闭服务-->部署新版本的应用程序-->启动服务-->在调度器上启用这一批服务器
自动化灰度发布:脚本、发布平台
(4)环境准备
【讲清楚,说明白!】Ansible运维自动化初步解析
【讲清楚,说明白!】Ansible运维自动化初步解析
(4.1)
# cd /etc/yum.repos.d
进入到yum.repos.d目录下
# wget -O epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
下载epel源
# yum install ansible -y
安装ansible软件
# ansible --version
查看ansible的版本
# ansible 192.168.26.131,192.168.26.132 -m ping -k
在130服务器上连接131和132主机,并使用ask的模式连接,查看是否连接成功
# ansible all -m ping -k
可以对/etc/ansible/hosts所有主机都进行连接测试,查看是否连接成功
【讲清楚,说明白!】Ansible运维自动化初步解析
(4.2)
我们也可以在/etc/ansible/hosts文件中将每台主机进行分组,此时可以使用组名来连接对应的主机
# ansible dbsrvs -m ping -k
连接dbsrvs组对应的服务器的信息,查看是否连接成功
【讲清楚,说明白!】Ansible运维自动化初步解析
# ansible all -m ping -vvv
可以查看ansible命令在执行的时候执行的所有过程信息
(4.3)将/etc/ansible/ansible.cfg配置文件中的log_path = /var/log/ansible.log的注释取消掉,此时所有ansible的操作都会记录在日志当中
【讲清楚,说明白!】Ansible运维自动化初步解析
【讲清楚,说明白!】Ansible运维自动化初步解析
将/etc/ansible/ansible.cfg配置文件中的host_key_checking = False注释取消掉,此时在ssh连接到主机时,就不需要再输入yes的应答了。
【讲清楚,说明白!】Ansible运维自动化初步解析
【讲清楚,说明白!】Ansible运维自动化初步解析
(4.4)
# ansible-doc -l | wc -l
统计doc文档查看所包含的所有模块
# ansible-doc -s ping
以片段的方式查看指定模块的帮助用法
# ansible all --list-hosts
可以列出主机清单中的所有主机
# ansible all -m ping -u wang -k
如果在成员服务器中存在一个wang用户,那么我们可以使用wang用户在Master主机上去执行测试是否连接成功
(4.5)如果我们希望在130服务器上能够使用wang用户通过sudo执行root的命令
# usermod -aG wheel wang
在131和132服务器上将wang用户加入到wheel的附加组中(编辑/etc/sudoers文件)
【讲清楚,说明白!】Ansible运维自动化初步解析
# ansible all -m command -a 'ls /root' -u wang -k -b -K
m表示使用命令行,a参数表示指定的命令,u参数表示用户,k表示ask,b表示默认使用root用户的权限,K表示输入sudo时二次验证
【讲清楚,说明白!】Ansible运维自动化初步解析
(4.6)如果我们希望在130服务器上能够使用wang用户通过sudo执行root的命令,同时不用输入二次验证的密码,可以在131和132主机的# vim /etc/sudoers文件中进行修改
【讲清楚,说明白!】Ansible运维自动化初步解析
# ansible all -m command -a 'ls /root' -u wang -k -b
m表示使用命令行,a参数表示指定的命令,u参数表示用户,k表示ask,b表示默认使用root用户的权限,此时不用再输入二次验证的参数了
(4.7)创建基于密钥验证的方式
# ssh-keygen
创建ssh密钥
# ssh-copy-id 192.168.26.131
# ssh-copy-id 192.168.26.132
将130主机上创建的密钥传送到131和132服务器上
【讲清楚,说明白!】Ansible运维自动化初步解析
# ansible all -m ping
此时我们便可以正常的完成基于密钥进行验证的命令执行了
【讲清楚,说明白!】Ansible运维自动化初步解析
(4.8)
# ansible websrvs --list
查询对应组名中的具体主机信息
# ansible srvs -m ping
使用
号通配符匹配组名信息
# ansible 192.168.26. -m ping
使用
号匹配IP地址信息
# ansible websrvs:dbsrvs -m ping
表示逻辑“或”的关系
# ansible 'websrvs:&dbsrvs' -m ping
表示逻辑与,在websrvs组并且在dbsrvs组中主机
# ansible 'websrvs:!dbsrvs' -m ping
表示逻辑非,在在websrvs组但不在dbsrvs组中主机
# ansible '~(web|db)srvs' -m ping
使用正则表达式其中~符号表示使用正则表达式语法
(4.9)ansible命令执行过程
1.加载自己的配置文件,默认为/etc/ansible/ansible.cfg
2.加载自己对应的模块文件,如command
3.通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/xxx.py文件
4.给文件+x执行
5.执行并返回结果
6.删除临时py文件,sleep 0退出
执行状态:
1.绿色:执行成功并且不需要做改变的操作
2.黄色:执行成功并且对目标主机做变更
3.红色:执行失败
(4.10)使用示例
# ansible all -m ping -u wang -k
以wang用户执行ping存活检测
# ansible all -m ping -u wang -b -k
以wang用户sudo至root执行ping存活检测
# ansible all -m ping -u wang -b -k --become-user=root
以wang用户sudo之root用户执行ping存活检测
# ansible all -m command -u wang --become-user=root -a 'ls /root' -b -k -K(两次密码都是输入wang用户的)
以wang用户sudo至root用户执行ls
# ansible all -m command -a 'ls -ld /data'
查看各个主机上的/data目录下的文件
(4.11)
# ansible-doc command
查看command命令。其中creates表示其中一个文件或者一个模式已经存在了,将不作后面的操作了;removes表示其中一个文件或者一个模式不存在,将不作后面的操作了
【讲清楚,说明白!】Ansible运维自动化初步解析
# ansible all -a 'chdir=/boot ls'
表示切换到/boot目录下执行ls命令
# ansible 192.168.26.* -a 'useradd test1'
创建一个用户test1
# ansible 192.168.26.* -a 'getent passwd test1'
查询创建的用户test1是否有生成
(5)ansible常用模块
(5.1)
Ping模块:测试主机是否可以连接
Command:在远程主机执行命令,默认模块,可忽略-m选项;此命令不支持$VARNAME、<、>、|、&等,需用shell模块实现
Shell:和command相似,用shell执行命令
Script:运行脚本
# ansible 192.168.26.* -m shell -a 'echo $HOSTNAME'
使用shell模块查询主机名
# ansible 192.168.26.* -m shell -a 'echo redhat | passwd --stdin test1'
使用shell模块改其他主机的test1用户的密码
【讲清楚,说明白!】Ansible运维自动化初步解析
# ansible 192.168.26.* -m shell -a '> /data/f2'
在其他主机的data目录下创建一个空文件f2
# ansible 192.168.26.* -m shell -a 'ls /data'
查询data目录下的所有文件信息
# ansible 192.168.26.132 -m shell -a 'hostname node02'
将132服务器的主机名修改为node02
# ansible all -m script -a '/root/ansible/host.sh'
使用script模块执行本地服务器上的host.sh脚本
(5.2)
Copy:从服务器复制文件到客户端,如果目标存在,默认覆盖,此处指定先备份
# ansible all -m copy -a 'src=/root/ansible/config dest=/etc/selinux/config backup=yes'
使用copy模块,将本地的config文件拷贝到远端主机的/etc/selinux目录下,并且能够进行备份
# ansible all -m shell -a 'ls /etc/selinux/'
使用ls命令查看到config文件已经产生备份信息了
【讲清楚,说明白!】Ansible运维自动化初步解析
# ansible all -m copy -a 'src=/etc/shadow dest=/data/'
将130服务器上的shadow文件拷贝到其他主机的data目录下
# ansible all -m shell -a 'ls -l /data/shadow''
此时我们使用ls命令发现文件复制过去后权限信息自动发生了其他的改变,由000变成了644
【讲清楚,说明白!】Ansible运维自动化初步解析
# ansible all -m copy -a 'src=/etc/shadow dest=/data/ mode=000 owner=wang'
将130服务器上的shadow文件拷贝到其他主机的data目录下,同时权限修改为000,属主信息修改为wang
# ansible all -m shell -a 'ls -l /data/shadow'
此时我们发现相关的属性信息已经发生了修改
【讲清楚,说明白!】Ansible运维自动化初步解析
# ansible all -m copy -a 'content="hello\nthanks\n" dest=/data/f2'
使用content参数可以直接在远端主机的对应目录下的文件中生成内容
# ansible all -m shell -a 'cat /data/f2'
查看f2文件中生成的内容信息
(5.3)
Fetch:从客户端抓取文件至服务器端,copy相反,目录可先tar
# ansible all -m fetch -a 'src=/var/log/messages dest=/data'
从各主机上将/var/log/messages文件抓取到本地/data目录下
# tree /data
查看当前130主机上的目录结构
【讲清楚,说明白!】Ansible运维自动化初步解析
# ansible all -m shell -a 'tar zcvf log.tar.gz /var/log/*.log'
我们将/var/log目录下的所有.log结尾的文件进行压缩成log.tar.gz文件并放在各主机的root家目录下
# ansible all -m fetch -a 'src=/root/log.tar.gz dest=/data/'
将生成的log.tar.gz文件拷贝到本地130主机的/data目录下
# tree /data
查看当前130主机上的目录结构
【讲清楚,说明白!】Ansible运维自动化初步解析
# tar tvf /data/192.168.26.131/root/log.tar.gz
以不解压的方式查看被压缩的文件log.tar.gz中的内容信息
【讲清楚,说明白!】Ansible运维自动化初步解析
(5.4)File模块:设置文件属性
# ansible all -m file -a 'name=/data/f3 state=touch'
使用file模块创建在/data目录下创建f3文件,注意:name与dest、path的意思一致
# ansible all -a 'ls -l /data'
查看创建的f3文件是否存在
# ansible all -m file -a 'name=/data/f3 state=absent'
使用file模块同时使用absent参数删除f3文件
# ansible all -m file -a 'name=/data/dir1 state=directory'
使用file模块同时使用directory参数创建一个文件夹,注意:如果删除文件夹也是使用absent参数
# ansible all -m file -a 'src=/etc/fstab dest=/data/fstab.link state=link'
创建一个软链接,其中源是/etc/fstab,目的文件为fstab.link
# ansible all -a 'ls -l /data'
查看软链接是否有生成
【讲清楚,说明白!】Ansible运维自动化初步解析
# ansible all -m file -a 'dest=/data/fstab.link state=absent'
如果软链接不需要了,将软链接删除
(5.5)Hostname模块:管理主机名
# vim /etc/hostname
一般修改主机名在hostname文件中配置主机名信息,然后重启主机即可生效
# ansible 192.168.26.131 -m hostname -a 'name=node01.example.com'
修改131主机的主机名为node01.example.com
(5.6)Cron模块:计划任务
# ansible all -m cron -a 'minute=* weekday=1,3,5,7 job="/usr/bin/wall FBI waring" name=warningcron'
创建一个计划任务,在每周1,3,5,7的没一分钟执行一次告警信息
# ansible all -m cron -a 'disabled=true job="/usr/bin/wall FBI warning" name=warningcron'
将创建的计划任务warningcron使用disabled参数进行注释掉,使得告警信息解除
# ansible all -m cron -a 'job="/usr/bin/wall FBI warning" name=warningcron state=absent'
如果我们创建的计划任务需要删除掉,此时使用state的状态且参数值是absent
【讲清楚,说明白!】Ansible运维自动化初步解析
(5.7)Yum模块
# rm -f /var/run/yum.pid
经验总结:如果出现有yum进程删除不掉,那么就使用如上命令进行删除
【讲清楚,说明白!】Ansible运维自动化初步解析
# ansible all -m yum -a 'name=vsftpd'
使用yum模块,安装vsftpd
# ansible all -m yum -a 'name=vsftpd,memcached,httpd'
如果同时安装多个模块的软件,使用逗号隔开
# ansible all -m yum -a 'list=installed'
查询目标主机所有装好的安装包
# ansible all -m yum -a 'name=vsftpd state=absent'
使用yum模块,卸载vsftpd程序,使用absent参数
# ansible all -m yum -a 'name=vsftpd,memcached,httpd state=absent'
如果同时卸载多个模块的软件,使用逗号隔开,使用absent参数
# ansible all -m shell -a 'rpm -q vsftpd'
查询vsftpd程序是否有安装
需求实现:将互联网下载的rpm包推送到远端主机并且进行安装。
# ansible all -m copy -a 'src=/data/vsftpd-3.0.2-22.el7.x86_64.rpm dest=/root/'
我们首先将vsftpd-3.0.2-22.el7.x86_64.rpm从本地推送到各个服务器上
# ansible all -m yum -a 'name=/root/vsftpd-3.0.2-22.el7.x86_64.rpm'
使用root目录下的rpm包文件进行安装
# ansible all -m yum -a 'name=/root/vsftpd-3.0.2-22.el7.x86_64.rpm disable_gpg_check=yes'
安装的时候可以忽略gpgcheck的检查
【讲清楚,说明白!】Ansible运维自动化初步解析
# ansible all -m yum -a 'name=dstat update_cache=yes'
在安装dstat监控工具的时候将yum的缓存清理,设置update_cache=yes
(5.8)Service:管理服务
# ansible-doc -s service
查询service的帮助文档
# ansible all -m service -a 'name=vsftpd state=started enabled=yes'
设置vsftpd服务开机自动启动,并且当前也为启动状态(stopped,restarted是停止和重启服务)
(5.9)User:管理用户
# ansible all -m user -a 'name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=80 comment="nginx service"'
创建一个用户nginx,使用的是sbin下的nologin登录,同时还是系统账号,创建的家目录是/var/nginx,属于root和bin的附加组,uid为80,描述信息为nginx service
# ansible all -a 'getent passwd nginx'
查看创建的nginx用户的属性
# ansible all -a 'ls -ld /var/nginx'
查询的nginx服务的家目录是否有创建
# ansible all -m user -a 'name=nginx state=absent remove=yes'
如果账号不需要了进行删除,同时将家目录也删除掉(注:默认值state=present)
【讲清楚,说明白!】Ansible运维自动化初步解析
(5.9)Group:组管理
# ansible all -m group -a 'name=nginx system=yes gid=80'
创建一个nginx的用户组,使用的gid是80
# ansible all -a 'getent group nginx'
查询创建的nginx的组是否存在
# ansible all -m group -a 'name=nginx state=absent'
如果不需要nginx组,那么使用absent的状态将创建的组删除
(6)ansible系列命令
(6.1)
官方站点:https://galaxy.ansible.com/home
# ansible-galaxy install geerlingguy.nginx
下载角色文件
# tree /root/.ansible/roles
查看下载的文件的目录信息
【讲清楚,说明白!】Ansible运维自动化初步解析
【讲清楚,说明白!】Ansible运维自动化初步解析
# ansible-galaxy list geerlingguy.nginx
查看下载的文件的版本信息
# ansible-galaxy remove geerlingguy.nginx
删除下载的文件版本
(6.2)
Ansible-pull:推送命令之远程,效率无线提升,对运维要求较高
Ansible-playbook模块
# vim hello.yaml
编辑hello.yaml文件
【讲清楚,说明白!】Ansible运维自动化初步解析
# ansible-playbook hello.yaml
使用playbook执行hell.yaml文件
【讲清楚,说明白!】Ansible运维自动化初步解析
(6.3)
Ansible-vault:功能是管理加密解密yml文件
# ansible-vault encrypt hello.yaml
对创建的hello.yaml文件进行加密
【讲清楚,说明白!】Ansible运维自动化初步解析
# ansible-vault decrypt hello.yaml
将hello.yaml文件进行解密
【讲清楚,说明白!】Ansible运维自动化初步解析
# ansible-vault view hello.yaml
当文件加密的情况下,查看hello.yaml文件的具体内容
# ansible-vault edit hello.yaml
对加密文件进行编辑
# ansible-vault rekey hello.yaml
对加密文件的口令进行修改
# ansible-vault create hello2.yaml
创建一个新的文件hello2.yaml同时将文件加密
(6.4)Ansible-console命令:2.0+新增,可交互执行命令,支持Tab
# ansible-console
使用命令行交互界面
$ cd websrvs
进入到websrvs组中
$ forks 10
使用10个并发
【讲清楚,说明白!】Ansible运维自动化初步解析
$ ?
列出所有的内置命令
$ command hostname
查看各个服务器的主机名
$ cd 192.168.26.132
进入到132的主机
$ hostname name=node02.example.com
修改132的主机名
【讲清楚,说明白!】Ansible运维自动化初步解析
$ yum name=httpd state=present
使用yum安装httpd的服务
$ service name=httpd state=started
将httpd服务启动起来

—————— 本文至此结束,感谢阅读 ——————

猜你喜欢

转载自blog.51cto.com/13613726/2627758