首页 > 其他分享 >不求甚解--详解ansible-playbook中roles的用法

不求甚解--详解ansible-playbook中roles的用法

时间:2024-12-10 10:20:51浏览次数:6  
标签:10.22 roles deploy -- yaml ansible base 11.166

前言

本文将详细介绍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执行是串行的

小结

  • 联系我,做深入的交流


至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...

标签:10.22,roles,deploy,--,yaml,ansible,base,11.166
From: https://www.cnblogs.com/MrVolleyball/p/18591185

相关文章

  • JMeter录制脚本
    首先需要在测试计划下添加一个线程组、再添加一个HTTP代理服务器。配置HTTP代理服务器,选择目标控制器为添加的线程组。如果不选择目标控制器就启动,则会出现以下报错。配置好HTTP代理服务器后,启动。然后jmeter的bin目录下会生成一个安全证书,我们需要把这个证书导入浏览器......
  • WX小程序DevTocls调试工具hook注入失败解决方案
    !!!此问题只能解决志远大佬开发的工具相信很多小伙伴遇到hook注入失败的情况,如图:遇到这种,首先你先关闭微信,找到你的微信小程序的安装路径C:\Users\自己的用户\AppData\Roaming\Tencent\WeChat\XPlugin\Plugins\RadiumWMPF然后删除该目录的所有文件夹就行此刻你重新打开微信,再......
  • 鸿蒙 Next 中 Prop 的用法详解
    一、@Prop概述在鸿蒙Next中,@Prop装饰器用于在父子组件之间建立单向的数据同步关系。这意味着数据从父组件流向子组件,子组件对@Prop装饰变量的修改不会同步回父组件。从APIversion9开始,该装饰器支持在ArkTS卡片中使用,从APIversion11开始,支持在元服务中使用。(一)同步机制父组......
  • 辽宁省:沈阳市和大连市的2025年城市居民医保缴费(个人缴费方式)
    参考:大连理工大学——延期博士、结业博士——如何在离校后个人缴纳医疗保险大连的门诊医保——在大连门诊就医可以使用医保了【转载】辽宁省大连市“某高校”在校大学生医保缴费方式沈阳市城市居民参保,见:大连理工大学——延期博士、结业博士——如何在离校后个人缴......
  • AI与人类的四大互动区域:探索未来商业机会
    在1955年,心理学家JosephLuft和HarryIngham提出了“乔哈里窗”这一模型,用于描述人与人之间沟通的四个关键区域:公开区、隐秘区、盲点区和未知区。这一框架帮助我们更清晰地理解了人际沟通中常见的障碍与难题,并提供了解决这些障碍的思路。那么,当我们将这个模型应用到人类与AI,甚至AI......
  • 解决升级SpringBoot3 JPA报Could not locate TableGroup问题
    产品技术架构从SpringBoot2.x升级到SpringBoot3.x后,对原有代码进行单元测试时发现,之前通过CriteriaQuery查询对象实现的分页查询功能,在进行记录数count查询时,会抛出SqlTreeCreationException:CouldnotlocateTableGroup异常。通过排查发现,SpringBoot2.x依赖的是Hibernate5.x,S......
  • 你在web端实现过批量打印吗?如何实现?
    是的,我在Web端实现批量打印的方案上可以提供一些帮助。以下是一些常见的方法以及它们的优缺点:1.使用浏览器自带的打印功能(window.print()):原理:这是最简单的方法,通过调用window.print()函数触发浏览器的打印对话框。实现:functionprintSelected(){window.print()......
  • 微信外卖小程序+ssm
    摘要社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。因此,构建符合自己要求的操作系统是非常有意义的。本文从管理员、用户和商家的功能要求出发,微信外卖小程序......
  • 英语学习交流平台小程序+ssm
    摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了英语学习交流平台小程序的开发全过程。通过分析英语学习交流平台小程序管理的不足,创建了一个计算机管理英语学习交流平台小程序的方案。文章介绍了英语学习交流平台小程序的......
  • 072Java基于SpringBoot的宠物之家小程序-java vue.js idea
    所需该项目可以在最下面查看联系方式,为防止迷路可以收藏文章,以防后期找不到项目介绍072Java基于SpringBoot的宠物之家小程序-javavue.jsidea系统实现截图技术栈介绍JDK版本:jdk1.8+编程语言:java框架支持:springboot数据库:mysql版本不限数据库工具:N......