欢迎访问我的博客,你的支持,是我最大的动力!

Ansible使用指南-04-Playbook高级技巧/Inventory文件扩展

Ansible 小马奔腾 795℃ 评论
目录:
[显示]

Playbook高级技巧

Includes、Handlers、Files、Templates、Roles、Jinja、Galaxy

Includes 引用

includes可引用yml文件,vars、handlers、files也支持includes的引用

使用 include可以把playbook按功能进行拆分,最后再拼合

在 Sysinit.yml 中引用 user-config.yml create_dir.yml static_git_pull.yml git_checkout.yml

动态 Includes
在满足一定条件时加载 include 可提高灵活性和可扩展性

import_tasks 静态加载
include_tasks 动态加载
include 加 static: no 动态加载  将废弃

Handler Includes 技巧
handler由notify触发,用于当资源发生变化时一次性执行指定操作
handler支持include 需要写在handlers区域

Playbooks Includes 技巧
导入一个playbook

Roles 角色

Ad-Hoc用于临时命令;Playbook适合中小项目;Roles常用于大型项目
Roles 包括 vars_files tasks handlers meta templates

构建 Roles

Roles依赖于目录的命名和摆放, tasks/main.yml 是任务入口
每个目录下均由 main.yml 定义该功能的任务集,tasks/main.yml 默认执行所有指定的任务

Roles的调用文件 playbook_role.yml

roles目录可在 /etc/ansible//ansible.cfg中roles_path定义 也可以和入口playbook文件存放在同级目录

Roles调用结构

group_vars目录下的文件定义roles中调用的变量

Roles的功能集:
roles/x/tasks/main.yml 主函数 包括在其中的所有任务都会被执行
roles/x/handlers/main.yml 所有包括其中的handlers将被执行
roles/x/vars/main.yml 所有包括在其中的变量将在roles中生效
roles/x/meta/main.yml roles所有依赖将被正常登入
roles/x/{files,templates,tasks}/xxx 存放所有文件/模板 使用时不需要指定绝对路径

Roles技巧之Files 文件传输
Files和Templates均用于文件处理;存放于files目录下的文件不需要指定绝对路径

Roles技巧之Templates 模板替换
模板由Jinja2格式渲染 文件后缀 .j2
两个花括号中间写变量名且花括号和变量名间有空格分隔 如 {{ variable }}
变量存放于 vars/main.yml

tasks/main.yml 中include引用的yml文件除了本目录 也可以引用其他roles下的yml

跨平台 Roles
同时管理多平台
/etc/ansible/hosts
[cross-platform]
192.168.1.10 ansible_ssh_user="stanley" #Debian
192.168.1.12 #RedHat 默认使用root

在play中 可添加 remote_user: root 覆盖 yml 中对整个playbook 的定义,即对某一个play指定特定的执行用户

总调度文件中要使用 when: ansible_os_family == 'RedHat'

Jinja2 模板

Jinja2 For 循环
Jinja2 执行语句 {% statement execution %}

{% for item in all_items %}
{{ item }}
{% endfor %}

示例:

{% for id in range(201,211) %}
192.168.1.{{ id }} web{{ "%02d"|format(id-200) }}.example
{% endfor %}
# 生成192.168.1.201 web01.example 到 192.168.1.210 web10.example
# 注意 range生成的范围是 x<= value < y

Jinja2 If 条件

{% if condition %}
...
{% endif %}
##
{% if item.gateway is defined %}
...
{% endif %}

示例:

{% if PORT %}
bind-address=0.0.0.0:{{ PORT }}
{% else %}
bind-address=0.0.0.0:3306
{% endif %}
# 若变量PORT存在,则使用变量的值,否则使用默认值3306

Jinja 多值合并
将多个items合并成一个list

{% for node in groups["db"] %} # 循环db主机组中的主机
{{ node | join("") }}:5672
{% if not loop.last %} # loop.last为最后一次迭代时 为true
{% endif %}
{% endfor %}

说明:
groups是ansible内置变量,db是inventory文件中的主机组
loop.index 当前循环迭代次数 默认从1开始
loop.index0 当前循环迭代次数 默认从0开始
loop.revindex 到循环结束需要迭代的次数 默认从1开始
loop.revindex0 到循环结束需要迭代的次数 默认从0开始
loop.first 若为第一次迭代 返回true
loop.last 若为最后一次迭代 返回true
loop.length 序列中的项目数
loop.depth 显示渲染的递归循环的层级数 默认从1开始
loop.depth0 显示渲染的递归循环的层级数 默认从0开始
loop.cycle 在一串序列间期取值的辅助函数

Jinja default() 设定
设置默认值

bind-address=0.0.0.0:{{ PORT | default(3306) }} # 设置默认值3306

运行:
ansible-playbook bb.yml # "myvariable": "default"
ansible-playbook bb.yml -e "param1=value1" # "myvariable": "value1"
ansible-playbook bb.yml -e "param1=value1 param2=value2" # "myvariable": "value1,value2"
ansible-playbook bb.yml -e "param1=value1 param2=value2 param3=value3" # "myvariable": "value1,value2,value3"

Ansible Galaxy

Ansible官方Roles分享平台,可以免费上传或下载Roles
默认下载的Roles存放于 /etc/ansible/roles 目录下,可在ansible.cfg中定义存放目录

ansible-galaxy

galaxy网址:https://galaxy.ansible.com

命令格式:
ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ...
说明:
init 创建空roles,ansible-galaxy init myroles 目录myroles将位于当前目录下
info 显示roles信息,ansible-galaxy info manala.mysql
install 安装roles,ansible-galaxy install manala.mysql 默认存放于 ~.ansible/roles/manala.mysql
list 更出本地已安装的roles,ansible-galaxy list
remove 删除本地的roles,ansible-galaxy remove manala.mysql

galaxy上roles命名 username.rolename

Inventory 文件扩展

默认文件: /etc/ansible/hosts
指定特定的inventory文件: -i
ansible-playbook playbook.yml -i /path/to/hostsfiles

[servercheck-web]
192.168.1.1
[servercheck-web:vars]
ansible_ssh_user=root
# 按操作系统对主机组进行分组
[centos:children]
servercheck-web

定义主机组之间的继承关系使用 children

一个yml文件中 可多次指定 hosts 以限定不同的任务对不同的主机进行应用

host_vars/group_vars 目录
可放置在 /etc/ansible目录下,也可与playbook文件放在同一目录,或与inventory文件同一个目录
host_vars目录内放置和主机同名的yaml文件,该文件中定义的变量会覆盖在其他任何playbook和role中定义的同名变量的值

动态 Inventory

Ansible通过调用第三方脚本来动态配置Inventory文件
任何脚本都可以,二进制文件也可以,只需要运行结果返回的是指定格式的 json 串
注意:用于生成 json 代码的脚本必须支持两个选项 --list 和 --host
--list 返回所有的主机组信息,每个组都包含字典形式的主机列表、子组列表或组变量
--host <hostname> 返回该主机的变量列表,或返回一个空的字典
ansible 使用 -i 选项来调用脚本: ansible all -i my-inventory-script -m ping

--list 返回的 json 示例:

动态inventory脚本的python实现

赋予inventory.py 可执行权限 chmod +x inventory.py
ansible all -i inventory.py -m ping
ansible all -i inventory.py -m debug -a "var=host_specific_var"  # 测试主机变量是否生效

动态inventory脚本的php实现

赋予inventory.php 可执行权限 chmod +x inventory.php
ansible all -i inventory.php -m ping
ansible all -i inventory.php -m debug -a "var=host_specific_var"  # 测试主机变量是否生效

 

转载请注明:轻风博客 » Ansible使用指南-04-Playbook高级技巧/Inventory文件扩展

喜欢 (0)or分享 (0)