自动化运维之ansible
大纲:
一、ansible是什么
二、ansible的特点
三、ansible的任务执行模式和执行流程
四、ansible的安装
五、ansible常用命令
六、ansible常用模块
七、关于ansible playbook
八、角色定制roles
环境介绍:接近年关,某公司计划做一次大型促销活动,要求各业务组队年底大促做准备,其中运维部要求所有业务容量进行三倍的扩容,并搭建出多套环境可以供开发和测试人员做测试,运维部门经理要求其工作人员尽快实现。那么,如何实现呢?此时,ansible能担此大任。
一、ansible是什么
一种新出现的自动化运维工具,基于python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。
二、ansible的特点
1、部署简单,只需在主控端部署ansible环境,被控端无需做任何操作
2、默认使用SSh协议对设备进行管理
3、有大量常规运维操作模块,可实现日常绝大部分操作
4、配置简单、功能强大、扩展性强
5、支持API及自定义模块,可通过python轻松扩展
6、通过playbooks来定制强大的配置、状态管理
7、轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可
8、提供一个功能强大、操作性强的web管理界面和REST API接口------AWX平台
三、ansible的任务执行模式和执行流程
ansible系统由控制主机对被管节点的操作方式可分为两类,即ad-hoc和 playbook
ad-hoc模式,使用单个模块,相当于bash中的一句话shell
playbook模式是ansible主要管理方式,通过多个task集合完成一类功能,简单理解为通过组合多条ad-hoc操作的配置文件
ansible在运行时,首先读取ansible.cfg中的配置,根据规则获取lnventory中的管理主机列表,并行的在这些主机中执行配置的任务,最后等待返回的结果
四、ansible的安装
一般两种方式:yum安装和pip程序安装
1、使用yum安装
yum install epel-release -y
yum install ansible –y
2、 使用pip(python的包管理模块)安装
pip install ansible
如果没pip,需先安装pip.yum可直接安装:
yum install python-pip
pip install ansible
五、ansible常用命令
-a MODULE_ARGS, --args=MODULE_ARGS 模块的参数,如果执行默认COMMAND的模块,即是命令参数
-C, --check 只是测试一下会改变什么内容,不会真正去执行;相反,试图预测一些可能发生的变化
-f FORKS, --forks=FORKS 并行任务数,NUM被指定为一个整数,默认是5
-i INVENTORY, --inventory-file=INVENTORY 指定库存主机文件的路径,默认为/etc/ansible/hosts
-m MODULE_NAME, --module-name=MODULE_NAME 执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数
-R SU_USER, --su-user=SU_USER 指定SU的用户,默认是root用户
-T TIMEOUT, --timeout=TIMEOUT 指定SSH默认超时时间, 默认是10S
-v, --verbose verbose mode (-vvv for more, -vvvv to enable) 详细信息
六、ansible常用模块
1、主机连通性测试
2、command:在远程主机上执行命令
3、shell模块在远程主机上调用shell解释器运行命令,支持shell各种功能,例如管道
4、copy:复制文件到远程主机,也可以修改权限等等
5、file:设置文件属性
6、fetch:从远程主机获取文件到本地
7、cron:管理cron计划任务
8、yum:安装软件
9、service:服务程序管理
10、user:用户模块管理
11、group:用户组模块,添加或删除组
12、script:在指定节点上运行服务端的脚本
13、setup:用于收集被管理主机上的信息,例如CPU、内存等
七、关于ansible playbook
1、ansible playbook简介
playbook是ansible用于配置、部署和管理被控节点的剧本。通过playbook的详细描述,执行其中的一系列tasks,可以让远程主机达到预期的状态。
2、ansible playbook格式
YMAL格式是类似于JSON的文件格式
文件的第一行应该以“-”(三个连字符)开始。表明YMAL文件的开始
在同一行中,#之后的内容表示注释
YMAL中的列表元素以“-”开头后紧跟着一个空格,后面为元素内容
同一个列表中的元素应该保持相同的缩进
hosts、remote_user、tasks等对象的表示方法都是键值中间以“:”分隔表示,“:”后面还要增加一个空格
3、playbook的核心元素
hosts:主机
tasks:任务列表
variables:变量
templates:包含了模板语法的文本文件
handlers:由特定条件触发的任务
4、模板templates
文本文件:嵌套有脚本
使用模板操作远程主机的nginx服务,具体过程如下:
①使用setup模块查询出CPU的信息
②修改配置文件
[root@node2 tmp]# vim nginx.conf.j2 CP到tmp的配置文件,记得备份
worker_processes {{ ansible_processor_vcpus }}; 调用上面setup查到的CPU信息
listen {{ nginxport }}; 指定端口,调用下面playbook里面指定的端口
[root@node2 ansible]# vim nginx.yml 向/tmp下的配置文件里传参数)
③执行剧本
[root@node2 ansible]# ansible-playbook nginx.yml -t reloadnginx
④在IP为172.17.19.117和107被监控端查看一下,8888端口打开
在117和107端打开nginx.conf文件,可以看出传进来的参数就是playbook里面定义的,模板使用成功。
3 worker_processes 1;
37 server {
38 listen 8888;
八、角色定制roles
应用环境:对于以上所有的方式有个弊端就是无法实现复用,比如说在同时部署web、mariabd、haproxy时或不同服务器组合不同的应用就需要些多个yml文件,难以实现灵活的调用。而roles用于层次性、结构化的组织playbook,能够根据层次型结构自动装载变量文件、tasks以及handlers等。
1、roles目录结构
files/:存储由copy或script等模块调用的文件;
tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用;
handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由
main.yml进行“包含”调用;
vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由
main.yml进行“包含”调用;
templates/:存储由template模块调用的模板文本;
meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用;
default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;
2、具体角色定制过程如下:
① 在roles目录下生成对应的目录结构
mkdir -pv ./{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default}
② 定义/tasks/main.yml的配置文件如下
[root@node2 nginx]# cp /tmp/nginx.conf.j2 templates/ 对照上面的template模板路径
[root@node2 nginx]# cd files/
[root@node2 files]# lftp 172.17.0.1
lftp 172.17.0.1:/pub/Sources/7.x86_64/nginx> get nginx-1.10.2-1.el7.ngx.x86_64.rpm copy的相对路径是基于file的路径,所以要把包下载到file目录下
③ 修改变量文件
[root@node2 nginx]# vim vars/main.yml
nginxport: 9999
④ 定义handlers文件
[root@node2 nginx]# vim handlers/main.yml
- name: new conf to reload
service: name=nginx state=restarted
⑤ 定义/etc/ansible/roles.yml的playbook文件
[root@node2 ansible]# vim roles.yml
---
- hosts: web
remote_user: root
roles:
- nginx
⑥ 执行角色文件
⑦ 在被管理节点117和107查看nginx服务,9999端口打开
至此,对ansible的简单介绍就结束啦,谢谢浏览~