Ansible_03_高级playbook

@

高级playbook

role

role:将playbook分为多个文件的机制

1)每个role的名称都不相同(建议父级目录为roles)

2)系统级role存储路径(默认role):/etc/ansible/roles


playbook同级目录下创建roles目录,并在该目录下role目录和所属文档:

文档名 说明
tasks/main.yaml 存储tasks
files/ 存储传输至服务器的文档
templates/ 存储传输至服务器的模板
handlers/main.yaml 存储handler
vars/main.yaml 存储不可被覆盖变量
defaults/main.yaml 存储可被覆盖变量
meta/main.yaml 存储role关系

1)变量优先级:vars/main.yaml > playbook > defaults/main.yaml

2)role之间不存在隔离概念(可互相访问目录其他role中定义的变量)


ansible-galaxy命令:管理role

指令格式1:ansible-galaxy init 选项

参数 说明
init 初始化role
install 下载role
list 列出已安装role
remove 卸载role
选项 含义
-p 指定下载路径
--init-path 指定初始化路径

引用role

playbook中引用role时,需添加roles选项

1)roles选项中需通过列表形式列出该playbook中使用的所有的role;

2)roles选项中可定义变量,但优先级等同于playbook;

//未引用role的play,可不添加roles选项


(1)直接引用role格式:

roles:
 - role: 名A
 - role: 名B

(2)引用role的同时定义变量:

roles:
 - role: 名A
   变量名1: 值1
   变量名N: 值N

 - role: 名B
   变量名1: 值1
   变量名N: 值N


通过pre_tasks/post_tasks实现在执行role之前/后执行操作

选项 说明
pre_tasks 引用role之前执行的操作
post_tasks 引用role之后执行的操作

1)两选项均为play层级(但分别要在roles选项前后定义)


从属role

从属role:指定role之间的依赖关系

1)role可以依赖一个或多个其他role,被依赖的role会先执行;

2)从属关系记录在meta/main.yaml文件中;


从属格式:

dependencies:
 - { role: 名1, 参数}
 - { role: 名N, 参数}

block

block:对task进行分组归类的机制

1)block可一次性对block内所有task设置条件和参数;

2)tasks中所有选项均可应用于block中;

3)block可实现异常处理;


block中定义task和处理异常的格式:

---
 - block:
   - 模块1: 参数
   - 模块N: 参数
   
   //异常时执行的task
   rescue:
   - 模块: 参数
  
   //总被执行的task
   always:
   - 模块: 参数

1)只有rescue的task执行成功才执行后续task(always的task除外);


include

include:引用其他playbook/tasks

1)include仅用于play和role层级;

2)可通过变量指定文件名实现动态引用;

//普通引用也可通过static语句实现动态引用


引用playbook:

- include: 文件路径

引用tasks:

- include: 文件路径
  task选项

include_role:特殊的include(可选择性引入role到play的指定位)

1)include_role语句可搭配handler语句使用;

引用格式:

- name: task名
  include_role:
    name: role名
    tasks_from: 文件名

高级选项

(1)failed_when:task返回失败时,是否停止执行playbook


(2)fail:停止执行playbook


(3)changed_when:当指定条件成立时,changed的值才置为true

1)添加该选项后,默认所有模块执行后返回的changed均为false;

2)“字符串” in 变量”可判断变量是否包含字符串

3)“变量 is defined”可判断变量是否定义;

4)也可使用“and”和“or”关系连接词;


(4)local_action:指定仅在本机上执行的task

1)常搭配task层级的run_once选项使用;

//因为控制多台服务器,该task会被执行多次


(5)serial:指定每次执行task的服务器数量/百分比

1)指定该值后,将取消默认的并行执行;

2)可指定多个值,每次执行完后取下个值作为参考数

//数值和百分比可混用(最后一个值作为最终值)


(6)strategy:指定运行策略

运行策略 说明
linear 服务器并行执行task
free 服务器独立执行task

lookup

lookup:实现多种方式读取内容并返回

1)lookup函数必须传入两个参数:类型,参数(多个参数间空格分隔);

2)常用类型:

类型 说明
file 返回指定文件路径的文件内容 lookup(‘file’,‘路径’)
pipe 返回命令/程序的执行结果 lookup(‘pipe’,‘命令/程序路径’)
password 生成随机密码并写入指定文件 lookup(‘password’,‘文件路径’)
env 返回环境变量值 lookup(‘env’,‘变量’)
template 返回Jinja2模板文件渲染后的结果 lookup(‘template’,‘模板路径’)
csvfile 返回csv文件内容 lookup(‘csvfile’,‘sue file=文件路径 delimiter=分隔符 col=返回列’)
dnstxt 返回与指定域名相关的TXT记录 lookup(‘dnstxt’,‘域名’)
redis_kv 返回redis中字符串类型变量的值 lookup(‘redis_kv’,‘redis://IP:端口,变量’)
etcd 返回etcd中变量的值 lookup(‘etcd’,‘变量’) 通过ANSIBLE_ETCD_URL环境变量指定IP和端口

使用格式:lookup(‘类型’,‘参数’)

1)lookup函数会直接以字符串形式返回数据(使用变量接收或{{}});


过滤器

过滤器:修改变量的内置函数

1)常用过滤器,如下:

过滤器 说明
default 设置默认值
failed 判断变量值是否为failed
changed 判断变量值是否为changed
success 判断变量值是否为successed
skipped 判断变量值是否为skipped
basename 过滤文件路径中的文件名
dirname 过滤文件路径中的目录
expanduser 将~替换为用户目录
realpath 返回软链接文件的源文件路径

//也可直接调用Jinja2过滤器


使用格式:{{ 变量 \| 过滤器1 \| 过滤器N }}

1)多个过滤器之间可通过管道符“|”进行连用;


自定义过滤器:Python实现的脚本

1)自定义过滤器存储位:playbook同级目录下的filter_plugins目录

2)代码需基于FilterModule类和filters方法;

//自定义过滤器也可存储于~/.ansible/plugins/filter/usr/share/ansible/plugins/filter


循环

循环:通过特定语句实现对不同输入的循环策略

1)循环总以列表形式返回数据;

2)常用循环:

循环 输入 循环策略
with_items 列表 列表中元素
with_lines 执行命令 命令输出结果 (对输出结果逐行迭代)
with_fileglob 通配符 返回第一个存在的文件
with_first_found 文档路径 第一个存在的文件
with_dict 字典 字典中元素 变量.key:代表键 变量.value:代表值
with_flattened 列表的列表 扁平列表
with_indexed_items 列表 单词迭代
with_nested 列表 循环嵌套
with_random_choice 列表 单词迭代
with_sequence 整数数组 数组
with_subelements 字典的列表 循环嵌套
with_together 列表的列表 压缩列表
with_inventory_hostnames 主机匹配模式 匹配的主机

循环控制:修改循环相关配置

loop_control: 
 语句: 参数

语句 说明
loop_var 更改迭代变量名 (参数代表新变量名,默认值item)
label 添加标签 (仅输出指定字符串和标签)

循环可与lookup搭配使用,实现loopup的循环功能

1)仅当looup返回数据类型为列表时,才可搭配使用

2)使用格式:with_类型:参数

posted @ 2022-04-21 08:46  爱和可乐的w  阅读(53)  评论(0编辑  收藏  举报