运维自动化已经发展到了完善阶段,作为新时代的运维人员必须要掌握自动化运维的基本技能,并且运维正朝着工具制造的阶段发展,原本运维需要一些命令知识,目前一些大公司已经开始实现一键完成产品上线。原本的7x24已经变成了运维工具持续监控,出了问题实时向运维人员通知,同时需要一点人员协助机器监控。
自动化运维经历了4个阶段:人工,这个阶段基本上是全部需要到机器上一步步操作;脚本,使用计划任务完成一些重复性工作;工具,这个阶段一个人可以管理大量的机器,常见的工具:puppet,saltstack,ansible;平台化,这时运维人员已经深入研究操作系统的很多组件的代码并且进行优化,开发运维工具实现流程化标准化。
一ansible基本工作流程
这里我选择ansible主要是因为:入门简单,基于yaml定义脚本没有学习难度,无需客户端,基于ssh安全通信。当然ansible也有自己的缺点,在超大规模管理服务器的时候,并发性能远不如puppet和saltstack。下图是ansible工作原理图
ANSIBLE PLAYBOOK是任务集,类似于脚本,由ansible调度大量主机执行其中的任务,调用直接使用ansible-playbook命令
INVENTORY是被管理主机的清单,由/etc/ansible/hosts中定义
MODULES是Ansible执行命令的功能模块,多数为内置的核心模块,也可自定义,使用ansible-glaxy加载别人定义的模块
API 和PLUGINS是第三方提供的管理接口和模块功能的补充,基本上没用过,使用需要一定的技术门槛,
USER直接和ansible交互直接使用ansible命令
ansible-doc # 查看模块文档
-l # 列出所以模块
-s MODULESNAME # 查看某个模块的使用方法
ansible-vault # 加密文件
ansible-consle #交互式接口
二配置文件
主配置文件/etc/ansible/ansible.cfg,基本上不用更改
(1)[defaults]
(2)[privilege_escalation]
(3)[paramiko_connection]
(4)[ssh_connection]
(5)[accelerate]
(6)[selinux]
(7)[colors]
/etc/ansible/hosts文件定义INVENTORY
[GROUPNAME]
ip|hostname
。。。
三ansible常用模块
command# 默认使用这个模块,执行shell命令,不支持|<>等等
shell# shell模块,比command模块好用很多支持|<>等等
copy # 复制文件到远程主机
fatch # 下载远程主机的文件
file# 更改远程主机文件
hostname# 更改远程主机名字
user # 给远程主机添加用户
group # 给远程主机添加组
cron# 计划任务
yum# 安装软件
service# 管理服务
四ansible 变量
1定义
1.ansible setup中已经定义了很多变量可以直接引用
2.自定义在hosts文件中的组如:
[svr1:vars]
http_port=808
3.定义在主机后的变量
[go]
172.16.29.2 http_port=8080 hname=www120
4.定义在playbook中vars
5.命令行指定变量
Ansible-playbook –e 调用
2引用` NAME `
引用的时候一定要注意,引用前有等号一定不要加空格,这个错误犯了很难发现。
五ansible playbook的yaml格式
先来一个案例
[root@centos7 ~]# vim /etc/ansible/hosts #定义一个组,给组内添加两个主机 [go] 172.16.29.10 172.16.29.20 [root@centos7 ansible]# vim httpd.yml --- # 在哪个主机以哪些用户执行命令 - hosts: go remote_user: root tasks: # 使用item迭代创建组 -name: add group nginx user: name={{ item }} state=present with_items: - nginx - nginx1 # item引用字典创建用户 -name: add user nginx user: name={{ item.name }} state=present group={{ item.group }} with_items: - { name: 'nginx',group: 'nginx' } - { name: 'nginx1',group: 'nginx1' } # 安装nginx程序 -name: install nginx yum: name=nginx state=present # when判断 -name: install conf template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf when: ansible_distribution_major_version == "7" # notify只调用handlers,并插入钩子tags,可以只执行这个name中的命令 -name: start nginx tags: start service: name=nginx state=started notify: - check nginx # 定义变量 vars: -vhost: - { listen: 80,servername: 'name' } - { listen: 88,servername: 'name1' } -hostname: name1 # 可选的执行命令 handlers: -name: check nginx shell: ss -tnl|grep '\<80\>' [root@centos7 ~]# cp /etc/nginx/nginx.confansible/nginx.conf.j2 [root@centos7 ~]# vim nginx.conf.j2 # 算术运算和ansible setup变量引用 worker_processes {{ansible_processor_vcpus+1 }}; # for循环 {% for vhosts in vhost %} server { listen {{ vhosts.listen }}; # if判断 {% if vhosts.servername is defined %} server_name {{ vhosts.servername }}; {% endif %} } {% endfor %}
这个案例我就不总结了,因为第6节就是对这个playbook的拆分和深入理解。
以下是一些很无聊的规范,但是有助于我们写playbook脚本
1)首先需要以“---”(3个减号)开始,且需顶行首写。
2)次行开始正常写Playbook的内容,但笔者一般建议写明该Playbook的功能。
3)使用#号注释代码。
4)缩进必须是统一的,不能空格和tab混用。
5)缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的。
6)YAML文件内容和Linux系统大小写判断方式保持一致,是区别大小写的,k/v的值均需大小写敏感。
7)k/v的值可同行写也可换行写。同行使用:分隔,换行写需要以-分隔。
8)一个完整的代码块功能需最少元素需包括 name: task。
9)一个name只能包括一个task。
六ansible roles
模板目录结构如下,一定要遵从规范,否则命令很难执行成功。
roles # roles目录
project1# 具体roles的名称
tasks# roles中普通操作命令,对应playbook中的tasks内各种name
templters # roles中的模板操作命令,对应playbook中的tasks内的templters命令
vars # roles中的变量,对应playbook中的vars
handles # roles中的可选程序,对应playbook中的handlers
files # 模板文件的存放位置
default # 默认属性
mate # 其它
project2# 具体roles的名称
。。。
每个目录的的常用用法可以参考第五节的案例,常用的用法基本上都让我实现了个遍:)
总结
ansible是一个非常重要的工具日常使用最多的工具,很多参数很难一次记住,因此熟练查看文档ansible-doc就变的尤为重要,并且ansible的文档可以说是最好的。有一个原则能用ansible模块解决的问题坚决不用shell模块。