运维自动化工具Ansible-playbook

如果公司想要短时间内扩容上百台服务器,那么你应该怎么去实现呢?一台台去配置吗,这当然是不可能的,当我们需要操作大量的服务器做相同的配置时我们可以学会使用一些工具,不但大大的提高工作效率还可以为公司减少人力的消耗,这样其实是实现了某些程度上的运维自动化,但是实现自动化的前提是首先要保证标准化,没有标准化就无法谈及自动化,其中Ansible就是一个可以控制数台机器进行操控的运维自动化工具,Ansible不仅能实现应用部署还可以批量的进行命令执行,Ansible不需要安装客户端agent,它可以直接通过ssh连接

Ansible系统由控制主机对被管节点的操作方式可分为两类,即ad- hoc和playbook:
·ad-hoc:模式使用单个模块,支持批量执行单条命令。 ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。
·playbook:模式是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件
这里只介绍Ansible的playbook模式
Playbook是yml格式的,Playbooks字面化意思就是“剧本“,就是多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
运维自动化工具Ansible-playbook_第1张图片
ansible执行流程
简单理解就是Ansible在运行时,首先读取ansible.cfg中的配置,根据规则获取 Inventory中的管理主机列表,并行的在这些主机中执行配置的任务,最后等待 执行返回的结果
Ansible命令执行过程
1、加载自己的配置文件 默认/etc/ansible/ansible.cfg
2、查找对应的主机配置文件,找到要执行的主机或者组
3、加载自己对应的模块文件,如command
4、通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的
5、对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件
6、给文件+x执行
7、执行并返回结果
8、删除临时py文件,sleep 0退出
ansible安装方式
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配置文件
设置ansible.cfg配置参数,ansible有许多参数,下面列出常用的参数:
inventory: #这个参数表示资源清单inventory文件的位置,资源清单就是一些Ansible需要连接管理的主机列表。这个参数的配置实例如下:
inventory = /etc/ansible/hosts
library:Ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码称为模块,这个library参数就是指向存放Ansible模块的目录。配置实例如下:
library = /usr/share/ansible
Ansible支持多个目录方式,只要用冒号(:)隔开就可以,同时也会检查当前执行playbook位置下的./library目录。
forks: 设置默认情况下Ansible最多能有多少个进程同时工作, 从Ansible 1.3开始,fork数量默认自动设置为主机数量或者潜在的主机数量,默认设置最多5个进程并行处理。具体需要设置多少个,可以根据控制主机的性能和被管节点的数量来确定,可能是 50或100。默认值5是非常保守的值
配置实例如下:forks = 5

sudo_user:这是设置默认执行命令的用户,也可以在playbook中重新设置这个参数。
配置实例如下:sudo_user = root

remote_port:这是指定连接被管节点的管理端口,默认是22。除非设置了特殊的SSH端口,不然这个参数一般是不需要修改的。
配置实例如下:remote_port = 22

host_key_checking:这是设置是否检查SSH主机的密钥。可以设置为True或False,关闭后第一次连接没有提示

Ansible playbook简介
Ansible playbook使用场景
执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是有时一个设施过于 复杂,需要大量的操作时候,执行的ad-hoc命令是不适合的,这时最好使用 playbook。 就像执行shell命令与写shell脚本一样,也可以理解为批处理任务,不过playbook有 自己的语法格式。 使用playbook你可以方便的重用这些代码,可以移植到不同的机器上面,像函数一样 ,最大化的利用代码。在你使用Ansible的过程中,你也会发现,你所处理的大部分操 作都是编写playbook。可以把常见的应用都编写成playbook,之后管理服务器会变得十分简单。

Ansible playbook格式
在mysql.yml中,主要由三个部分组成。
hosts部分:使用hosts指示使用哪个主机或主机组来运行下面的tasks,每个playbook都必须指定hosts,hosts也可以使用通配符格式。主机或主机组在inventory清单中指定,可以使用系统默认的/etc/ansible/hosts,也可以自己编辑,在运行的时候加上-i选项,指定清单的位置即可。在运行清单文件的时候,–list-hosts选项会显示那些主机将会参与执行task的过程中。
remote_user:指定远端主机中的哪个用户来登录远端系统,在远端系统执行task的用户,可以任意指定,也可以使用sudo,但是用户必须要有执行相应task的权限。
tasks:指定远端主机将要执行的一系列动作。tasks的核心为ansible的模块,前面已经提到模块的用法。tasks包含name和要执行的模块,name是可选的,只是为了便于用户阅读,不过还是建议加上去,模块是必须的,同时也要给予模块相应的参数

使用ansible-playbook运行playbook文件,得到如下输出信息,输出内容为JSON格式。并且由不同颜色组成,便于识别。一般而言
l 绿色代表执行成功,系统保持原样
l 黄色代表系统代表系统状态发生改变
l 红色代表执行失败,显示错误输出。
执行有三个步骤:1、收集facts 2、执行tasks 3、报告结果

Playbook的核心元素:
Tasks:任务列表
Variables
Templates:包含了模板语法的文本文件;
Handlers:由特定条件触发的任务;
Playbooks配置文件的基础组件:
Hosts:运行指定任务的目标主机;
remoute_user: 在远程主机上执行任务的用户;
sudo_user:
tasks:任务列表
模块,模块参数;
格式:
(1) action: module arguments
(2) module: arguments
注意:shell和command模块后面直接跟命令,而非key=value类的参数列表;
(1) 某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers;
(2) 任务可以通过“tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用;

Ansible playbook格式
handlers: 任务,在特定条件下触发; 接收到其它任务的通知时被触发;
tasks:
– name: TASK_NAME
module: arguments
notify: HANDLER_NAME
handlers:
– name: HANDLER_NAME
module: arguments
variables:
facts:可直接调用;
注意:可使用setup模块直接获取目标主机的facters;
(2) 用户自定义变量:
(a) ansible-playbook命令的命令行中的 -e VARS, –extra-vars=VARS
(b) 在playbook中定义变量的方法:
vars:
- var1: value1
- - var2: value2 …
(3) 通过roles传递变量;
(4) Host Inventory
(a) 用户自定义变量
(i) 向不同的主机传递不同的变量;
IP/HOSTNAME varaiable=value var2=value2
(ii) 向组中的主机传递相同的变量;
[groupname:vars]
variable=value
[web]
172.17.251.188
172.17.250.209
[web:vars]
rpmname=samba
运行playbook的方式:
(1) 测试
ansible-playbook –check 只检测可能会发生的改变,但不真正执行操作;
ansible-playbook –list-hosts 列出运行任务的主机;
(2) 直接运行
Ansible playbook格式
模板:templates
文本文件,嵌套有脚本(使用模板编程语言编写)
Jinja2:Jinja2是python的一种模板语言,以Django的模板语言为原本
支持:
字符串:使用单引号或双引号;
数字:整数,浮点数;
列表:[item1, item2, …]
元组:(item1, item2, …)
字典:{key1:value1, key2:value2, …}
布尔型:true/false
算术运算:
+, -, , /, //, %, *
比较操作:
==, !=, >, >=, <, <=
逻辑运算:
and, or, not

Ansible playbook示例 ,现在来创建一个playbook,首先要了解YAML语法
mkdir playbooks
cd playbooks/
vim first.yaml
运维自动化工具Ansible-playbook_第2张图片
ansible-playbook –syntax-check test.yaml 检查语法问题
ansible-playbook test.yaml 运行
现在我们想定制redis配置文件并且让远程主机都用ansible主机上这个定制好的配置文价去运行该如何操作呢?有了ansible工具这个工作就变得很简单了,你不必一台台主机去修改配置文件或者一台台的去传定制好的这个配置文件,只需要在ansible主机上定制好这个配置并且编写一个剧本就行了,具体做法如下:
第一步:
运维自动化工具Ansible-playbook_第3张图片
vim redis.conf 修改以下两项内容
bind 0.0.0.0 修改为监听早本机所有地址
requirepass magedu 设定密码并启用
第二步:
运维自动化工具Ansible-playbook_第4张图片
这样虽然配置文件被传到远程主机上去了但是并没有生效,因为服务已经起来了,想要使用新的配置文件就要reload或restart,但是你每次都改变都要reload或restart一下肯定是不行的,有些服务可能不支持reload和restart,怎么办呢?这个时候就有了另外一个组件叫做Handlers
要触发Handlers你只需要在要特定的任务上定义notify就行了
Handlers:由特定条件触发的任务,只要某一个任务有改变它就会触发另一个任务
所以还要修改一下我们的playbook文件
运维自动化工具Ansible-playbook_第5张图片
这样修改之后我们的配置额文件就会生效了
可以用-t指明只执行哪个任务而不是全部执行所有的任务
当我用playbook跑任务的时候只跑特定标签标记的任务
修改配置文件
运维自动化工具Ansible-playbook_第6张图片
ansible-playbook -t configfile test.yaml
任务的标签可以一样,你也可以排除标签,符合标签的都不执行
yum install facter facter是用来收集系统信息的,非常详细
ansible-doc -s setup 查看ansible的一个模块setup,这个模块是用来收集信息的

下面介绍Ansible的Roles,在一下实验中将涉及到Ansible的Template,variables等的使用,Ansible正是基于这些的定义和使用实现了它自动化的功能
角色Roles
对于所有的方式有个弊端就是无法实现复用,假设在同时部署Web、db、ha 时或不同服务器组合不同的应用就需要写多个 yml文件。很难实现灵活的调用。 roles 用于层次性、结构化地组织playbook。
roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用 roles只需要在playbook中使用include指令即可。简单来讲, roles就是通过分别将变量(vars)、文件(file)、任务(tasks)、模块 (modules)及处理器(handlers)放置于单独的目录中,并可以便捷 地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。
每个角色,以特定的层级目录结构进行组织
File/:存放由copy或script模块等调用的文件;
Templates/:template模块查找所需要模板文件的目录;
Tasks/:至少应该包含一个名为main.yml的文件,其它的文件需要在此文件中通过include进行包含;
Handlers:/ 至少应该包含一个名为main.yml的文件,其它的文件需要在此文件中通过include进行包含;
Vars/:至少应该包含一个名为main.yml的文件,其它的文件需要在此文件中通过include进行包含;
Meta/:少应该包含一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要再此文件中通过include进行包含;;
Default/:设定默认变量时使用此目录中的main.yml文件
在playbook调用角色方法:
-host: all
remote_user: root
roles:
mysql
memcached
nginx (红色的这3个都是要调用的角色名称)
角色模块应该放在/etc/ansible/roles下或者放在/usr/share/ansible/roles下,这个路径是在/etc/ansible/ansible.cfg中定义的,
如何定义一个角色?
这里演示定义一个nginx角色并使用它
1,创建目录
mkdir -pv /etc/ansible/roles/nginx/{files,templates,tasks,vars,handlers,meta,default}其中至少应该有tasks
2,编辑main.yml文件
vim /etc/ansible/roles/nginx/tasks/main.yml
运维自动化工具Ansible-playbook_第7张图片
编辑nginx.yml
运维自动化工具Ansible-playbook_第8张图片
ansible-playbook -C nginx.yml
它还有更大的其它表现
Nginx有自己的配置文件,我们自己再建一个虚拟主机并有自己的配置文件且监听在80端口上servername是这个主机自己的主机名,我们使用变量来获取主机名并保存在配置文件中,
定义模板
cd /etc/ansible
vim roles/nginx/templates/vhost1.conf.j2
server {
listen 80;
server_name {{ ansible_fqdn }}; 此变量用于取出主机名
location / {
root “/ngxdata/vhost1”;(目录有可能不存在所以要创建出来)
}
}
现在模板定义好了,我们要基于模板把它复制过去
vim /etc/ansible/roles/nginx/tasks/main.yml
运维自动化工具Ansible-playbook_第9张图片
效果:同样是测试
运维自动化工具Ansible-playbook_第10张图片
现在我们可以优化一下/etc/ansible/roles/nginx/tasks/main.yml文件
定义标签和handlers,使之更加灵活好用
运维自动化工具Ansible-playbook_第11张图片
启动nginx之前做好给它提供测试页面和家目录,把这个任务定义在文件中
运维自动化工具Ansible-playbook_第12张图片
变量定义在 vim /etc/ansible/roles/nginx/vars/main.yml
ngxroot: /ngxdata/vhost1 (如果你有其中变量就继续写,注意:定义变量的时候不能使用列表要使用字典)【ngxroot: /ngxdata/vhost1是定义字典而- ngxroot: /ngxdata/vhost1就是定义列表了】
vim /etc/ansible/roles/nginx/files/index.html 提供一个主页面

Vhost1

ansible all -m service -a “name=httpd state=stopped” 先停止80端口的服务以防80被占用
测试:
运维自动化工具Ansible-playbook_第13张图片
在playbook调用角色的方法2:传递变量给角色
hosts:
remote_user:
roles:
- { roles: nginx, username:nginx }
Role用于指定角色名称;后续的k/v用于传递变量给角色;
还可以基于条件测试实现角色调用;

你可能感兴趣的:(linux,运维)