Ansible进阶2——角色管理

news2024/11/25 0:47:05

文章目录

  • 一、角色
    • 1.1 获取角色方式
    • 1.2 角色结构
    • 1.3 定义变量和默认变量
    • 1.4 使用方法
    • 1.5 控制playbook中的任务执行流程
  • 二、红帽企业Linux系统角色
    • 2.1 常见系统角色
    • 2.2 使用系统时间同步角色
  • 三、自定义角色
    • 3.1 创建角色目录结构
    • 3.2 编写角色内容
    • 3.3 编写总结
  • 四、ansible galaxy角色
    • 4.1 搜索角色
    • 4.2 查看角色信息
    • 4.3 下载角色
    • 4.4 角色管理

一、角色

什么是角色:

  • 角色可以提高ansible代码的重复利用率,是以通用方式重复的利用Ansible代码,将标准化目录结构中的所有任务、变量、文件、模板打包,将打包好的角色从一个项目复制到另一个项目,随后只需从一个play调用该角色就能执行它。

优点:

  • 角色可以分组内容,从而与他人轻松共享代码。
  • 可以编写角色来定义系统类型的基本要素:Web服务器、数据库服务器、Git存储库,或满足其他用途。
  • 角色使得较大型项目更容易管理。
  • 角色可以由不同的管理员并行开发。

1.1 获取角色方式

1.方式一,从rhel-system-roles软件包获取,是红帽工程师写的系统相关角色。

yum -y install rhel-system-roles

在这里插入图片描述
2.方式二,社区获取,社区连接
在这里插入图片描述

1.2 角色结构

  • Ansible角色由子目录和文件的标准化结构定义。顶级目录定义角色本身的名称。文件整理到子目录中,子目录按照各个文件在角色中的用途进行命名,如tasks和handlers。files和templates子目录中包含由其他YAML文件中的任务引用的文件。
  • ansible所有子目录如下列表,但并非每个角色都拥有所有这些目录。
子目录功能
defaults此目录中的main.yml文件包含角色变量的默认值,使用角色时可以覆盖这些默认值。这些变量的优先级较低,应该在play中更改和自定义。
files此目录包含由角色任务引用的静态文件。
handlers此目录中的main.yml文件包含角色的处理程序定义。
meta此目录中的main.yml文件包含与角色相关的信息,如作者、许可证、平台和可选的角色依赖项。
tasks此目录中的main.yml文件包含角色的任务定义。
templates此目录包含由角色任务引用的Jinja2模板。
tests此目录可以包含清单和名为test.yml的playbook,可用于测试角色。
vars此目录中的main.yml文件定义角色的变量值。这些变量通常用于角色内部用途。这些变量的优先级较高,在playbook中使用时不应更改。
  • 角色示例。
add-service.sh    ##新增服务脚本。
ansible.cfg       ##ansible配置文件。
group_vars        ##角色组。
install-service.yml     ##安装服务playbook。
inventory.ini     ##清单文件。
setup.sh         ##执行脚本入口。
uninstall-service.yml   ##卸载服务playbook。
update-service.yml      ##升级服务playbook。
roles/            ##角色目录,根据各个微服务定义各个目录,每个目录下存放子目录。
    httpd/     ##微服务一。
        tasks/
        handlers/
        files/
        templates/
        vars/
        defaults/
        meta/
    mariadb/     ##微服务二。
        tasks/
        defaults/
        meta/

1.3 定义变量和默认变量

概念:

  • 角色变量在vars/main.yml文件中定义,优先级较高,无法被清单变量覆盖。这些变量旨在供角色的内部功能使用。
  • 默认变量在defaults/main.yml文件定义,给playbook中执行的任务提供默认值,优先级最低,会被其他任何变量覆盖。

注意事项:

  1. 在vars/main.yml或defaults/main.yml中定义具体的变量,但不要在两者中都定义。若有想要覆盖的变量,则将此变量设置为默认变量。
  2. 角色里不应包含任何机密,如密码或私钥。
  3. 角色里应该使用变量定义需要变化的值,而不是直接写死。
  4. 内嵌设置的角色变量(角色参数)优先级非常高,能覆盖大多数其他变量。所以不要重复使用内嵌设置在play中任何其他位置的任何角色变量的名称,因为角色变量的值将覆盖清单变量和任何play中的vars。

1.4 使用方法

  • 使用系统角色同步受控机时间。

1.确定要使用的角色,这里使用系统时间角色,将其目录下的所有目录及文件复制到自定义下的角色目录里。

[root@localhost time]# cp -R /usr/share/ansible/roles/rhel-system-roles.timesync .
[root@localhost time]# mv rhel-system-roles.timesync time

在这里插入图片描述
2.查看角色说明文档,主要看在playbook中如何使用,还有默认变量和vars目录下的变量。
在这里插入图片描述

3.编写playbook,引用角色。
在这里插入图片描述
4.执行playbook,查看受控机时间是否被同步。
在这里插入图片描述

在这里插入图片描述

1.5 控制playbook中的任务执行流程

  1. 在使用角色之前,playbook中的任务执行流程是先把play执行完,再执行handlers触发程序。使用角色之后,playbook会按照顺序执行所有任务,比如普通play ——> role角色任务 ——> 普通play ——> role角色中的handlers触发程序 ——> 普通play中的handlers触发程序。
  2. 当然还有两种play,分别为pre_tasks和post_tasks,与普通tasks同级别。
    • pre_tasks ,列在此部分中的所有任务将在执行任何角色之前执行。如果这些任务中有任何一个通知了处理程序,则这些处理程序任务也在角色或普通任务之前执行。
    • post_tasks ,这些任务在play的普通任务和它们通知的任何处理程序运行之后执行。
  3. 也可以使用include_role模块和imports_role模块在普通play中引用角色任务。include_role模块是在Ansible 2.3中新增的,而import_role模块则是在Ansible 2.4中新增的。

1.如下playbook种有role任务,普通角色,handlers触发程序。执行顺序为:pre_tasks任务 ——> role角色任务 ——> 普通tasks任务 ——> post_tasks任务 ——>pre_tasks中的handlers处理程序 ——> 普通tasks中的handlers ——> post_tasks中的handlers 。

---
- hosts: all
  gather_facts: no
  pre_tasks:                                    不论排序如何,都先执行pre_tasks任务;再执行tasks任务;后执行post_tasks任务
    - name: pre_task
      debug:
        msg: "hehe"
      changed_when: True                只有执行任务结果为chenged时,才会通知notify执行handlers
      notify:
        - insert data
  
  roles:
    - ../roles/time

  tasks:
    - name: task
      command: "echo 'haha'"
      notify:
        - insert data
  post_tasks:
    - name: post_task
      command: "echo 'post'"
      notify:
        - insert data

  handlers:
    - name: insert data
      shell: "echo 123 >> /tmp/abc"                     在abc里写入123,因执行了3遍handlers,所以受控机的abc里应该有3个123

2.如下playbook中,在第2个play任务中引用了角色任务,则整个playbook执行顺序是:普通tasks任务 ——> 引用的角色任务。

---
- hosts: all
  tasks:
    - name: 普通任务
      debug:
        msg: "呵呵"

    - name: timesync
      include_role:
        name: roles/timesync
      vars:
        timesync_ntp_servers:
          - hostname: time1.aliyun.com
            iburst: yes

二、红帽企业Linux系统角色

2.1 常见系统角色

  • 这些系统角色是通过rhel-system-roles软件包来提供,安装后在/usr/share/ansible/roles目录下查看所有系统角色。安装命令:yum -y install rhel-system-roles
  • 默认情况下,在playbook中引用角色时会默认找/usr/share/ansible/roles目录下的角色。若是自定义的角色,则需要指定相对路劲,也可以更改配置文件里的roles_path参数指定默认查看角色路径,这样就可以只写角色目录名称即可。
    在这里插入图片描述
名称状态角色描述
rhel-system-roles.kdump全面支持配置kdump崩溃恢复服务
rhel-system-roles.network全面支持配置网络接口
rhel-system-roles.selinux全面支持配置和管理SELinux自定义,包括SELinux模式、文件和端口上下文、布尔值设置以及SELinux用户
rhel-system-roles.timesync全面支持使用网络时间协议或精确时间协议配置时间同步
rhel-system-roles.postfix技术预览使用Postfix服务将每个主机配置为邮件传输代理
rhel-system-roles.firewall开发中配置主机的防火墙
rhel-system-roles.tuned开发中配置tuned服务,以调优系统性能

2.2 使用系统时间同步角色

1.安装软件包,并更改配置文件角色查找默认路径。

yum -y install rhel-system-roles

在这里插入图片描述
2.将系统角色拷贝一份到自定义角色目录下。

[root@localhost roles]# cp -R /usr/share/ansible/roles/rhel-system-roles.timesync   time

3.编写playbook。

[root@localhost playbook]# cat time.yml 
---
- hosts: all
  vars:
    timesync_ntp_servers:       ##引用角色中定义的变量。
      - hostname: time1.aliyun.com
        iburst: yes
    qingjun_timezone: Asia/Nicosia             ##自定义变量。使用命令timedatectl list-timezones查看所有可以设置的时区。
  roles:
    - time             ##因为在ansible配置文件里指定了默认角色路径,所以会直接寻找默认路劲目录下的角色。
  tasks:
    - name: 同步时间时区
      timezone:             ##使用模块来定义时间同步时区。
        name: "{{ qingjun_timezone }}"

4.执行playbook,受控机查看同步时间。
在这里插入图片描述
5.也可以不把变量写在playbook中,根据主机或主机组定义变量,单独写在变量文件中。
在这里插入图片描述

##清单文件。
[root@localhost ansible]# cat inventory.ini 
[mq]
192.168.130.161 ansible_port=22  ansible_user=root   ansible_password="citms@123"


##主机组变量。
[root@localhost ansible]# cat group_vars/mq/time.yml 
timesync_ntp_servers:
  - hostname: time1.aliyun.com
    iburst: yes
qingjun_timezone: Asia/Shanghai


##playbook。
[root@localhost ansible]# cat playbook/time.yml 
---
- hosts: all
  roles:
    - time
  tasks:
    - name: 同步时间时区
      timezone:
        name: "{{ qingjun_timezone }}"

三、自定义角色

自定义创建角色步骤:

  1. 创建角色目录结构。
  2. 定义角色内容。
  3. 在playbook中使用角色。

3.1 创建角色目录结构

查找角色目录优先级为:

  1. 最先从当前的playbook所在的同级目录下的roles子目录里查找角色。
  2. 再按照配置文件中的roles_path指定的角色目录查找,可以使用冒号写多个路径。
    在这里插入图片描述

1.每个角色具有自己的目录,采用标准化的目录结构。

[root@localhost ~]# tree roles/
roles/
└── motd
    ├── defaults
    │   └── main.yml
    ├── files    ##files子目录包含固定内容的文件。
    ├── handlers
    ├── meta
    │   └── main.yml   ##该文件指定有关模块的作者、许可证、兼容性和依赖项的信息。
    ├── tasks
    │   └── main.yml
    └── templates      ##templates子目录则包含使用时可由角色部署的模板。
        └── motd.j2

2.可以使用命令创建角色目录框架,而不需要手动挨个创建费事。

ansible-galaxy init httpd

在这里插入图片描述

3.2 编写角色内容

  • 以下是给受控机安装httpd服务,编写角色思路如下:
    1. 编写任务,需先确定安装服务过程中需要做什么操作,配置yum源安装服务,修改配置文件,启动服务,若是重启需要配置处理程序。
    2. 修改配置文件中需要定义变量,因为传到受控机是要改成受控机本机的参数,且在playbook中需要使用template模块,不能copy。
    3. 配置变量,可以是默认变量,可以根据主机或主机组配置变量,也可以在最后playbook中定义变量,需要整体规划。
    4. 配置模板文件,一般存放服务配置文件,服务依赖文件等等。
    5. 配置handlers。
    6. 编写playbook,指定角色,可以配置变量,最后执行查看结果。
    7. 当然也可以配置全其他文件,方便其他人学习,比如说明文件md结尾的文件,现在markdown语法软件写好到导进来。配置meta文件,说明编写信息,更新信息等等。

1.创建角色目录架构,对每个目子目录进行内容编写。

ansible-galaxy init httpd

在这里插入图片描述
2.编写任务tasks子目录内容,确定整体要做的事情,使用什么模块操作,需要更改配置文件时要使用notify触发handlers处理程序取重启服务。

[root@localhost httpd]# cat tasks/main.yml 
---
# tasks file for httpd
- name: 安装httpd
  yum:
    name: httpd
    state: present

- name: 更改配置文件
  template:
    src: ../templates/httpd.j2
    dest:  /etc/httpd/conf/httpd.conf
  notify:
    - restart httpd

- name: 启动服务
  service:
    name: httpd
    state: started

3.配置模板templates/httpd.j2 ,模板里有需要修改的参数就要使用变量。
在这里插入图片描述
在这里插入图片描述
4.配置默认变量。

[root@localhost httpd]# cat defaults/main.yml 
---
# defaults file for httpd
service_name: www.qingjun.com
service_port: 88

5.配置handlers play。

[root@localhost httpd]# cat handlers/main.yml 
---
# handlers file for httpd
- name: restart httpd
  service:
    name: httpd
    state: restarted

6.编写playbook,指定任务,可以定义变量。

[root@localhost ansible]# cat playbook/httpd.yml 
---
- name: 安装阿帕奇
  hosts: all
  vars:
    service_port: 8080
  roles:
    - name: 安装阿帕奇
      role: ../roles/httpd

7.执行playbook,受控机查看监听端口
在这里插入图片描述

3.3 编写总结

编写角色的推荐做法:

  1. ansible脚本可以基于git存储库在存储,比如github等。
  2. 若涉及到密码等敏感信息时,可以使用变量存放,可以设置一个简单错误的密码定义成默认变量,当在执行playbook时,再输入正确的变量密码。
  3. 使用ansible-galaxy init启动角色,然后删除不需要的任何目录和文件。比如没有使用到file目录,可以将其删掉。
  4. 应该创建并维护README.md和meta/main.yml文件,以记录用户的角色的用途、作者和用法。
  5. 让角色侧重于特定的用途或功能。可以编写多个角色,而不是让一个角色承担许多任务。
  6. 把经常重用和重构的任务写成角色,不常重用的任务就单独写在playbook中执行即可。

变量优先级:

  1. 角色中的vars目录下定义的变量优先级最高,除了事实、通过include_vars加载的变量、注册的变量和角色参数可以覆盖,其他任何文件中定义的变量都无法覆盖这里面的变量。
  2. playbook中定义的变量优先级第二,会覆盖其他大多数变量文件中的变量。
  3. group_vars和host_vars变量会覆盖默认变量。
  4. 角色中的defaults目录下定义默认变量文件,优先级最低。

四、ansible galaxy角色

  • 当然也可以使用社区提供的角色,社区连接。

4.1 搜索角色

  • 除了直接再官网上直接搜索下载,也可以根据–author(用户)、–platforms(平台)、–galaxy-tags(标记)进行搜索角色。
  • 搜索出来的角色越靠前,说明编写的质量越高。

1.根据用户搜索,列出他上传的所有角色。
在这里插入图片描述
2.根据平台搜索。
在这里插入图片描述

4.2 查看角色信息

[root@localhost ~]# ansible-galaxy info geerlingguy.redis

在这里插入图片描述

4.3 下载角色

1.下载单个角色,默认下载到~.ansible/roles目录下,–ignore-errors参数表示忽略错误下载。

ansible-galaxy install geerlingguy.redis --ignore-errors    

在这里插入图片描述

2.使用-p参数指定下载路径。

ansible-galaxy install  1davidmichael.ansible-role-nginx -p /etc/ansible/roles

在这里插入图片描述
3.下载多个角色。可以编辑一个文件,里面列出要下载的角色,通过-r指定下载文件。

[root@localhost roles]# cat requirements.yml
- src: geerlingguy.redis
- src: geerlingguy.apache

[root@localhost roles]# ansible-galaxy install -r requirements.yml -p ./ --ignore-errors

在这里插入图片描述

4.4 角色管理

1.列出本机所有角色,只会列出ansible配置文件里指定的角色路径下的所有角色。
在这里插入图片描述
2.移除角色,只能移除安装下载的角色,不能移除自己编写和或者复制粘贴进来的角色。

ansible-galaxy remove 1davidmichael.ansible-role-nginx

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/616690.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】内存管理的基本操作,new与delete的实现原理以及operator new与operator delete函数

文章目录 前言一、new,delete操作内置类型二、new/delete操纵自定义类型3. operator new与operator delete函数4. new/delete实现原理4.malloc/free和new/delete的区别 前言 程序中内存的划分: 栈又叫堆栈–非静态局部变量/函数参数/返回值等等,栈是向…

高考必胜,归来仍是少年!

高考必胜,归来仍是少年! 这是小索奇专门为高考生写的文章高考生 我以前给大家弄过一些免费的付费资料,现在看到后台很多伙伴们都在寻找资料,一些没有充分准备的小伙伴此刻一定很匆忙吧! 我想对大家说: 高…

基于 FFMPEG 的跨平台视频播放器简明教程(二):基础知识和解封装(demux)

系列文章目录 基于 FFMPEG 的跨平台视频播放器简明教程(一):FFMPEG Conan 环境集成 文章目录 系列文章目录前言基础知识视频,你所看到的!音频 - 你所听到的声音编解码器 - 压缩数据容器 - 存放音频和视频的地方 解封…

vue3.0与vue2.0的区别简记(基于官方文档)

vue3.0与vue2.0的区别简记(基于官方文档) 基于vue3.0和vue2.0官方文档简单记录vue3.0版本和2.0版本的区别。 一直没有看文档的习惯(就是不爱学习,现在吃了没文化的亏),遇到问题才去补充点食粮&#xff0c…

祝2023高考考生高考顺利!金榜题名

前言:光阴似箭,岁月如梭。明天就是全国每年一次的高考了,我也即将结束我的大一生活成为一名大二的小学长啦嘿嘿。而我今天呢主要是想祝马上要高考的学弟学妹们高考顺利,金榜题名,并且借此机会顺便讲讲我的高考前后的故…

解决python通过pip离线安装flask,numpy报错解决(centos)

1. 离线安装Python https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz 解压,编译,安装 tar xzvf Python-3.7.1.tgz ./configuremakemake install 离线环境下如果系统不是完整版安装编译会报错,需要解决依赖问题,如下&am…

5 种常见的 Linux 打包类型:tar、gzip、bzip2、zip 、 7z

在 Linux 系统中,打包和压缩文件是常见的操作。不同的打包类型适用于不同的用途和需求。本文将详细介绍 5 种常见的 Linux 打包类型,包括tar、gzip、bzip2、zip 和 7z,以及它们的特点、使用方法和适用场景。 1. tar tar(tape arc…

音悦台项目测试报告

文章目录 项目背景项目功能测试计划与设计功能测试自动化测试 测试结果功能测试结果UI自动化测试结果 项目背景 现如今人们的生活压力大,容易使人疲惫,为了使得人们在闲暇之余可以听音乐放松,为此设计出一款轻量的听音乐网站,快速…

centos安装部署Kubernetes(k8s)步骤使用kubeadm方式

文章目录 1、修改系统配置2、安装docker应用3. 拉取docker镜像4、cri-dockerd安装5、安装kubeadm和kubelet6、配置flannel网络插件7、Node节点加入集群操作 机器地址: 192.168.0.35 k8s-master 192.168.0.39 k8s-node1 192.168.0.116 k8s-node2 1、修改系统配置 修…

Web应用技术(第十六周/持续更新)

本次联系基于how2j的教程完成对SpringBoot的初步学习。 初识Springboot 学习导入:1.第一个基于SpringBoot的项目:(1)application.java:该文件中的核心代码: (2)HelloController.jav…

一. ATR技术指标的定义与运用

一. ATR的定义 1. 什么是ATR ATR英文全名是Average true range,翻译过来就是平均真实波幅,这个指标主要用来衡量最近N天TR(真实波幅)的平均值。 2. ATR相关计算公式 T R [ ( 最高价 − 最低价 ) , ( 前一次收盘价 − 最高价 ) &#xff0…

macOS Sonoma 14.0 Beta 1 (23A5257q) Boot ISO 原版可引导镜像

macOS Sonoma 14.0 Beta 1 (23A5257q) Boot ISO 原版可引导镜像 本站下载的 macOS 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装。另外也支持在 Windows 和…

OAuth2.0 授权 OpenID Connect 身份认证

文章目录 OAuth2.0历史由来名词解释授权码模式(authorization code 最常用)先换取code,再根据 code 换取 access_token原因 简化模式(implicit)密码模式(resource owner password credentials)客…

【P49】JMeter 查看结果树(View Results Tree)

文章目录 一、查看结果树(View Results Tree)参数说明二、准备工作三、测试计划设计 一、查看结果树(View Results Tree)参数说明 可以查看取样器的请求参数、返回结果 使用场景:一般在调试测试计划期间用来查看取样…

Bigdata1234.cn课堂测试

Java源文件中有一个公共类名称为Test,则该源文件名必须是:Test.java . Java中的基本数据类型共有8个:byte、short、int、long、float、double、char、boolean。 . Eclipse中内容补全的快捷键是alt/ Eclipse 中自动导包的快捷键是 Ctrl Sh…

MySQL数据库从入门到精通学习第8天(表数据的查询)

表数据的查询 基本查询语句单表查询聚合函数查询多表连接查询子查询合并查询结果定义表和字段的别名使用正则表达式查询 基本查询语句 SELECT 语句非常的强大,是最常用的查询语句。他具有一个固定的格式,如下: SELECT 查询的内容 FROM 数据…

【Mysql数据库从0到1】-入门基础篇--mysql 多表查询

【Mysql数据库从0到1】-入门基础篇--mysql 多表查询 🔻一、mysql 多表查询1.1 🍃 7种sql joins 的实现1.2 🍃 错误写法---笛卡尔积错误1.3 🍃 正确的多表select写法 🔻二、内连接( inner) join🔻三、 外连接…

100天精通Golang(基础入门篇)——第2天:学习Go语言的前世今生:一门强大的编程语言的崛起

🌷 博主 libin9iOak带您 Go to Golang Language.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《I…

如何构建一个可实盘的跨期套利策略?

一、策略摘要 跨期套利,在同一个品种但不同月份的期货合约上建立仓位相同、方向相反的交易头寸,最后以对冲或交割方式结束交易、获得收益。因其合约价差具有较好的稳定性,被众多交易者所青睐。本篇内容我们将通过掘金量化平台构建一个可交易…

私募证券基金动态-23年5月报

成交量:5月日均11,342.95亿元 2023年5月A股两市日均成交9,284.12亿元,环比下降18.15%、同比上升10.56%。5月整体20个交易日,仅有月初5个交易日单日成交金额过万亿。 管理人:新提交备案6家,备案通过0家 2023年5月新提…