ansible_角色的使用

本章主要介绍ansible中角色的使用

  • 了解什么是角色
  • 独立地写一个角色
  • 使用角色
  • 系统自带角色地使用

1.了解角色

        正常情况下,配置一个服务如 apache时,要做一系列的操作:安装、拷贝、启动服务等。如果要在不同的机器上重复配置此服务,需要重新执行这些操作。

        为了简化这些重复劳动,可以把安装、拷贝、启动 服务等操作打包成一个整体,这个整体称为角色,如图34-1所示。

        如果想在其他机器上安装并配置apache,只要调用此角色即可,这样就可以实现一次劳动、永久回报的效果。

        一个角色本质上就是一个文件夹,此文件夹名就是角色名,此文件夹中包含许多文件,有的是用于执行各种模块的文件,有的是用于拷贝到被管理主机的jinj2模板文件,有的是定义的变量文件。

        为了防止文件太多太乱,在此角色的文件夹中再创建一个个的子目录,用于存放不同的文 件。例如,jinja2模板放在templates目录中,普通的文件放在files目录中,变量文件放在vars目录中,执行模块的各个task放在tasks目录中等。角色目录中每个子目录的作用总结如表34-1所示。

        所有的角色都放在一个目录中等待被调用,默认目录为ansible.cfg所在目录的roles目录, 如果要修改路径可以在ansible.cfg中用roles path选项指定。

        本章实验都在/home/lduan/demo5下操作,先把demo5目录创建出来并把 ansible.cfg 和hosts拷贝进去,命令如下。
[blab@node01 ~]$ mkdir demo5
[blab@node01 ~]$ cp ansible.cfg hosts demo5/
[blab@node01 ~]$ cd demo5/
[blab@node01 demo5]$
修改ansible.cfg,添加 roles path = ./roles,命令如下。
[blab@node01 demo5]$ cat ansible.cfg 
[defaults]
inventory = ./hosts
command_warnings=False        //增加内容
roles_path = ./roles          //增加内容[privilege_escalation]
become=True
become_method=sudo
become_user=root[blab@node01 demo5]$

2.手把手创建一个角色

创建一个名称为apache的角色
[blab@node01 demo5]$ ansible-galaxy init roles/apache
- Role roles/apache was created successfully
[blab@node01 demo5]$ ls roles/
apache
[blab@node01 demo5]$ 
这里apache就是一个角色,看一下apache 中的内容
[blab@node01 demo5]$ ls roles/apache/
defaults  files  handlers  meta  README.md  tasks  templates  tests  vars
[blab@node01 demo5]$
        里面有不少目录,如前面介绍的,这些目录分别用于存放不同的文件。回顾在上期内容 demo4目录中写好的hand-1.yaml的内容。
[blab@node01 demo5]$ cat /home/blab/demo4/hand-1.yml 
---
- hosts: node03vars:myport: 80tasks:- name: task1安装httpyum: name=httpd state=installed- name: tasks2拷贝配置文件template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf- name: task3启动httpd服务service: name=httpd state=startedhandlers:- name: restart httpd1service: name=httpd state=restarted- name: restart httpd2service: name=httpd state=restarted
[blab@node01 demo5]$ 
这个文件中包含了以下内容:
  1. vars中是定义变量地
  2. tasks中的代码是正常要执行的
  3. handler中的代码是被触发执行才会执行的
  4. httpd.conf.j2是引用的jinja2模板
        下面把这个YAML文件中的内容拆分放在apache角色的不同目录中,把 tasks下的代码放在tasks目录中,把 handlers下的代码放在handlers目录中等。

把 tasks的内容写入roles/apache/tasks/main.yml 中
[blab@node01 demo5]$ cat roles/apache/tasks/main.yml 
---
- name: task1 安装httpdyum: name=httpd state=installed
- name: task2 拷贝配置文件template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.confnotify: restart httpd1
- name: task3 启动httpd 服务service: name=httpd state=started
[blab@node01 demo5]$ 
把 handlers 的内容写入roles/apache/handlers/main.yml 中
[blab@node01 demo5]$ cat roles/apache/handlers/main.yml 
---
- name: restart httpd1service: name=httpd state=restarted
- name: restart httpd2service: name=httpd state=restarted
[blab@node01 demo5]$
        在roles/apache/tasks/main.yml 中,template模块拷贝的文件 http.conf.j2所在的目录是roles!apache/templates,所以先把需要的 httod.conf.i2据贝到 roles/apache/templates中
[blab@node01 demo5]$ cp ../demo4/httpd.conf.j2 roles/apache/templates/
[blab@node01 demo5]$ ls roles/apache/templates/
httpd.conf.j2
[blab@node01 demo5]$ 
把变量myport写入roles/apache/vars/main.yml中
[blab@node01 demo5]$ cat roles/apache/vars/main.yml 
---
myport: 8080
[blab@node01 demo5]$
        这里把myport的值改为8080,原来的值为80,会使 httpd.conf.j2中的端口发生变化,从而会触发handler。
        也可以不在roles/apache/vars/main.yml中定义变量,而是在playbook 中定义myport 变量,如果在角色的vars 和 playbook 中都定义了myport变量,且变量的值不同,则角色的 vars中定义的变量生效。

下面查看apache这个角色的结构
[blab@node01 demo5]$ tree roles/apache/
roles/apache/
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
│   └── httpd.conf.j2
├── tests
│   ├── inventory
│   └── test.yml
└── vars└── main.yml8 directories, 9 files
[blab@node01 demo5]$
这样apache这个角色我们就算是最终写好了。

3.使用角色

        角色写好之后,只要在playbook中直接调用即可,在playbook中的roles下调用,调用的语法如下。
 roles:‐ name: 名称1role: rolesname1‐ name: 名称2role: rolesname2
 roles:‐ role: rolesname1‐ role: rolesname2
下面写一个名称为test-role1.yaml的 playbook,里面调用apache这个角色
[blab@node01 demo5]$ cat test-roles1.yml 
---
- hosts: node02roles:- role: apache
[blab@node01 demo5]$
运行此playbook
[blab@node01 demo5]$ ansible-playbook test-roles1.yml PLAY [node02] ******************************************************************TASK [Gathering Facts] *********************************************************
ok: [node02]TASK [apache : task1 安装httpd] **************************************************
changed: [node02]TASK [apache : task2 拷贝配置文件] ***************************************************
changed: [node02]TASK [apache : task3 启动httpd 服务] ***********************************************
changed: [node02]RUNNING HANDLER [apache : restart httpd1] **************************************
changed: [node02]PLAY RECAP *********************************************************************
node02                     : ok=5    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   [blab@node01 demo5]$
        这里是运行test-rolel vam1之后的完整结果,可以看到运行的结果与前面运行的结果一样。变量可以在角色的defaults. vars中定义,也可以在nlavbook中定义,优先级的顺序是: 角色的vars中定义的变量→playbook中定义的变量→角色的defaults 中定义的变量。
        所以,如果同一个变量同时在这三个地方被定义了,则角色的vars中定义的变量生效。先把在roles/apache/vars/main.yml中定义变量myport 的那行注释掉,这个变量将在 playbook中定义,如下所示。
[blab@node01 demo5]$ cat roles/apache/vars/main.yml 
---
myport: 8080
[blab@node01 demo5]$
修改test-tole1.yaml的内容如下
[blab@node01 demo5]$ cat test-roles1.yml 
---
- hosts: node02vars:myport: 808roles:- role: apache
[blab@node01 demo5]$ 
运行此playbook
[blab@node01 demo5]$ ansible-playbook test-roles1.yml PLAY [node02] ******************************************************************TASK [Gathering Facts] *********************************************************
ok: [node02]TASK [apache : task1 安装httpd] **************************************************
ok: [node02]TASK [apache : task2 拷贝配置文件] ***************************************************
ok: [node02]TASK [apache : task3 启动httpd 服务] ***********************************************
ok: [node02]PLAY RECAP *********************************************************************
node02                     : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   [blab@node01 demo5]$
到node02上验证 httpd 开启的端口是多少
[root@node02 ~]# netstat -napt | grep httpd
tcp6       0      0 :::8080                 :::*                    LISTEN      6297/httpd          
[root@node02 ~]#
可以看到。httpd现在使用的端口是8080

4.系统 自带的角色

除我们自己创建的角色外,系统中也包含了一些内置的角色。
在node02上切换到root 用户,然后安装软件包rhel-system-roles.noarch
[root@node01 ~]# yum -y install rhel-system-roles.noarch  //root用户安装
[root@node01 ~]# su - blab  //切换用户
安装好这个软件包之后,在/usr/share/ansible/roles目录中会有许多角色,如图34-2所示。
        下面演示rhel-system-roles.selinux这个角色,使用lduan用户把rhel-system-roles.selinux拷贝到demo5下的roles目录中
[blab@node01 ~]$ cp -r  /usr/share/ansible/roles/rhel-system-roles.selinux/ /home/blab/demo5/
[blab@node01 ~]$ cd demo5
[blab@node01 demo5]$ ls
ansible.cfg  hosts  rhel-system-roles.selinux  roles  test-roles1.yml
[blab@node01 demo5]$ 
        前面在讲解handlers时,为httpd 配置了其他端口808,但是因为SELinux的问题,我们临时把 SELinux关闭了
[root@node02 ~]# setenforce 0    //临时关闭
[root@node02 ~]# getenforce        //查看是否关闭
Permissive
[root@node02 ~]# 
        可以看到,node02上 SELinux的模式是Permissive。下面我们利用角色rhel-system-
roles.selinux把 node02上 SELinux的模式改为 Enforcing。
查看角色rhel-system-roles.selinux中默认的变量
[blab@node01 demo5]$ cat rhel-system-roles.selinux/defaults/main.yml 
---
selinux_state: null
selinux_policy: null# Set up empty lists for SELinux changes.
selinux_booleans: []
selinux_fcontexts: []
selinux_logins: []
selinux_ports: []
selinux_restore_dirs: []# Purging local modifications is disabled by default.
selinux_all_purge: no
selinux_booleans_purge: no
selinux_fcontexts_purge: no
selinux_ports_purge: no
selinux_logins_purge: no
[blab@node01 demo5]$ 
        其中第一个变量是selinux state,这个变量用于指定SELinux的模式,默认值设置为了 null。可以在playbook中定义这个变量,覆盖这个默认的变量值
[blab@node01 demo5]$ cat test-role2.yml 
---
- hosts: node02vars:selinux_state: enforcingroles:- role: rhel-system-roles.selinux
[blab@node01 demo5]$
运行此playbook
PLAY RECAP *********************************************************************
node02                     : ok=7    changed=1    unreachable=0    failed=0    skipped=16   rescued=0    ignored=0   [blab@node01 demo5]$ 
到 node02上查看验证,
[root@node02 ~]# getenforce 
Enforcing
[root@node02 ~]# 
这里已经把 node02上 SELinux的模式改为了 Enforcing。

5.修改端口上下文

        在介绍handler 时,可以通过变量myport随意修改端口。但是端口上下文不对,httpd是启动不起来的,所以当初把 node02上的 SELinux 临时关闭了。
下面介绍如何使用角色rhel-system-roles.selinux修改端口上下文。

查看角色 rhel-system-roles.selinux中默认的变量
[blab@node01 demo5]$ cat rhel-system-roles.selinux/defaults/main.yml 
---
selinux_state: null
selinux_policy: null# Set up empty lists for SELinux changes.
selinux_booleans: []
selinux_fcontexts: []
selinux_logins: []
selinux_ports: []
selinux_restore_dirs: []# Purging local modifications is disabled by default.
selinux_all_purge: no
selinux_booleans_purge: no
selinux_fcontexts_purge: no
selinux_ports_purge: no
selinux_logins_purge: no
[blab@node01 demo5]$ 
        这里变量selinux_ports是一个列表,里面的元素需要定义多个变量,但是变量名是什么我们现在还不清楚。

        用vim 编辑器打开roles/rhel-system-roles.selinux/tasks/main.yml,大概第116行是用于定义端口上下文
[blab@node01 demo5]$ vim rhel-system-roles.selinux/tasks/main.yml 114 - name: Set an SELinux label on a port
115   seport:
116     ports: "{{ item.ports }}"
117     proto: "{{ item.proto | default('tcp') }}"
118     setype: "{{ item.setype }}"
119     state: "{{ item.state | default('present') }}"
120   with_items: "{{ selinux_ports }}"
        这里只截取了部分代码,可以看到循环列表selinux ports中的4个变量。其中 proto和 state有默认值,ports和setvpe没有默认值,所以我们在定义列表selinux ports时,至少要在列表的元素中定义ports和 setype这两个变量。

修改test-role1.yml的内容
[blab@node01 demo5]$ cat test-roles1.yml 
---
- hosts: node02vars:myport: 808selinux_ports:- ports: "{{myport}}"setype: http_port_troles:- role: rhel-system-roles.selinux- role: apache
[blab@node01 demo5]$ 
        这里定义了一个变量myport的值为808,然后定义了一个列表selinux_ports。这个列表中只有一个元素,元素中有两个变量ports和 setype。其中 ports这个变量引用myport 的值,记得要用双引号引起来,setype的值被设置为了http_port_t。

注释:roles/apache/vars/main.yml 中的变量 否则会因为优先级的问题导致端口号不能更改
[blab@node01 demo5]$ cat roles/apache/vars/main.yml 
---
#myport: 8080
[blab@node01 demo5]$ 

运行此 playbook
[blab@node01 demo5]$ ansible-playbook test-roles1.yml PLAY RECAP *********************************************************************
node02                     : ok=10   changed=1    unreachable=0    failed=0    skipped=16   rescued=0    ignored=0   [blab@node01 demo5]$
然后到node02上检查httpd所使用的端口
[root@node02 ~]# netstat -napt | grep httpd
tcp6       0      0 :::808                  :::*                    LISTEN      13421/httpd         
[root@node02 ~]# 
可以看到,httpd此时使用的端口是808。

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

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

相关文章

新品出击 | 软网关BLIoTLink免费发布

新品出击|软网关BLIoTLink免费发布 BLIoTLink是一款免费的物联网协议转换软件,可以部署在任何基于Linux OS的系统(Linux、Debian、Ubuntu、FreeRTOS、RT-Thread)中,使用灵活,可以实现数据的采集以及接入网络平台。 BL…

ssm基于JavaEE的智能实时疫情监管服务平台的设计与实现+jsp论文

摘 要 社会发展日新月异,用计算机应用实现数据管理功能已经算是很完善的了,但是随着移动互联网的到来,处理信息不再受制于地理位置的限制,处理信息及时高效,备受人们的喜爱。本次开发一套智能实时疫情监管服务平台有管…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《面向平稳氢气需求的综合制氢系统鲁棒优化配置方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主的专栏栏目《论文与完整程序》 这个标题涉及到针对平稳氢气需求的综合制氢系统鲁棒优化配置方法。让我们逐步解读这个标题的关键要素: 面向平稳氢气需求: 这部分指…

k8s之kudeadm

kubeadm来快速的搭建一个k8s的集群: 二进制搭建适合大集群,50台以上主机 kubeadm更适合中小企业的业务集群 master:192.168.233.91 docker kubelet lubeadm kubectl flannel node1:192.168.233.92 docker kubelet lubeadm kubectl flannel…

Gin 源码深度解析及实现

介绍 什么是 gin ? 一个轻量级高性能 HTTP Web 框架。 Introduction | Gin Web Framework (gin-gonic.com) Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 它具有类似 Martini 的 API,但性能比 Martini 快 40 倍。 为什么使用 gin ? In…

TP-LINK 路由器忘记密码 - 恢复出厂设置

TP-LINK 路由器忘记密码 - 恢复出厂设置 1. 恢复出厂设置2. 创建管理员密码3. 上网设置4. 无线设置5. TP-LINK ID6. 网络状态References 1. 恢复出厂设置 在设备通电的情况下,按住路由器背面的 Reset 按钮直到所有指示灯同时亮起后松开。 2. 创建管理员密码 3. 上网…

uni-appcss语法

锋哥原创的uni-app视频教程: 2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中...共计23条视频,包括:第1讲 uni…

Zookeeper之手写一个分布式锁

前言 我之前写了一篇快速上手ZK的文章:https://blog.csdn.net/qq_38974073/article/details/135293106 本篇最要是进一步加深学习ZK,算是一次简单的实践,巩固学习成果。 设计一个分布式锁 对锁的基本要求 可重入:允许同一个应…

跟小德学C++之配置文件(形式)

嗨,大家好,我是出生在达纳苏斯的一名德鲁伊,我是要立志成为海贼王,啊不,是立志成为科学家的德鲁伊。最近,我发现我们所处的世界是一个虚拟的世界,并由此开始,我展开了对我们这个世界…

命令模式-举例

开关和电灯之间并不存在直接耦合关系,在命令模式中,发送者与接收者之间引入了新的命令对象,将发送者的请求封装在命令对象中,再通过命令对象来调用接收者的方法。 命令模式的主要缺点如下: 使用命令模式可能会导致某…

Android MVVM 写法

前言 Model:负责数据逻辑 View:负责视图逻辑 ViewModel:负责业务逻辑 持有关系: 1、ViewModel 持有 View 2、ViewModel 持有 Model 3、Model 持有 ViewModel 辅助工具:DataBinding 执行流程:View &g…

视频监控EasyCVR如何通过设置sei接口,实现在webrtc视频流中添加画框和文字?

安防视频监控系统基于视频综合管理平台EasyCVR视频系统,采用了开放式的网络结构,可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力,具备权限管…

传奇私服教程,新手小白速速下载!

传奇私服教程,新手小白速速下载! 第二十课-封玩家账号登陆-封玩家机器码登陆.zip 第十九课-快速搭建FTP服务器教程配套工具.zip 第十八课-绿盟GOM1108引擎登陆器配置防劫持列表教... 第十七课-最新访问网站自动弹出加群教程.zip 修复沙城捐献不了或者捐献…

Flutter BottomSheet 拖动分两段展示

第一段 第二段 实现思路 通过 GestureDetector 的 Drag 方法,动态改变Dialog的高度,通过设置一个最大高度和最小高度分成两层进行展示 实现 常用的展示BottomSheet的方法为 showModalBottomSheet /// 设置最高最好以高度的比例进行设置,方…

FPGA设计时序约束十四、Set_External_Delay

一、序言 在时序约束中对clock的约束还存在一种特殊的延时约束set external delay。set external delay如字面含义,设置外部的时延值,但这个外部时延主要是指反馈时延,即信号从FPGA的output端口输出后经过外部电路回到输入端口的时延值。 二…

Linux:线程优先级设置

目录 一、背景二、调整普通线程的优先级通过系统命令通过Linux C代码 三、调整实时线程的优先级通过系统命令通过Linux C代码 四、参考资料(建议一定要阅读) 在操作系统中,线程优先级决定了线程在 CPU 调度时的重要性。较高优先级的线程会在竞…

服务器被黑了,记录一下

前两天刚开的新的服务,立马被黑,哈哈。有懂这个是什么黑组织吗,哈哈 All your data is backed up. You must pay 0.017 BTC to 1KdmpErgS3isFf8FrLaTfGHLQPKNsv839G In 48 hours, your data will be publicly disclosed and deleted. (more i…

GEE错误——‘xxx‘ did not match any bands.

这里我们在进行影像展示的时候会出现下面的错误,主要的原因是我们虽然进行了波段运算,但是依旧无法加载,主要原因是我们没有将计算过后的波段信息进行添加到我们的一个多波段影像,这里我们首先来看看代码出现的错误提示。当然这里只是给出了主要的问题,其实在进行波段运算…

Visual Basic入门指南(一)

Visual Basic入门指南 Visual Basic是一种由微软公司开发的简单、易学的编程语言。它被广泛应用于Windows应用程序的开发,并且有着强大的可视化编程能力。本文将介绍Visual Basic的基础知识和常用技巧,帮助读者快速入门。 环境准备 随便找一个软件安装…

java在线票务系统(选座)Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java servlet 在线票务系统(选座)管理系统是一套完善的java web信息管理系统 系统采用serlvetdaobean(mvc模式),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要…