基础知识
ansible的七种武器
第一种武器
-ansible命令,用于执行临时性的工作,必须掌握
第二种武器
-ansible-doc时ansible模块的文档说明,针对每个模块都有详细的说明及应用案例介绍,功能和Linux系统man命令类似,必须掌握
第三种武器
-ansible-console时ansible为用户提供的交互式工具,用户可以在ansible-console虚拟出来的终端上想shell一样使用ansible内置的各种命令,这为习惯使用shell交互方式的用户提供了料号的使用体验
第四种武器
-ansible-galaxy从github上下载管理roles的一款工具,与python的pip类似
第五种武器
-ansible-playbook是日常应用中使用频率最高的命令,工作机制:通过读取先编好的playbook文件实现批量管理,可以理解为按一定条件组成的ansible任务集,必须掌握
第六种武器
-ansible-vault主要用于配置文件加密,如编写的playbook文件中包含敏感信息,不想其他人随意查看,可用他加密/解密这个文件
第七种武器
-ansible-pull
-ansible有两种工作模式pull/push,默认使用push模式工作,pull和push工作模式机制刚好相反
-适用场景:有大批机器需要配置,即使使用高并发线程依旧要花费很多时间
-通常在配置大批量机器的场景下使用,灵活性有欠缺,但效率几乎可以无限提升,对运维人员的技术水平和前瞻规划有较高要求
-push相当于手动问每一个顾客要点什么按需上菜,pull相当于做好了菜顾客自己选
JSON简介
JSON是什么
-JSON是JavaScript对象表示法,他是一种基于文本独立语言的轻量级数据交换格式
-JSON中的分隔符限于单引号',小括号"()",中括号"[]",大括号"{}",冒号":",和逗号","
JSON特性
-JSON是纯文本
-JSON具有“自我描述性”(人类可读)
-JSON具有层级结构(值中存在值)
-JSON可通过JavaScript进行解析
JSON语法规则
-数据在名称/值对中
-数据由逗号分隔
-大括号保存对象
-中括号保存数组
--------------------------------------------------------------------------------------------------------
{ } 是键值对
[ ] 是数组
{ k: v } == k: v
单一的键值对可以省略 { }
如果是键值对嵌套就要加了"{}" , k: {k1: v1} == {k: {k1: v1}}
-------------------------------------------------------------------------------------------------------
JSON数据的书写格式是:名称/值对
-名称/值对字段名称(在双引号中),后面写一个冒号,然后是值,例如:
YAML简介
YAML是什么
-是一个可读性高,用来表达数据序列的格式
-YAML(YAML Ain't Markup Language)
-YAML参考了多种语言,如:C语言、Python、Perl等,并从XML、电子邮件的数据格式中获得灵感,Clark Evans在2001年首次发表了这个语言,目前已有数种编程语言或脚本语言支持这种语言
YAML基础语法
-YAML的结构通过空格来展示
-数组使用"- "来表示 (-后面有空格)
-键值对使用": "来表示 (-后面有空格)
-YAML使用一个固定的缩进风格表示数据层级结构关系
-一般每个缩进级别由两个以上空格组成
-#表示注释
注意:
-不要使用tab
-统一层级必须对齐
YAML的键值表示方法
-采用冒号分割
-: 后面必须有一个空格
-YAML键值对例子
Jinja2模板简介
Jinja2是什么
-Jinja2是基于Python的模板引擎,包含变量和表达式两部分,两者在模板求值时会被替换为值,模板中海油标签,控制模板的逻辑
为什么要学习Jinja2模板
-应为playbook的模板使用Python的Jinja2模板来处理
Jinja2模板基本语法
-模板的表达式都是包含在分隔符"{{}}"内的
-控制语句都是包含在分隔符"{% %}"内的
-模板支持注释,都是包含在分隔符"(# #)"内,支持块注释
-调用变量
Jinja2过滤器
-变量可以通过过滤器修改,过滤器与变量用管道符号(|)分割,也可以用圆括号传递可选参数,多个过滤器可以链式调用,前一个过滤器可以链式调用,前一个过滤器的输出会被作为后一个过滤器的输入
playbook
playbook是什么
-playbook是ansible用于配置,部署和管理托管主机剧本,通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预启状态
-也可以说,playbook字面意思即剧本,现实中由演员按剧本表演,载ansible中由计算机进行安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情
为什么要使用playbook
-执行一些简单任务,使用ad-hoc命令可以方便的解决问题,但有时一个设施过于复杂时,执行ad-hoc命令是不合适的,最好使用playbook
-playbook可以反复使用编写的代码,可以放到不同的机器上面,像函数一样,最大化的利用代码,在使用ansible的过程中,处理的大部分操作都是在编写playbook
playbook
-playbook由YAML语言编写,遵循YAML标准,后缀名为yml
-在同一行中,#之后的内容表示注释
-同一个列表中的元素应该保持相同的缩进
-playbook由一个或多个play组成
-play中hosts,variables,roles,tasks等对象的标识方法都是键值中间以":"分割标识
-YAML还有一个小的怪癖,它的文件开始行都应该是---,这是YAML格式的一部分,表示一个文件的开始
playbook构成
-hosts:定义将要执行playbook的远程主机组
-vars:定义playbook运行时需要使用的变量
-tasks:定义将要在远程主机上执行的任务列表
-handlers:定义task执行完成以后需要调用的任务
tasks
-命令的集合
-每一个play包含了一个task列表(任务列表)
-一个task在其所对应的所有主机上(通过host pattern匹配的所有主机)执行完毕后,下一个task才会执行
hosts
-主机的集合
-定义要执行的主机
练习
语法进阶
变量
添加用户
-给web主机添加用户l4,设置默认密码123
设密码
-解决密码明文问题
-user模块的password为什么不能设置密码呢
-经过测试发现,password是吧字符串直接写入shadow,并没有改变,而Linux的shadow密码是经过加密的,所以不能使用
解决方案
-变量过滤器password_hash
变量过滤器
-给db主机添加用户plj,设置密码123qqq...A
变量参数
-传递参数
-格式-e 参数
-参数格式必须是json或yaml
-args.yml
例子:
ansible-playbook test2.yml -e '{"username":"nb"}'
案例
error
ansible-playbook对错误的处理
-默认情况判断$?,如果值不为0就停止执行
-但某些情况我们需要忽略错误继续执行
tags
tags:给指定的任务定义一个调用标识
使用格式:
playbook调用方式
调用标记
调用标记时不会运行标记以外的其他对象
handlers
当关注的资源发生变化时采取的操作
notify这个action可用于在每个play的最后被出发,这样可以避免有多次改变发生时每次都执行指定的操作,取而代之仅在所有的变化发生完成后一次性的执行指定操作
在notify中列出的操作成为handler,即notify调用handler中定义的操作
注意事项:
-notify调用的是handler段的name定义的串,必须一致,否则达不到出发的效果
-多个task触发同一个notify的时候,同一个服务指挥出发一次
-notify可以触发多个条件,在生产环境中往往涉及到某一个配置文件的改变要重启若干服务的场景,handler用到这里非常适合
-结合vars可以写出非常普适的服务管理脚本
案例
---
- name: 修改web集群
hosts: web
tasks:
- name: 修改配置文件
tags: conf_httpd
notify:
restart apache
copy:
src: httpd.conf
dest: /etc/httpd/conf/httpd.conf
owner: root
group: root
mode: '0644
- name: 设置默认首页
tags: conf_index
copy:
src: index.html
dest: /var/www/html/index.html
owner: apache
group: apache
mode: '0644'
handlers:
- name: restart apache
service:
name: httpd
state: restarte
when
register
保存前一个命令的返回状态(返回状态不是返回信息),本身不执行命令
调试
debug
案例
[root@ecs-proxy ~]# vim register.yml
---
- name: 保存
hosts: web
tasks:
- name: 获取系统负载
shell: uptime|awk '{printf("%.2f",$(NF-2))}'
register: result
- name: 停止apache服务
service:
name: httpd
state: stopped
when: result.stdout|float > 0.7
执行现场里面有一项叫stdout,stdout保存的是结果,默认是字符串,管道给float是把字符转换成数字和0.7比较
with_items
synchronize
rsync的一个包装器,它可以让你的行动手册中的常见任务变得简单快捷。
格式:
src: some/relative/path
dest: /some/absolute/path
rsync_path: "su -c rsync"
include and roles
排错
检测语法
测试运行