自动化运维工具ansible再探
nginx
-------------------------------------------------------------------------------------------------------------------------------------
shell
ansible常见工具vim
(1)ansible-pull:推送命令至远程,效率无线提高,能够管理上千台主机,对运维要求较高,不过目前为止此命令还未有实施,ansible的管理台数仍是在三四百台设备centos
(2)ansible-playbook * .yml:运行剧本并发
(3)ansible-valult:剧本加密解密指令,ansible-vault encrypt chen.yml,加密chen.yml,ansible-vault decrypt chen.yml,解密chen.yml,加密后的剧本没法用ansible -playbook直接执行,必须先解密,另有指令app
ansible-vault encrypt * .yml 加密运维
decrypt 解密ide
edit 编辑工具
rekey 修改口令测试
create 建立新yml文件
(4)ansible-console:交互式临时执行命令工具
图中5台主机数量,最多5个并发进程
执行用户@当前操做的主机组 (当前组的主机数量)[f:并发数]$
设置并发数: forks n 例如: forks 10
切换组: cd 主机组 例如: cd centos6,切换到centos6,
列出当前组主机列表: list
列出全部的内置命令: ?或help
playbook
基本说明
(1)playbook是由一个或多个剧本组成的列表
(2)playbook的主要功能在于将hosts清单中的主机分配任务tasks,tasks就是各类ansible模块的调用,将分配的任务组织在一个playbook中,随后各任务循序渐进的运行
(3)playbook采用YAML语言编写
YAML语言
(1)YAML是一个可读性高的、用来表达资料序列的格式
(2)特性
YAML可读性好
YAML和脚本语言的交互性好
YAML使用实现语言的数据模型
YAML有一个一致的信息模型
YAML易于实现
YAML能够基于流来处理
YAML表达能力强,扩展性好
YAML格式
(1)单一档案中用三个连字号---区分多个档案,还有选择性的连续三个点表示档案结尾
(2)次行开始正常写playbook的内容,通常建议写明该playbook的功能
(3)使用#注释代码
(4)缩进必须统一,不能空格和tab混用,一样的缩进表明一样的级别
(5)文件内容大小写敏感
(6)key/value的值能够同行写也能够换行写,同行使用:分隔
(7)k/v的v能够是个字符串,也能够是个列表
(8)一个完整的代码块功能需最少元素包括name、task
(9)一个name只能包括一个task
(10)YAML文件扩展名一般为yml或者yaml
List:列表,全部元素-开头
Dictionary:字典,由多个key与value构成,两种写法
playbook核心元素
hosts:执行的远程主机列表
tasks:任务集
varniables:内置变量或者自定义变量
templates:模板,可替换模板文件中的变量并实现一些简单逻辑的文件
handlers:和notity结合使用,由特定条件触发的操做,知足条件执行,不然不执行,在某个task的最后一行添加notity,整个task任务集结束,编写handler
tags:标签执行某条任务执行,用于选择运行playbook中的部分代码,好比说ansible-playbook -t TAGNAME FILE.yml
hosts:能够是以下形式
one.example.com
one.example.com:two.example.com
192.168.1.50
192.168.1.*
GROUP1:GROUP2 两个组的并集
GROUP1:&GROUP2 两个组的交集
GROUP1:!GROUP2 在GROUP1组,但不在GROUP2组,好比说:
- hosts: GROUP1:GROUP2 -->务必注意空格,行首-与元素有空格,键:和值之间有空格
remoute_user:可用于host和task中,也能够经过指定其经过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至能够在sudo时使用sudo_user指定sudo时切换的用户
handler、notify:条件触发执行,举例说明
tags:标签,举例说明
变量:
变量名:仅能由字母、数字和下划线组成,且只能以字母开头
变量来源
(1)ansible CLASS -m setup,输入指令后能够看到不少代码,现只抓取一小部分作个说明
(2)/etc/ansible/hosts中定义变量
(3)经过命令行指定变量,ansible-playbook -e varname=value
(4)在playbook中定义
(5)在独立的变量YAML文件中定义
(6)在role中定义,原理和(5)同样,也是将变量存放在一个文件里
模板templates
文本文件,嵌套有脚本,只能ansible-playbook用,不能够ansible直接使用
jinja2语言
字符串:使用单引号或双引号
数字:整数,浮点数
列表:[item1, item2, ...]
元组:(item1, item2, ...)
字典:{key1:value1, key2:value2, ...}
布尔型:true/false
算术运算:+, -, *, /, //, %, **
比较操做:==, !=, >, >=, <, <=
逻辑运算:and, or, not
流表达式:For If When
功能:根据模块文件动态生成相应的配置文件,意思就是某个服务配置文件有变更了,能够放到模板里,把模板这个文件向目标群体发送
templates文件必须存放于templates目录下,且命名为.j2结尾
yml文件须要和temlpates目录评级,结构为
|————temnginx.yml
|————templates
|———nginx.conf.j2
为说明template做用,附一个小型实验
(1)控制机和被控制机192.168.239.129都安装了nginx,根据目录创建mkdir -pv /app/templatetest/templates
(2)cp /etc/nginx/nginx.conf /app/templatetest/templates/nginx.conf.j2
(3)vim /app/templatetest/temnginx.yml,此时保证了yml文件和templates目录同级
(4)修改nginx.conf.j2文件,保证和被控制机的配置文件有变化
(5)ansible 192.168.239.129 -C检查下,没问题就执行
(6)查看结果
when条件判断
在task后添加when子句便可使用条件测试;when语句支持Jinja2表达式语法,举例
迭代:with_items
相似于shell脚本中的for循环
Playbook中template for if
roles:用于层次性、结构化地组织playbook,经过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并能够便捷地include它们的一种机制。
每一个角色,以特定的层级目录结构进行组织
roles目录结构:
playbook.yml
roles/
project/
tasks/
files/
vars/
templates/
handlers/
default/ 不经常使用
meta/ 不经常使用
解释说明
roles/project/ :项目名称,有如下子目录
files/ :存放由copy或script模块等调用的文件
templates/:template模块查找所须要模板文件的目录
tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件须要在此文件中经过include进行包含
handlers/:至少应该包含一个名为main.yml的文件;其它的文件须要在此文件中经过include进行包含
vars/:定义变量,至少应该包含一个名为main.yml的文件;其它的文件须要在此文件中经过include进行包含
meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其它文件需在此文件中经过include进行包含
default/:设定默认变量时使用此目录中的main.yml文件
roles具体实现将以一个实验来进行解释:点击此处转至roles实验