ansible2---playbook
七种武器
1.第一种武器
ansible 命令,用于执行临时性的工作,必须掌握
2.第二种武器
ansible-doc是ansible模块的文档说明,针对每个模块都有详细的说明及应用案例介绍,功能和linux系统
man命令类似类似,必须掌握
3.第三种武器
ansible-console 是ansible为用户提供的交互式工具,用户可以在ansible-console虚拟出来的终端上像shell一样使用ansible
内置的各种命令,这为习惯使用shell交互式的用户提供了良好的使用体验
4.第四种武器
ansible-galaxy 从github上下载管理roles的一款工具,与python的pip类似
5.第五种武器
ansible-playbook是日常使用频率最高的命令,工作机制:通过读取编写好的playbook文件实现批量管理
可以理解为按一定条件组成的ansible任务急,必须掌握
6.第六种武器
ansible-vault 主要用于配置文件加密,如编写的playbook文件中包含敏感信息,不想其他人随意查看,可用它加密,解密这个文件
7.第七种武器
ansible-pull
ansible有两种工作模式pull/push ,默认使用push模式工作,pull和push工作模式机制刚好相反
适用场景:有大批量机器需要配置,即便使用高并发线程依旧要花费很多时间
通常在配置大批量机器的场景下使用,灵活性有欠缺,效率几乎可以无线提升,对运维人员的技术水平和前瞻性
规划有较高要求
二.JSON简介
JSON是javascript对象表示法,它是一种基于文本独立于语言的轻量级数据交换格式
JSON中的分隔符限于单引号" ' ",小括号 (), 中括号 [], 大括号{}, 冒号 : , 逗号,
JSON特性
json 是纯文本
json具有自我描述性(人类可读)
Jason 具有层级结构(值中存在值)
jason可通过javascript进行解析
jason语法规则
数据在名称/值对中
属于由逗号分割
大括号保存对象(键值对{key: value}
中括号保存数组[123,abc,发]
jason数据的书写格式是:名称/值对
{"诗人":
[{"李白":"诗仙","年代":"唐"},
{"杜甫":"诗圣","年代":"唐"},
]
}
YAML简介
yaml是一个高可读性,用来表达数据序列的格式
YAML(YAML Ain't Markup Language)
YAML参考了多种语言,如C语言,Python,Perl等并从XML,电子邮件的数据格式中获得灵感,Clark Evans在2001年首次发表了这种语言,
目前已有数种编程语言或脚本语言支持这种语言.
YAML基础语法
yaml的结构通过空格来展示
数组使用"- "来表示(注意-后面有空格)
键值对使用": " 来表示(: 后面有空格)
YAML使用一个固定的缩进风格表示数据层级结构关系
一般每个缩进级别由两个以上空格组成
#表示注释
注意:
不要使用tab,缩进是初学者容易出错的地方之一
同一层级缩进必须对齐
YAML写法
YAML的键值表示方法
采用冒号分割
:后必须有一个空格
YAML键值对例子
"诗人":
- "李白"
- "杜甫"
- "白居易"
"讲师"
-
"姓名": "nb"
"阶段": "1.0"
"喜好": "大铁锤"
-
"姓名": "wk"
"阶段": "1.5"
"喜好": "吃香蕉"
Jinja2过滤器 模板简介
Jinjia2是基于Python的模板引擎,包含变量和表达式两部分,两者在模板求职时会被替换为值,模板中还有标签,控制模板的逻辑
为什么要学习Jinjia2模板
因为playbook的模板使用Python的jinja2模块来处理
基本语法
模板的表达式都是包含在分隔符"{{ }}"内的
控制语句都是包含在分隔符"{% %}"内的
模板支持注释,都是包含在分隔符"{# #}"内,支持块注释
调用变量
{{ varname}}
计算
{{ 2+3 }}
判断
{{1 in [123] }}
控制语句
{% if name == '诗仙' %}
李白
{% elif name == '诗圣' %}
杜甫
{% endif %}} #结束
playbook
概念:playbook是ansible用于配置,部署和管理托管主机剧本,通过playbook的详细描述,执行其中的一系列tasks,
可以让远程主机达到预期状态.
-也可以说,playbook字面意思既剧本,现实中由演员按剧本表演,在ansible中由计算机进行安装,部署应用,提供对外服务,
以及组织计算机处理各种各样的事情.
为什么使用playbook
执行一些简单的任务,使用ad-hoc命令可以方便解决问题,但有时一个设施过于复杂时,执行ad-hoc命令是不合适的,
最好使用playbook
playbook可以反复使用编写的代码.可以放到不同的机器上面,像函数一样,最大化的利用代码,在使用ansible的过程中,
处理的大部分操作都是在编写playbook
playbook语法格式
playbook由YAML语言编写,遵循YAML标准
在同一行中,#之后的内容表示注释
同一个列表中的元素应该保持相同的缩进
play中的hosts,variables,roles,tasks等对象表示方法都是键值中间以" : "分隔表示
YAML还有一个小怪癖,它的文件开始行都应该是---,这是YAML格式的一部分,表明一个文件的开始
playbook构成
hosts :定义将要执行playbook的远程主机组
vars:定义playbook运行时需要使用的变量
tasks:定义将要在远程主机上执行的任务列表
handlers: 定义task执行完成以后需要调用的任务
playbook执行结果
使用ansible-playbook运行playbook文件,输出内容为JSON格式,由不同颜色组成便于识别
绿色代表执行成功
***代表系统状态发生改变
红色代表执行失败
例子:用playbook安装Apache,修改端口,配置ServerName,修改主页,设置开机自启
---
- hosts: web #主机集合
remote_user: root
tasks: #命令集合
- name: install the latest version of Apache
yum:
name: httpd
state: installed
- service:
name: httpd
enabled: yes
state: restarted
- copy:
src: /root/index.html
dest: /var/www/html/index.html
- lineinfile:
path: /etc/httpd/conf/httpd.conf
regexp: '^Listen'
line: 'Listen 8080'
playbook进阶
定义变量
---
- hosts: db
vars:
username: mountain
remote_user: root
name: "{{username}}"
tasks:
- name: create user "{{username}}"
user:
name: "{{username}}"
group: users
- name: set password
shell: echo 123 | passwd --stdin "{{username}}"
方法1:
---
- hosts: db
vars:
username: plj
remote_user: root
tasks:
- name: create user "{{username}}"
user:
password={{'123qqq...A'|password_hash('sha512')}}
name={{username}}
ansible-playbook user.yaml
方法2: vim args.yaml
---
username: dd
pwd : "456"
执行添加用命令: ]#ansible-playbook user.yaml -e @args.yaml
方法3:
ansible-playbook user.yaml -e '{"username":"wk"}' #添加wk用户
error
ansible-playbook对错误的处理
默认判断情况$?,如果值不为0就停止执行
但某些情况我们需要忽略错误继续执行
例如 创建缓存目录,然后重启apache
vim erro.yml
- ---
- - hosts: web
- remote_user: root
- tasks:
- - shell: mkdir /tmp/cache
- - name: ReStart service httpd
- service:
- name: httpd
- state: restarted
- - name: run some command
- shell: /usr/bin/somecommand
- ignore_errors: True
ansible-playbook error.yml
tags给指定的任务定义一个调用标识
vim adhttp.yml
使用handlers来配置文件,重新载入配置文件让服务生效
---
- hosts: web
remote_user: root
tasks:
- name: install the latest version of Apache
yum:
name: httpd
state: installed
- service:
name: httpd
enabled: yes
state: restarted
- copy:
src: /root/index.html
dest: /var/www/html/index.html
- lineinfile:
path: /etc/httpd/conf/httpd.conf
regexp: '^Listen'
line: 'Listen 8080'
when
有些时候需要在满足特定的条件后再触发某一项操作,或在特定的条件下终止某个行为,这个时候需要进行条件判断,
when正是解决这个问题的最佳选择,远程中的系统变量facts作为when的条件,可以通过setup模块查看
---
- hosts: web
tasks:
- name: show uptime info
shell: uptime |awk '{printf("%.2f",$(NF-2))}'
register: result
- name: shutdown web server
service:
name: httpd
state: stopped
when: result.stdout|float > 0.7
- name: show debug info
debug: var=result
register
有时候我们还需要更复杂的例子,如判断前一个命令的执行结果去处理后面的操作,这时候就需要register模块
来保存前一个命令的返回状态,在后面进行调用
---
- hosts: web
tasks:
- name: show uptime info
shell: uptime |awk '{printf("%.2f",$(NF-2))}'
register: result
- name: shutdown web server
service:
name: httpd
state: stopped
when: result.stdout|float > 0.7
- name: show debug info
debug: var=result
with_items
with_items是playbook标准循环,可以用于迭代一个列表或字典,通过{{item}}获取每次迭代的值
---
- hosts: db
tasks:
- name: adduser user "{{item.uname}}"
user:
name: "{{item.uname}}"
group: "{{item.grp}}"
password: "{{item.pwd|password_hash('sha512')}}"
with_items:
-
uname: nb
grp: users
pwd: "124"
-
uname: wk
grp: adm
pwd: banana
-
uname: dd
grp: daemon
pwd: book
-
uname: jj
grp: mysql
pwd: 123qqq...A
-
uname: xx
grp: root
pwd: a
include and roles
在编写playbook的时候随着项目越来越大,playbook越来越复杂,修改也很麻烦.这时可以把一些play,task
或handler放到其他文件中,通过include指令包含进来是一个不错的选择
debug
对于Python语法不熟悉的同学,playbook书写起来容易出错,且排错困难,这里介绍几个简单的排错调试方法
检测语法:
ansible-playbook --syntax-check playbook.yaml
测试运行
ansible-playbook -C playbook.yaml


浙公网安备 33010602011771号