Ansible 中的 Role

news2024/10/10 7:21:55

Role

role(角色) 用来实现代码的组织管理功能,将实现各种不同功能的 playook 文件,变量文件,模板文 件,handlers 文件根据约定,分别放置在不同的目录,分门别类的管理起来,使其看起来更像一个项 目,其主要用来解决多文件之间的相互包含,引用,组合等问题,将各个功能模块进行拆分,使其原子 化,要实现一个大型复杂需求时,再用 include 指令来引用不同的功能

角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中,复杂的场景中,建 议使用 roles,代码复用度高

Role 工作原理和组成

在使用 ansible 实现复杂配置时,难免需要配置不同的主机分组,配置各种变量和模板,使用各种功能 模块等。那我们就可以将这种大型的复杂度高的任务进行分解,拆分成角色(role),来实现

例如:需要在 A 主机上配置 LNMP 环境,在 B 主机上配置 LAMP 环境,在 C 主机上配置 MySQL,在 D 主机上 Redis,则我们可以将各种不同的服务定义成 Role,然后根据需求搭配不同的 Role 来实现不同 的需求,达到代码复用,灵活配置的目的

默认roles存放路径

/root/.ansible/roles
/usr/share/ansible/roles
/etc/ansible/roles

role 的目录结构

  • tasks 任务文件目录,至少有一个名为 main.yaml 文件,该文件通过 include 来引用目录下的其它文件

  • files 该 role 使用过程中要用到的文件,比如安装包,比如 copy 要用到的文件

  • vars 变量文件目录,至少有一个名为 main.yaml 的文件,该文件通过 include 来引用目录下的其 它文件

  • templates 模板文件目录,如果没有特别指定,则在该role 中其它文件要引用模板文件都默认存放在此目录

  • handlers 触发器目录,至少要有一个名为main.yaml的文件,该文件通过include 来引用目录下 的其它文件

  • default 在该 role 中会用到的默认变量,此处的变量优先级比 vars 中的变量优先级更高

  • meta 额外信息需要用到的一些数据,至少有一个名为 main.yaml 的文件,该文件通过 include 来 引用目录下的其它文件

在 playbook 中调用 role

直接调用

- hosts: websrvs
  remote_user: root
  roles:
   - mysql
   - memcached
   - nginx

传参

- hosts: websrvs
  remote_user: root
  roles:
   - role: mysql
     var1: 123
   - {role: memecached, var1: 456}

条件判断

- hosts: websrvs
  remote_user: root
  roles:
   - role: mysql
     var1: 123
     when: ansible_distribution_major_version == '7'
     
   - {role: mysql, var1: 456, when: ansible_distribution_major_version == '7'}

用 role 实现 LNMP

节点系统IP服务
ansibleubuntu10.0.0.157
node-1ubuntu10.0.0.161nginx,php,wordpress
node-2ubuntu10.0.0.141mysql

在ansible主机

#创建目录
[root@ubuntu24 ~]# tree roles/
roles/
├── mysql
│   ├── files
│   ├── tasks
│   └── templates
├── nginx
│   ├── files
│   ├── tasks
│   └── templates
├── php
│   ├── files
│   ├── tasks
│   └── templates
├── service
│   ├── files
│   ├── tasks
│   └── templates
└── wordpress
    ├── files
    ├── tasks
    └── templates

21 directories, 0 files

nginx role 实现

[root@ubuntu24 ~]# tree /root/roles/nginx/
/root/roles/nginx/
├── files
├── tasks
│   ├── install.yaml
│   ├── main.yaml
│   └── user.yaml
└── templates

[root@ubuntu24 ~]# cat roles/nginx/tasks/user.yaml
- name: add-nginx-group
  group: name=nginx gid=800 system=yes

- name: add-nginx-user
  user: name=nginx group=800 system=yes uid=800 create_home=no
  
  
[root@ubuntu24 ~]# cat roles/nginx/tasks/install.yaml
- name: install-nginx
  apt: name=nginx state=present
  
  
[root@ubuntu24 ~]# cat roles/nginx/tasks/main.yaml
- include_tasks: user.yaml
- include_tasks: install.yaml

php role 实现

[root@ubuntu24 ~]# cat roles/php/tasks/user.yaml
- name: add-php-group
  group: name=www-data gid=33 system=yes

- name: add-php-user
  user: name=www-data group=33 system=yes uid=33 create_home=yes home=/var/www shell=/usr/sbin/nologin
  
[root@ubuntu24 ~]# cat roles/php/tasks/install.yaml
- name: install-php
  apt: name=php-fpm,php-mysqlnd,php-json,php-gd,php-xml,php-mbstring,php-zip state=present
  
[root@ubuntu24 ~]# cat roles/php/tasks/main.yaml
- include_tasks: user.yaml
- include_tasks: install.yaml

wordpress role 实现

[root@ubuntu24 ~]# cat roles/wordpress/tasks/wp_get_code.yaml
- name: wget-wordpress
  get_url: url=https://cn.wordpress.org/latest-zh_CN.zip dest=/var/www/html/wordpress.zip
  
  
[root@ubuntu24 ~]# cat roles/wordpress/tasks/wp_unarchive.yaml
- name: wp-unarchive
  unarchive: src=/var/www/html/wordpress.zip dest=/var/www/html/ owner=www-data group=www-data remote_src=yes
  
[root@ubuntu24 ~]# cat roles/wordpress/tasks/wp_set_domain.yaml
- name: set-wp-domain
  template: src=domain.conf.j2 dest=/etc/nginx/sites-enabled/{{ WP_DOMAIN }}.conf
  
[root@ubuntu24 ~]# cat roles/wordpress/tasks/main.yaml
- include_tasks: wp_get_code.yaml
- include_tasks: wp_unarchive.yaml
- include_tasks: wp_set_domain.yaml

[root@ubuntu24 ~]# cat roles/wordpress/templates/domain.conf.j2
server{
   listen {{ WP_PORT }};
   server_name {{ WP_DOMAIN }};
   include /etc/nginx/default.d/*.conf;
   root {{ WP_PATH }};
   index index.php index.html;

   location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
   }
}

service role 实现

[root@ubuntu24 ~]# tree roles/service/
roles/service/
├── files
├── tasks
│   ├── main.yaml
│   └── service.yaml
└── templates

4 directories, 2 files

[root@ubuntu24 ~]# cat roles/service/tasks/service.yaml
- name: service
   service: name={{ item.name }} state={{ item.state }} enabled={{ item.enabled }}
   loop: "{{ SERVICE_LIST }}"
   
[root@ubuntu24 ~]# cat roles/service/tasks/main.yaml
- include_tasks: service.yaml

mysql role 实现

[root@ubuntu24 ~]# tree roles/mysql/
roles/mysql/
├── files
│   └── grant.sql
├── tasks
│   ├── copy_file.yaml
│   ├── grant.yaml
│   ├── install.yaml
│   ├── main.yaml
│   ├── restart.yaml
│   └── user.yaml
└── templates

4 directories, 7 files

[root@ubuntu24 ~]# cat roles/mysql/tasks/user.yaml
- name: add-mysql-group
  group: name=mysql gid=306 system=yes

- name: add-mysql-user
  user: name=mysql group=306 system=yes uid=306 create_home=no


[root@ubuntu24 ~]# cat roles/mysql/tasks/install.yaml
- name: apt-install-mysql-server
  apt: name=mysql-server state=present update_cache=yes

- name: set-mysqld-conf-task-1
  lineinfile: path=/etc/mysql/mysql.conf.d/mysqld.cnf backrefs=yes regexp='^(bind-address.*)$' line='#\1'

- name: set-mysqld-conf-task-2
  lineinfile: path=/etc/mysql/mysql.conf.d/mysqld.cnf line='skip-name-resolve'

- name: set-mysqld-conf-task-3
  lineinfile: path=/etc/mysql/mysql.conf.d/mysqld.cnf line='default-authentication-plugin=mysql_native_password'
  
[root@ubuntu24 ~]# cat roles/mysql/tasks/restart.yaml
- name: restart-mysql-service
  service: name=mysql enabled=yes state=restarted
  
[root@ubuntu24 ~]# cat roles/mysql/tasks/copy_file.yaml
- name: copy-mysql-file
  copy: src=files/grant.sql dest=/tmp/grant.sql
  
[root@ubuntu24 ~]# cat roles/mysql/tasks/grant.yaml
- name: mysql-client-init
  shell: mysql </tmp/grant.sql
  
[root@ubuntu24 ~]# cat roles/mysql/tasks/main.yaml
- include_tasks: user.yaml
- include_tasks: install.yaml
- include_tasks: restart.yaml
- include_tasks: copy_file.yaml
- include_tasks: grant.yaml  

[root@ubuntu24 ~]# cat roles/mysql/files/grant.sql
create database if not exists wordpress;
create user 'wp_user'@'10.0.0.%' identified by '123456';
grant all on wordpress.* to 'wp_user'@'10.0.0.%';

flush privileges;

playbook 中配置 role

[root@ubuntu24 ~]# cat lnmp_wp.yaml
- hosts: 10.0.0.161
  gather_facts: no
  vars:
    WP_PORT: 80
    WP_DOMAIN: blog.baidu.com
    WP_PATH: /var/www/html/wordpress
    SERVICE_LIST: [ {name: nginx, state: restarted, enabled: yes},{name: php8.3-fpm, state: started, enabled: yes} ]
  roles:
    - nginx
    - php
    - wordpress
    - service
  
  
[root@ubuntu24 ~]# cat mysql.yaml
- hosts: 10.0.0.141
  gather_facts: no
  roles:
   - mysql

ansible-galaxy

ansible-galaxy 用来管理官方在云端提供的 role

ansible-galaxy [-h] [--version] [-v] TYPE ...

#常用选项
--version 	#显示版本信息
-h|--help 	#查看帮助
-v|--verbose #显示详细信息

#TYPE,不写时默认 type 为 roel
collection 	#合集
role 		#角色

#常用子命令
init 	#初始化
list 	#列出所有己安装的role或collection,
 		#此处的己安装,表示将相关文本下载到本地了,role 还要再调用 ansibleplaybook
search 	#在服务器上搜索
info 	#显示 role 
install #安装,即下载到本机,后面要再使用 ansible-playbook 进行安装
remove 	#移除,即删除本地相关文件

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

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

相关文章

[算法] 数组

1 二分查找 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/binary-search/submissions/570732311/ 前闭后闭 class …

Word 中脚注和尾注的区别有哪些?如何正确使用它们?

在撰写学术论文、报告或其他需要引用资料的文章时&#xff0c;脚注和尾注是两种常用的标注方法。它们不仅可以为读者提供额外的背景信息&#xff0c;还能帮助整理文章中的引用来源。下面我们就来详细的了解一下什么是脚注和尾注。 脚注 脚注&#xff08;Footnote&#xff09;…

大学离散数学:开启逻辑与思维的奇妙之旅

在大学的知识殿堂中&#xff0c;离散数学犹如一颗璀璨的明珠&#xff0c;散发着独特的魅力。 离散数学是现代数学的一个重要分支&#xff0c;它主要研究离散对象的结构及其相互关系。与连续数学不同&#xff0c;离散数学处理的是离散的、可数的对象&#xff0c;如整数、图、集…

Kubernetes简介与部署+Pod管理与优化

一、简介 1.基础信息 在Docker 作为高级容器引擎快速发展的同时&#xff0c;在Google内部&#xff0c;容器技术已经应用了很多年Borg系统运行管理着成干上万的容器应用。Kubernetes项目来源于Borg&#xff0c;可以说是集结了Borg设计思想的精华&#xff0c;并且吸收了Borg系统…

动态线程池设计与实现

为什么要有动态线程池 ThreadPoolExecutor 核心线程参数对某些业务不知到设置多少合适调整参数需要重新启动服务没有告警功能 设计思路 流程设计 库表抽象 更新操作流程图 代码实现 GitCode - 全球开发者的开源社区,开源代码托管平台

C++ 内部类

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 概念概述 如果一个类定义在另一个类的内部&#xff0c;这个内部类就叫做内部类。内部类…

(02)python-opencv图像处理——更改颜色空间HSV

前言 1、更改颜色空间 1.1BGR 到 Gray 的示例 1.2 BGR 到 HSV 的示例&#xff1a; ​编辑 1.3 通过HSV进行颜色追踪 1.3.1hsv cv.cvtColor(frame, cv.COLOR_BGR2HSV) 1.3.2 BGR vs HSV&#xff1a; 1.3.3 为什么使用 HSV 颜色空间&#xff1f; 1.3.4 cv.inRange(hsv…

oracle-函数-instr()的妙用以及相似功能like

INSTR(C1,C2[,I[,J]]) 【功能】在一个字符串中搜索指定的字符,返回发现指定的字符的位置; 【说明】多字节符(汉字、全角符等)&#xff0c;按1个字符计算 【参数】 C1 被搜索的字符串 C2 希望搜索的字符串 I 搜索的开始位置,默认为1 J 第J次出现的位置,默认为1 【…

安全帽未佩戴预警系统 劳保防护用品穿戴监测系统 YOLO

在建筑、矿山、电力等高危行业中&#xff0c;工人面临着各种潜在的危险&#xff0c;如高空坠物、物体打击等。安全帽能够有效地分散和吸收冲击力&#xff0c;大大降低头部受伤的严重程度。一旦工人未正确佩戴安全帽&#xff0c;在遭遇危险时&#xff0c;头部将直接暴露在危险之…

Linux网络编程 -- 网络套接字预备与udp

本文主要介绍网络编程的相关知识&#xff0c;在正式介绍网络编程之前&#xff0c;我们得先了解一些前置的知识。 1、端口号 我们上网其实就是两种动作&#xff0c;一个是将远处的数据拉取到本地&#xff0c;另一个是把我们的数据发送给远端。其实大部分的网络通信行为都是用户…

基于springboot vue3 工商局商家管理系统设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm springcloud等开发框架&#xff09; vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作☆☆☆ 精彩专栏推荐订阅☆☆☆☆…

【公共祖先】二叉树专题

里面涉及多个plus题 前言1.二叉树的最近公共祖先2.二叉搜索树的最近公共祖先3.二叉树的最近公共祖先II4.二叉树的最近公共祖先III5.二叉树的最近公共祖先IV 前言 公共祖先这一类题目&#xff0c;难度不大&#xff0c;但是非常实用&#xff0c;也是面试问到概率比较大的一类题目…

夜间数据库IO负载飙升?MySQL批量删除操作引发的问题排查

目录 问题现象 问题分析 修改建议 总结 问题现象 近日&#xff0c;某用户反馈他们的MySQL数据库实例在凌晨时段会频繁出现IO负载急剧上升的情况&#xff0c;这种状态会持续一段时间&#xff0c;随后自行恢复正常。为了查明原因&#xff0c;该用户通过DBdoctor工具收集了相…

DLL中函数导出时的注意事项

1.使用.def文件导出函数 1.1示例代码:使用stdcall 关键字 和 extern "C" 关键字修饰 dll中函数 BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) {switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:case DLL_THREAD_ATT…

sahi密集检测的推理技巧

最近在做一些计数的项目&#xff0c;样本中存在一些非常密集的目标&#xff0c;如果混杂一起训练指标很难达到要求&#xff0c;所以考虑在训练时不加入密集目标&#xff0c;训练使用正常的样本&#xff0c;在推理时使用密集检测方案。 在高分辨率图像中检测小目标一直是一个技…

【Qt+Python项目构建】- 02 Qt creator 14.0 + PySide6 如何让图像控件的尺寸变化和窗口一致

前言&#xff1a;【这是个AI不会回答的问题】 Qt Creator 新的版本又发出了&#xff0c;Pyside6 有很多新功能。但是&#xff0c;一些传统的方法要被淘汰了。 一个经典的例子是&#xff1a; 我有个一个图像要显示在Form里面的图像控件上&#xff0c;OK&#xff0c; 我现在拖…

Unity实现自定义图集(一)

以下内容是根据Unity 2020.1.0f1版本进行编写的   Unity自带有图集工具,包括旧版的图集(设置PackingTag),以及新版的图集(生成SpriteAtlas)。一般来说,unity自带的图集系统已经够用了,但是实际使用上还是存在一些可优化的地方,例如加载到Canvas上的资源,打图集不能…

JVM(学习预热 - 走进Java)(持续更新迭代)

目录 一、彻底认识Java虚拟机 开创世纪&#xff1a;Sun Classic 开创世纪&#xff1a;Exact VM 武林霸主&#xff1a;HotSpot VM 移动端虚拟机&#xff1a;Mobile/Embedded VM “三大”其二&#xff1a;BEA JRockit/IBM J9 VM 软硬结合&#xff1a;BEA Liquid VM/Azul VM…

更新子节点的优化策略1:目标old节点的位置预测

更新子节点的优化策略1&#xff1a;目标old节点的位置预测&#xff1a; 如果 oldStartVnode 和 newStartVnode 是同一个节点&#xff0c;直接 patchVnode&#xff0c;同时 oldStartIdx、newStartIdx 索引都加 1&#xff08;向右移动&#xff09;如果 oldEndVnode 和 newEndVno…

PE结构之 重定位表

那么,我们找到了某个 需要修改的绝对地址 的RVA, 将这个RVA转换成FOA后,这个绝对地址是读DWORD ,还是QWORD? 就是说,32位和64位是否有区别? 实验: 找到重定位表的数据,并观察在内存中和文件中的区别 将引用dll的exe文件,设置一下基址 同时DLL文件的基址和EXE文件设置一样,并…