前言

本文将详细介绍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

运行

 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的用法的更多相关文章

  1. 详解shell编程中2>&1用法

    在使用 linux 命令或者 shell 编程时,这个用法常会遇到 2>&1 下面看一个命令示例,然后分析下他是如何工作的: ls foo > /dev/null 2>&am ...

  2. 详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别

    详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别 http://blog.sina.com.cn/s/blog_686999de0100jgda.html   实例: ...

  3. 详解 Go 语言中的 time.Duration 类型

    swardsman详解 Go 语言中的 time.Duration 类型swardsman · 2018-03-17 23:10:54 · 5448 次点击 · 预计阅读时间 5 分钟 · 31分钟之 ...

  4. 详解jquery插件中(function ( $, window, document, undefined )的作用。

    1.(function(window,undefined){})(window); Q:(function(window,undefined){})(window);中为什么要将window和unde ...

  5. zz详解深度学习中的Normalization,BN/LN/WN

    详解深度学习中的Normalization,BN/LN/WN 讲得是相当之透彻清晰了 深度神经网络模型训练之难众所周知,其中一个重要的现象就是 Internal Covariate Shift. Ba ...

  6. [转载]详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

    [转载]详解网络传输中的三张表,MAC地址表.ARP缓存表以及路由表 虽然学过了计算机网络,但是这部分还是有点乱.正好在网上看到了一篇文章,讲的很透彻,转载过来康康. 本文出自 "邓奇的Bl ...

  7. 详解WebService开发中四个常见问题(2)

    详解WebService开发中四个常见问题(2)   WebService开发中经常会碰到诸如WebService与方法重载.循环引用.数据被穿该等等问题.本文会给大家一些很好的解决方法. AD:WO ...

  8. 详解WebService开发中四个常见问题(1)

    详解WebService开发中四个常见问题(1)   WebService开发中经常会碰到诸如WebService与方法重载.循环引用.数据被穿该等等问题.本文会给大家一些很好的解决方法. AD:WO ...

  9. 详解Python编程中基本的数学计算使用

    详解Python编程中基本的数学计算使用 在Python中,对数的规定比较简单,基本在小学数学水平即可理解. 那么,做为零基础学习这,也就从计算小学数学题目开始吧.因为从这里开始,数学的基础知识列位肯 ...

  10. 第7.16节 案例详解:Python中classmethod定义的类方法

    第7.16节  案例详解:Python中classmethod定义的类方法 上节介绍了类方法定义的语法以及各种使用的场景,本节结合上节的知识具体举例说明相关内容. 一.    案例说明 本节定义的一个 ...

随机推荐

  1. CSS & JS Effect – Hero Banner Swiper

    效果 重点 1. 一张图片, 一个 content 定位居中作为一个 slide 2. slider 用了 JavaScript Library – Swiper 3. 当 slide active ...

  2. Linux下执行文件删除的操作{确认!确认! 确认!再三确认!}

    ubuntu 删除文件夹命令 rm -r 文件名字 ---> 强制删除XXX文件 rm -f 文件名字 ---> 强制删除XXX文件(centos) 注: linux 中, 强制删除文件的 ...

  3. 【赵渝强老师】使用Oracle的跟踪文件

    一.什么是跟踪文件? 跟踪文件中包含了大量而详细的诊断和调试信息.通过对跟踪文件的解读和分析,我们可以定位问题.分析问题和解决问题.从跟踪文件的产生的来源来看,跟踪文件又可以分为两类:一类是数据库的操 ...

  4. LeetCode 564. Find the Closest Palindrome (构造)

    题意: 给一个数字n 求离n最近(且不等)的回文串 存在多个答案返回最小的 首先很容易想到 将数字分为两段,如 12345 -> 123/45,然后将后半段根据前面的进行镜像重置 123/45 ...

  5. netCore 封装一个检验邮箱的类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. 1.flask 源码解析:简介

    目录 一.flask 源码解析:简介 1.1 flask 简介 1.2 两个依赖 1.2.1 werkzeug 1.2.2 Jinja2 1.3 如何读代码 Flask 源码分析完整教程目录:http ...

  7. apache安装详解

    Apache安装 准备工作. 首先在C盘根目录下创建一个名为web的文件夹作为php开发环境的安装位置,并在web文件夹中创建apache24子文件夹,将apache解压后文件放至此处. 安装包 首先 ...

  8. [2024领航杯] Pwn方向题解 babyheap

    [2024领航杯] Pwn方向题解 babyheap 前言: 当然这个比赛我没有参加,是江苏省的一个比赛,附件是XiDP师傅在比赛结束之后发给我的,最近事情有点多,当时搁置了一天,昨天下午想起来这个事 ...

  9. 混合云下的 Kubernetes 多集群管理与应用部署

    本文是上海站 Meetup 中讲师李宇根据其分享内容梳理成的文章 大家好,很高兴来到今天下午的 Meetup.我先简单做个自我介绍,我叫李宇,目前是 KubeSphere 的一名研发,主要负责多集群方 ...

  10. 云原生周刊:Istio 1.20.0 发布 | 2023.11.20

    开源项目推荐 DevPod DevPod 是一款纯客户端工具,可在任何后端基于 devcontainer.json 创建可重现的开发人员环境.每个开发者环境都在一个容器中运行,并通过 devconta ...