不求甚解--详解ansible-playbook中roles的用法
前言
本文将详细介绍ansible-playbook中roles的各种用法,它允许你将相关的任务、变量、处理器、文件和模板等集合在一起,以便于在不同的项目中复用
环境准备
| 组件 | 版本 |
|---|---|
| 操作系统 | Ubuntu 22.04.4 LTS |
| ansible | 2.17.6 |
基本用法
文件结构
.
├── deploy.hosts
├── deploy.yaml
└── roles
└── base
└── tasks
└── main.yaml
- deploy.hosts作为目标机器的列表文件
cat deploy.hosts
10.22.11.166
- deploy.yaml作为入口文件
cat deploy.yaml
- name: deploy
hosts: all
remote_user: wilson
gather_facts: no
vars:
ansible_ssh_pass: '123456'
ansible_python_interpreter: /usr/bin/python3
roles:
- base
- name:指定作业的名字:deploy
- hosts:
all代表deploy.hosts文件中所有的机器(也可以指定机器的分类信息) - remote_user:目标机器的登录用户
- gather_facts: 是否需要采集目标机器的基本数据,默认采集。脚本指定的是不采集,为了提高执行速度
- vars.ansible_ssh_oass:目标机器登录用户的密码
- vars.ansible_python_interpreter:目标机器python3的路径
- roles:指定本次作业所使用的角色
base
- roles目录作为ansible-playbook中一系列作业任务的集合,其中一个集合的名字叫做
base- tasks中的main.yaml作为
base的入口文件cat roles/base/tasks/main.yaml
- name: first
command: echo 'hello world'
base当前只有1个任务,就是登录到目标机器,执行hello world
- tasks中的main.yaml作为
运行
ansible-playbook -i deploy.hosts deploy.yaml
PLAY [deploy] ****************************************************************************************************
TASK [base : first] **********************************************************************************************
changed: [10.22.11.166]
PLAY RECAP *******************************************************************************************************
10.22.11.166 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
在屏幕上显示执行结果
需要改造roles/base/tasks/main.yaml
cat roles/base/tasks/main.yaml
- name: first
command: echo 'hello world'
register: display_result
- name: display
debug:
msg: "{{ display_result }}"
把结果放入变量display_result,然后通过模版语言打印出来,并且是json格式的
运行:
ansible-playbook -i deploy.hosts deploy.yaml
PLAY [deploy] ****************************************************************************************************
TASK [base : first] **********************************************************************************************
changed: [10.22.11.166]
TASK [base : display] ********************************************************************************************
ok: [10.22.11.166] => {
"msg": {
"changed": true,
"cmd": [
"echo",
"hello world"
],
"delta": "0:00:00.002740",
"end": "2024-11-19 07:22:22.226036",
"failed": false,
"msg": "",
"rc": 0,
"start": "2024-11-19 07:22:22.223296",
"stderr": "",
"stderr_lines": [],
"stdout": "hello world",
"stdout_lines": [
"hello world"
]
}
}
PLAY RECAP *******************************************************************************************************
10.22.11.166 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
引用环境变量
将操作系统的环境变量传入,可以通过lookup来引用,比如:要使用PATH,可以通过lookup('env', 'PATH')
改造roles/base/tasks/main.yaml
cat roles/base/tasks/main.yaml
- name: first
debug:
msg: "{{ lookup('env', 'PATH') }}"
运行:
ansible-playbook -i deploy.hosts deploy.yaml
PLAY [deploy] ****************************************************************************************************
TASK [base : first] **********************************************************************************************
ok: [10.22.11.166] => {
"msg": "/home/wilson/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/usr/local/go/bin:/usr/local/go/bin"
}
PLAY RECAP *******************************************************************************************************
10.22.11.166 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
使用ansible变量
这里的ansible变量,其中一部分ansible默认的变量,一部分是ansible运行的时候,会默认去采集目标机器的基本信息,比如操作系统、cpu、内存、磁盘等等的基本信息
部分内置变量
| 变量名 | 描述 |
|---|---|
| inventory_hostname | 当前任务执行的主机名(来自 Inventory 文件) |
| ansible_facts | 包含所有收集到的主机事实(facts) |
| hostvars | 所有主机变量的集合,包含当前和其他主机 |
采集目标机器的基本信息
需要把之前采集ansible基本信息的开关打开gather_facts: yes,打开之后会牺牲运行速度
改造roles/base/tasks/main.yaml
- name: first
debug:
msg: "{{ hostvars }}"
运行:
由于数据量太大,只展示部分,并且json格式,可以直接拿想要的值
ansible-playbook -i deploy.hosts deploy.yaml
PLAY [deploy] ******************************************************************
TASK [Gathering Facts] *********************************************************
ok: [10.22.11.166]
TASK [base : first] ************************************************************
ok: [10.22.11.166] => {
"msg": {
"10.22.11.166": {
"ansible_all_ipv4_addresses": [
"10.22.11.166"
],
"ansible_all_ipv6_addresses": [
"fe80::a00:27ff:fef6:82c4"
],
"ansible_apparmor": {
"status": "enabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "12/01/2006",
"ansible_bios_vendor": "innotek GmbH",
"ansible_bios_version": "VirtualBox",
"ansible_board_asset_tag": "NA",
"ansible_board_name": "VirtualBox",
"ansible_board_serial": "NA",
"ansible_board_vendor": "Oracle Corporation",
...
"inventory_dir": "/home/wilson/workspace/ansible",
"inventory_file": "/home/wilson/workspace/ansible/deploy.hosts",
"inventory_hostname": "10.22.11.166",
"inventory_hostname_short": "10.22.11.166",
"module_setup": true,
"playbook_dir": "/home/wilson/workspace/ansible"
}
}
}
PLAY RECAP *********************************************************************
10.22.11.166 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
是否采集目标的基本信息
上面已经演示过,只需要gather_facts: yes即可
从命令行传入变量
ansible-playbook可以通过-e传入变量使用
cat roles/base/tasks/main.yaml
- name: first
debug:
msg: "{{ app_name }} - {{ app_version }}"
运行:
ansible-playbook -i deploy.hosts -e "app_name=prom app_version=1.0" deploy.yaml
PLAY [deploy] ****************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************
ok: [10.22.11.166]
TASK [base : first] **********************************************************************************************
ok: [10.22.11.166] => {
"msg": "prom - 1.0"
}
PLAY RECAP *******************************************************************************************************
10.22.11.166 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
动态选择host
1)将主机分组
修改deploy.hosts文件
cat deploy.hosts
[ga]
10.22.11.166
[gb]
10.22.11.166
127.0.0.1
2)改造入口文件
cat deploy.yaml
- name: deploy
hosts: '{{h}}'
remote_user: wilson
gather_facts: no
vars:
ansible_ssh_pass: '123456'
ansible_python_interpreter: /usr/bin/python3
roles:
- base
将hosts改在成为'{{h}}',通过传入h变量来动态定义
3)运行
指定h为ga
ansible-playbook -i deploy.hosts -e "h=ga" deploy.yaml
PLAY [deploy] ****************************************************************************************************
TASK [base : first] **********************************************************************************************
ok: [10.22.11.166] => {
"msg": "hello world"
}
PLAY RECAP *******************************************************************************************************
10.22.11.166 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
指定h为gb
ansible-playbook -i deploy.hosts -e "h=gb" deploy.yaml
PLAY [deploy] ****************************************************************************************************
TASK [base : first] **********************************************************************************************
ok: [10.22.11.166] => {
"msg": "hello world"
}
ok: [127.0.0.1] => {
"msg": "hello world"
}
PLAY RECAP *******************************************************************************************************
10.22.11.166 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
127.0.0.1 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
条件选择when
cat roles/base/tasks/main.yaml
- name: first
debug:
msg: "version 1"
when: version == '1'
- name: second
debug:
msg: "version 2"
when: version == '2'
定义临时变量
通过-e传入的变量来产生临时变量
- name: first
set_fact:
tag: "hello-{{ version }}"
- name: second
debug:
msg: "{{ tag }}"
运行:
ansible-playbook -i deploy.hosts -e "version=2" deploy.yaml
...
TASK [base : second] *********************************************************************************************
ok: [10.22.11.166] => {
"msg": "hello-2"
}
...
调用多个role
1)新增role: advance
.
├── deploy.hosts
├── deploy.yaml
└── roles
├── advance
│ └── tasks
│ └── main.yaml
└── base
└── tasks
└── main.yaml
2)直接在入口文件deploy.yaml引用
.
├── deploy.hosts
├── deploy.yaml
└── roles
├── advance
│ └── tasks
│ └── main.yaml
└── base
└── tasks
└── main.yaml
运行:
ansible-playbook -i deploy.hosts -e "version=2" deploy.yaml
PLAY [deploy] ****************************************************************************************************
TASK [base : first] **********************************************************************************************
ok: [10.22.11.166]
TASK [base : second] *********************************************************************************************
ok: [10.22.11.166] => {
"msg": "hello-2"
}
TASK [advance : new-first] ***************************************************************************************
ok: [10.22.11.166] => {
"msg": "new hello world"
}
PLAY RECAP *******************************************************************************************************
10.22.11.166 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3)在roles base中引用 advance
cat deploy.yaml
- name: deploy
hosts: all
remote_user: wilson
gather_facts: no
vars:
ansible_ssh_pass: '123456'
ansible_python_interpreter: /usr/bin/python3
roles:
- base
cat roles/base/tasks/main.yaml
- name: base first
debug:
msg: "base {{ version }}"
- name: base second
include_role:
name: advance
vars:
role_pipe_from_base: "hello world from base"
- name: base third
debug:
msg: "{{ role_pipe_from_advance }}"
cat roles/advance/tasks/main.yaml
- name: advance first
debug:
msg: "advance {{ version }}"
- name: advance second
debug:
msg: "{{ role_pipe_from_base }}"
- name: advance third
set_fact:
role_pipe_from_advance: "hello world from advance"
运行:
ansible-playbook -i deploy.hosts -e "version=2" deploy.yaml
PLAY [deploy] ****************************************************************************************************
TASK [base : base first] *****************************************************************************************
ok: [10.22.11.166] => {
"msg": "base 2"
}
TASK [base second] ***********************************************************************************************
included: advance for 10.22.11.166
TASK [advance : advance first] ***********************************************************************************
ok: [10.22.11.166] => {
"msg": "advance 2"
}
TASK [advance : advance second] **********************************************************************************
ok: [10.22.11.166] => {
"msg": "hello world from base"
}
TASK [advance : advance third] ***********************************************************************************
ok: [10.22.11.166]
TASK [base : base third] *****************************************************************************************
ok: [10.22.11.166] => {
"msg": "hello world from advance"
}
PLAY RECAP *******************************************************************************************************
10.22.11.166 : ok=6 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

这个例子呈现了:
- 传入变量
version是共用的 - 如何在role传递参数
- 执行过程中定义的临时变量
role_pipe_from_advance可以跨role持续 - 多role执行是串行的
小结
- 联系我,做深入的交流

至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...
不求甚解--详解ansible-playbook中roles的用法的更多相关文章
- 详解shell编程中2>&1用法
在使用 linux 命令或者 shell 编程时,这个用法常会遇到 2>&1 下面看一个命令示例,然后分析下他是如何工作的: ls foo > /dev/null 2>&am ...
- 详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别
详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别 http://blog.sina.com.cn/s/blog_686999de0100jgda.html 实例: ...
- 详解 Go 语言中的 time.Duration 类型
swardsman详解 Go 语言中的 time.Duration 类型swardsman · 2018-03-17 23:10:54 · 5448 次点击 · 预计阅读时间 5 分钟 · 31分钟之 ...
- 详解jquery插件中(function ( $, window, document, undefined )的作用。
1.(function(window,undefined){})(window); Q:(function(window,undefined){})(window);中为什么要将window和unde ...
- zz详解深度学习中的Normalization,BN/LN/WN
详解深度学习中的Normalization,BN/LN/WN 讲得是相当之透彻清晰了 深度神经网络模型训练之难众所周知,其中一个重要的现象就是 Internal Covariate Shift. Ba ...
- [转载]详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表
[转载]详解网络传输中的三张表,MAC地址表.ARP缓存表以及路由表 虽然学过了计算机网络,但是这部分还是有点乱.正好在网上看到了一篇文章,讲的很透彻,转载过来康康. 本文出自 "邓奇的Bl ...
- 详解WebService开发中四个常见问题(2)
详解WebService开发中四个常见问题(2) WebService开发中经常会碰到诸如WebService与方法重载.循环引用.数据被穿该等等问题.本文会给大家一些很好的解决方法. AD:WO ...
- 详解WebService开发中四个常见问题(1)
详解WebService开发中四个常见问题(1) WebService开发中经常会碰到诸如WebService与方法重载.循环引用.数据被穿该等等问题.本文会给大家一些很好的解决方法. AD:WO ...
- 详解Python编程中基本的数学计算使用
详解Python编程中基本的数学计算使用 在Python中,对数的规定比较简单,基本在小学数学水平即可理解. 那么,做为零基础学习这,也就从计算小学数学题目开始吧.因为从这里开始,数学的基础知识列位肯 ...
- 第7.16节 案例详解:Python中classmethod定义的类方法
第7.16节 案例详解:Python中classmethod定义的类方法 上节介绍了类方法定义的语法以及各种使用的场景,本节结合上节的知识具体举例说明相关内容. 一. 案例说明 本节定义的一个 ...
随机推荐
- ASP.NET Core – System.Text.Json
前言 System.Text.Json 是 .NET 3.0 后推出的, 用来取代原本的 Newtonsoft. 它的特点就是快,一开始的时候很多东西不支持所以很少人用,.NET 6.0 后开始比较稳 ...
- 26.删除有序数组中的重复项 Golang实现
题目描述: 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度.元素的 相对顺序 应该保持 一致 .然后返回 nums 中唯 ...
- YAML编写应用的资源清单文件(十五)
上面我们在 Kubernetes 中部署了我们的第一个容器化应用,我们了解到要部署应用最重要的就是编写应用的资源清单文件.那么如何编写资源清单文件呢?日常使用的时候我们都是使用 YAML 文件来编写, ...
- .NET 跨平台工业物联网网关解决方案
前言 随着工业4.0时代的到来,物联网技术正在以前所未有的速度改变着我们的生产和生活方式.本文给大家介绍一个基于 .NET 6 开发的跨平台工业物联网网关解决方案. 工业物联网(IIoT)成为了连接物 ...
- transaction_timeout:达到事务超时时终止会话
功能实现背景说明 我们已经有两个参数来控制长事务:statement_timeout 和 idle_in_transaction_session_timeout.但是,如果事务执行的命令足够短且不超过 ...
- vue 赶鸭子上架入门笔记(一) 安装开发环境
准备接手一个 vue 的前端项目,从零开始学习 vue.目标不高大上,能看得懂代码,能进行简单的修改,改完能打包和部署. 首先解决 vue 开发环境的准备.访问 Node.js 官方网站,下载适合你操 ...
- Android dtbo(1) dto简介
设备树 (DT, Device Tree) 是用于描述 non-discoverable(google这样写的,意思应该就是硬件信息看不到) 硬件的命名节点和属性构成的一种数据结构.操作系统(例如在 ...
- 点亮PC13- 使用寄存器点亮
#include "stm32f10x.h" // Device header int main(void) { // 打卡GPIOC的时钟 RCC->APB2ENR = 0 ...
- 57.dom递归退出循环的时机
递归的终止条件一般定义在递归函数内部,在递归调用前要做一个条件判断,根据判断的结果选择是继续调用自身,还是return:返回终止递归. 终止的条件: 1.判断递归的次数是否达到某一限定值 2.判断运算 ...
- kotlin集合——>集合概述、构造集合
1.kotlin集合概述 在kotli.collections包中包含List(有序集合).Set(无序集合).Map(健值对)三种集合 2.val定义的集合,调用集合方法可以添加删除,但是如果重新创 ...