playbook简介
Playbook与ad-hoc相比,是一种完全不同的运用。
playbook是一种简单的配置管理系统与多机器部署系统的基础,且非常适合于复杂应用的部署。
playbook中可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤,并且可以同步或异步的发起任务。
使用playbook可以方便的重用这些代码,可以移植到不同的机器上面。
playbook才是ansible真正强大之处。
playbook语法
l
playbook由YMAL语言编写
,以下为playbook常用到的YMAL格式:
文件的第一行应该以"---"三个连字符开始,表明YMAL文件的开始。
在同一行中,#之后的内容表示注释,类似于shell,python和ruby。
YMAL中的列表元素以”-”开头然后紧跟着一个空格,
同一个列表中的元素应该保持相同的缩进
:
---
# 一个美味水果的列表
- Apple
- Orange
- Mango
l
一个字典是由一个简单的 键: 值 的形式组成(这个冒号后面必须是一个空格):
---
# 一位职工的记录
name: Example Developer
job: Developer
skill: Elite
l
字典也可以使用缩进形式来表示, 如果你喜欢这样的话:
---
# 一位职工的记录
{name: Example Developer, job: Developer, skill: Elite}
playbook基础
l
主机与用户
---
- hosts: server2 #指定主机组,可以是一个或多个组,逗号分隔。
remote_user: root #指定远程主机执行的用户名
---
- hosts: webservers
remote_user: root
become: yes #切换用户运行
become_user: mysql #指定sudo用户为mysql
l
Tasks 列表
Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始第二个任务。如果一个host执行task失败,整个tasks都会回滚
。
每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。
tasks:
- name: install apache #定义任务名
l
A
nsible的自带模块中,command模块和shell模块无需使用key=value格式:
tasks:
- name: disable selinux
command: /sbin/setenforce 0
l
使用 command 和 shell 时,我们需要关心返回码信息
:
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand
ignore_errors: True #返回值如果不为0,就会报错,tasks停止
l
执行playbook
#
ansible-playbook
apache
.yml
# ansible-playbook
apache
.yml --syntax-check #检查yaml文件的语法是否正确
# ansible-playbook
apache
.yml --list-task #检查tasks任务
# ansible-playbook
apache
.yml --list-hosts #检查生效的主机
#
ansible-playbook a.yml --start-at-task="启动apache服务"
指定从某个task开始运行
lHandlers: 在发生改变时执行的操作
l
Template
生成目标文件,copy无法对配置文件进行修改。
定义变量
[webservers]
server2 http_ip=172.25.0.2
在模板文件中引用变量
# vim httpd.conf.j2
Listen {
{ http_ip }}:{
{ httpd_port }}
l
system保留变量:facts
$ ansible hostname -m setup
server2 | SUCCESS => {
"
ansible_facts
": {
"ansible_all_ipv4_addresses": [
"172.25.0.2"
...
l
取值
:
{
{
ansible_facts
["eth0"]["ipv4"]["address"] }}
{
{ ansible_facts.eth0.ipv4.address }}
{
{
ansible_facts
['hostname']
}}
{
{
ansible_facts
['
fqdn
']
}}
{
{
ansible_facts
['interfaces']
}}
{
{
ansible_facts
['
dns
']['nameservers']
}}
{
{
ansible_facts
['devices']['
vda
']['partitions']['vda1']['size']
}}
{
{
ansible_facts
['kernel']
}}
l
禁用facts
:
- hosts: whatever
gather_facts
: no
lwhen判断
lwith_items 循环
l
加密文件
$ ansible-vault encrypt
userlist.yml
New Vault password: *****
Confirm New Vault password: *****
Encryption successful
$ ansible-playbook
test.yml
--ask-vault-pass
Vault password: *****
$ ansible-vault decrypt
userlist.yml
$ ansible-vault
view
userlist.yml
$ ansible-vault
edit
userlist.yml
l
变量文件推荐的管理方式
.
├── group_vars
│ └── webservers
│ └── vars
├── haporxy.cfg.j2
├── host_vars
│ └── server2
│ ├── vars
│ └── vault
├── httpd.conf.j2
├── inventory
└── playbook.yml
group_vars管理主机组变量
host_vars管理主机变量
vars存放纯文本信息
vault存放加密信息
ansible-doc 用法: (模块用法查询)


rqm 的缺点:

编写playbook,安装Apache:




编写playbook,安装mariadb:


编写playbook,创建MySQL数据库:

导入已有playbook:




playbook中使用变量:




文件中使用playbook定义的变量:
1)、文件是 .j2 的模板文件,普通文件不能修改
2)、playbook中用的模块是 template




playbook中使用变量:



notify:
handlers:
所在任务执行后,所进行的操作

加密认证:








playbook循环的使用:(循环创建用户)
创建和数据在同一文件中:


创建和数据分开:


数据文件加密:



ansible 部署 haprodxy:
















使用魔术变量获取节点信息: (内置变量)




组变量与主机变量:(主机变量优先级 > 组变量优先级)
组变量:一般存放公用变量


主机变量:一般存放私有变量 目录命名与 hosts 中的 主机名 保持一致


vars存放纯文本信息,vault存放加密信息


block 任务块:


变量:


处理任务失败:
ignor_error 忽略错误
rescue 出现错误执行的任务
always 总是执行的任务


滚动升级:
socat 命令升级:




ansible与prodxy结合:










