当前位置: 首页 > news >正文

[Ansible系列]ansible roles

目录

一.  Roles简介

二.  Roles基本构成 

三.  Role使用 

3.1  playbook中引用roles

3.2  pre_tasks 和 post_tasks

3.3  role的依赖

四.  Ansible Galaxy


一.  Roles简介

         在Ansible中,role是将playbook分割为多个文件的主要机制。它大大简化了复杂playbook的编写, 同时还使得它们非常易于复用。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单的说,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中、并可以便捷地include他们的一种机制。

二.  Roles基本构成 

[root@clinet ansible_1]# tree .
.
├── group_vars
├── host_vars
├── inventory
├── man.yml
└── roles└── new_roles├── defaults│   └── main.yml├── files├── handlers│   └── main.yml├── meta│   └── main.yml├── README.md├── tasks│   └── main.yml├── templates├── tests│   ├── inventory│   └── test.yml└── vars└── main.yml
[root@clinet ansible_1]# 

 Roles各个目录的作用:

1.  group_vars:定义主机组变量,在group_vars目录中创建一个文件,文件的文件名称要与inventory清单中的组名称保持一致。

2.  host_vars:定义主机变量,在host_vars目录中创建文件,文件的名称要与inventory清单中的主机名称保持一致,如果是ip地址,则创建相同ip地址的文件即可。

3.  inventory:定义主机和主机组

4.  main.yml:用于执行roles的playbook,该名称自定义,执行方式为ansible-playbook  xx.yml

5.  roles:存放自定义的roles文件和目录,该目录下new_roles表示一个工作角色,可以存在多个工作角色,每个工作角色目录中必须有上述结构中的文件和目录。

        5.1  files:用于存放copy或script等模块调用的文件和脚本,也用于存放一些非模板文件的文件,如https证书等。

        5.2  tempaltes:用于存放角色相关的Jinja2模板文件,当使用角色相关的模板时,如未明确指定模 板路径,则默认使用此目录中的模板。

        5.3  tasks:角色所要执行的所有任务文件都存放于此,包含一个主文件main.yml,可以在主文件中 通过include的方式引入其他任务文件。

        5.4  vars:用于定义此角色用到的变量,包含一个主文件main.yml,可以在主文件中 通过include的方式引入其他任务文件。

        5.5  meta:用于存储角色的元数据信息,这些元数据用于描述角色的相关属性,包括作者,角色的 主要作用,角色的依赖关系等。默认这些信息会写入到当前目录下的main.yml文件中(可不写)。

        5.6  defaults:除了vars目录,defaults目录也用于定义此角色用到的变量,与vars不同的是, defaults中定义的变量的优先级最低。(实际工作中我们经常将变更比较频繁的变量定义在该文件中)包含一个主文件main.yml,可以在主文件中 通过include的方式引入其他任务文件。

        5.7  handlers:用于定义角色中需要调用 的handlers,包含一个主配置文件main.yml,可通过 include引入其他的handlers文件。


(tests目录可以不要)

创建role的步骤如下:

 1. 创建以roles命名的目录

2. 在roles目录中分别创建角色名称命名的目录,如websrvs等

3. 在每个角色命名的目录中分别创建files、handlers、meta、tasks、teamplates和vars目录,用 不到的目录可以创建为空目录,也可以不创建。

4. 在playbook文件中,调用各角色

 需要说明的是,以上目录并不都是必须的,如果你的roles当中并不需要用到某一个目录,也可 以不用创建,比如我们将所有的变量都放到defaults中,则可以不需要vars目录,如果未用到模 板文件,则不需要templates目录。(建议就当都是必要的,因为后面我们在通过ansible-galaxy init来创建roles的目录就是齐全的。)

三.  Role使用 

         以部署nginx做负载均衡,httpd做后台web为例:

roles目录结构如下:

[root@clinet ansible_1]# tree .
.
├── ansible.cfg
├── group_vars
├── host_vars
├── inventory
├── man.yml
└── roles└── new_roles├── defaults│   └── main.yml├── files│   └── xhz.txt├── handlers│   └── main.yml├── meta│   └── main.yml├── README.md├── tasks│   └── main.yml├── templates│   ├── index.html.j2│   └── nginx.conf.j2└── vars└── main.yml
[root@clinet ansible_1]# 

文件配置内容如下:

[root@clinet ansible_1]# cat inventory 
[proxy]
192.168.194.132[webserver]
192.168.194.130
192.168.194.131
[root@clinet ansible_1]# 
[root@clinet ansible_1]# cat man.yml 
- hosts: proxy:webservergather_facts: yespre_tasks:- name: fireword.serverservice:name: firewalldstate: stoppedenabled: nopost_tasks:- name: message infodebug:msg: 'this playbook finished'roles:- new_roles
[root@clinet ansible_1]# 
[root@clinet ansible_1]# cat roles/new_roles/defaults/main.yml 
listen_port: 80
[root@clinet ansible_1]# 
[root@clinet ansible_1]# cat roles/new_roles/files/xhz.txt 
192.168.194.128
[root@clinet ansible_1]# cat roles/new_roles/handlers/main.yml 
- name: restart nginxservice:name: nginxstate: restarted- name: restart httpdservice:name: httpdstate: restarted
[root@clinet ansible_1]# cat roles/new_roles/tasks/main.yml 
- name: install & configure ngxin blockblock:- name: install nginxpackage:name: nginxstate: present- name: configure nginx.conftemplate:src: nginx.conf.j2dest: /etc/nginx/nginx.confbackup: yesnotify: restart nginx- name: start ngixnservice:name: nginxstate: startedenabled: yeswhen: ansible_ens33.ipv4.address in groups['proxy']- name: install & configure httpd blockblock:- name: install httpdpackage:name: httpdstate: present- name: confgure http.conftemplate:src: index.html.j2dest: /var/www/html/index.htmlbackup: yesnotify: restart httpd- name: start httpdservice:name: httpdstate: startedenabled: yeswhen: ansible_ens33.ipv4.address in groups['webserver']- name: copy filecopy:src: xhz.txtdest: /tmp/backup: yes
[root@clinet ansible_1]# cat roles/new_roles/vars/main.yml 
user_name: nginx
[root@clinet ansible_1]# 
[root@clinet ansible_1]# 

3.1  playbook中引用roles

         创建好roles之后,需要有playbook来进行引用roles,上述中的引用playbook就是install_role.yml

[root@clinet ansible_1]# cat install_role.yml 
- hosts: proxy:webservergather_facts: yesroles:- new_roles
[root@clinet ansible_1]# 
[root@clinet ansible_1]# 

 下面也是一个带入变量的示例:

[root@clinet ansible_1]# cat install_role.yml 
- hosts: proxy:webservergather_facts: yesroles:- role: new_rolesvars:dir1: '/xhz123'dir2: '/flf456'
[root@clinet ansible_1]# 
[root@clinet ansible_1]# 

也可以通过如下方法引用时带入变量: 

[root@clinet ansible_1]# cat install_role.yml 
- hosts: proxy:webservergather_facts: yesroles:- {role: new_roles, dir1: '/xhz123',dir2: '/flf456'}
[root@clinet ansible_1]# 
[root@clinet ansible_1]# 

 还可以在引用时使用条件语句:

[root@clinet ansible_1]# cat install_role.yml 
- hosts: proxy:webservergather_facts: yesroles:- {role: new_roles, when: "ansible_os_family == 'xhz123'"}
[root@clinet ansible_1]# 
[root@clinet ansible_1]#

3.2  pre_tasks 和 post_tasks

         如果在执行一个role时,需要在其前或其后依然要执行某些任务,我们可以使用 pre_tasks 及 post_tasks 来声明。 pre_tasks 是在 role 之前执行,而 post_tasks 则在role之后执行。

[root@clinet ansible_1]# cat install_role.yml 
- hosts: proxy:webservergather_facts: yespre_tasks:- name: fireword.serverservice:name: firewalldstate: stoppedenabled: nopost_tasks:- name: message infodebug:msg: 'this playbook finished'roles:- {role: new_roles, when: "ansible_os_family == 'xhz123'"}
[root@clinet ansible_1]# 

3.3  role的依赖

        如果当前role在执行前需要依赖另一个role,我们可以在roles的meta目录中的main.yml中定义role 的依赖关系。 

示例1:

[root@clinet ansible_1]# cat roles/new_roles/meta/main.yml
dependencies:‐ { role: common, some_parameter: 3 }‐ { role: apache, port: 80 }‐ { role: postgres, dbname: blarg, other_parameter: 12 }

 示例2:

[root@clinet ansible_1]# cat roles/new_roles/meta/main.yml
dependencies:‐ {role: ntp, ntp_server=ntp.ubuntu.com}‐ {role: web}‐ {role: memcached}

四.  Ansible Galaxy

         ansible-galaxy是一个工具,我们可以利用它快速的创建一个标准的roles目录结构,还可以通过它在 https://galaxy.ansible.com上下载别人写好的roles,直接拿来用。

通过ansible-galaxy初始化一个roles的目录结构,方法如下:

ansible‐galaxy   init   new_role

 安装别人写好的roles:

 ansible‐galaxy   install   ‐p   /etc/ansible/roles   bennojoy.mysql

-p:指定路径
默认从galaxy官网下载,官网地址:Ansible Galaxy

列出已安装的roles:

 ansible‐galaxy    list

 查看已安装的roles信息:

 ansible‐galaxy   info   bennojoy.mysql

卸载roles: 

 ansible‐galaxy    remove    bennojoy.mysql


 

http://www.lryc.cn/news/24897.html

相关文章:

  • 冯诺依曼体系结构与操作系统的理解
  • API接口签名验证
  • Keettle (pdi-ce) 整库多表迁移(避坑)
  • 搭建私人《我的世界》服务器,使用Cpolar内网穿透更简单
  • map和set的使用
  • 常用正则表达式大全
  • 注意,摸鱼程序员常用的9个小技巧,早点下班不秃头
  • 【Linux】文件时间-ACM
  • [架构之路-124]-《软考-系统架构设计师》-操作系统-3-操作系统原理 - IO设备、微内核、嵌入式系统
  • 【竞赛/TPU】算能TPU编程竞赛总结
  • Substrate 基础教程(Tutorials) -- 模拟网络 添加可信节点
  • SAP 设置无物料号的费用采购
  • k8s ConfigMap 中 subPath 字段和 items 字段
  • UML建模
  • JavaScript常见面试题(更新中)
  • TCP/IP协议
  • Python使用异步线程池实现异步TCP服务器交互
  • matplotlib常用操作
  • 二分算法题
  • Vue+ElementUI+SpringBoot项目配合分页插件快速实现分页(简单暴力)
  • 【回眸】牛客网刷刷刷!嵌入式软件中也会遇到的嵌入式硬件,通讯,通讯协议专题(一)
  • 使用Vue展示数据(动态查询)
  • 构建数据库测试数据——mysql
  • 你想要的Android性能优化系列:启动优化 !
  • python3的基础入门3:基本数据类型
  • 消息队列原理与实战-学习笔记
  • Linux权限相关知识(大量图文展示,及详细操作)
  • Ep_操作系统面试题-什么是协程
  • 在C#中使用互斥量解决多线程访问共享资源的冲突问题
  • JavaEE进阶第六课:SpringBoot配置文件