Ansible之Roles

简介: Ansible之Roles

一、Roles概述


(1)Roles简介


  • Roles又称为角色,playbook被称为本。Roles角色是自1.2版本之后引入的新特性,用于层次性、结构化的组织剧本
  • roles能够根据层次型结构自动装载变量文件、任务集、以及触发的动作等,要使用roles只需要在剧本中使用include命令引入即可


  • 简单的来说,roles就是分别将变量、文件、任务、模板以及处理器放置于不同的单独的目录,并且可以便捷的通过include引入
  • 角色一般用于基于主机构建的服务的场景中,但是也可以是用于构建守护进程等场景中,主要是使用在代码复用度较高的场景下


(2)Roles目录结构

d7e038cfc64a465abfc575631ce2e70c.png


各目录的作用:


roles: 所有的角色必须放到roles目录下,这个目录可以自定义,默认的位置就在/etc/ansible/roles,并且和剧本是同级目录


project: 具体的角色项目命令,比如nginx、tomcat、php


files: 用来存放配置文件或者源代码包的


tasks: 此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include引入其他的位于此目录的任务文件


vars: 此目录应当包含一个main.yml文件,用于定义此角色用到的变量


meta: 此目录应当包含一个main.yml文件,存放角色的说明信息、说明角色依赖等信息,可以不用写


default: 此目录应当包含一个main.yml文件,用于为当前角色设定默认变量


templates: 用来存放配置文件,跟files目录不同的是,这里的配置文件可以调用变量


handlers: 此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作,可以不用写


二、使用Roles


通过roles安装配置httpd服务,这里的roles角色使用默认路径


(1)创建目录

#有两种方法可以创建,第一种就是使用mkdir命令创建,比较麻烦,还有一种是使用ansible命令自动生成
******第一种,使用mkdir创建
[root@ansible ~]# cd /etc/ansible/roles/
[root@ansible roles]# mkdir -p httpd/{handlers,tasks,templates,vars}
[root@ansible roles]# cd httpd/
[root@ansible httpd]# tree
├── handlers
├── tasks
├── templates
└── vars
4 directories, 0 files
******第二种,使用ansible命令自动生成
[root@ansible roles]# ansible-galaxy init httpd  #使用ansible自动生成httpd角色
- httpd was created successfully
[root@ansible roles]# ll
总用量 0
drwxr-xr-x 10 root root 135 6月  24 17:24 httpd
[root@ansible roles]# cd httpd/
[root@ansible httpd]# tree  #这样创建的比较方便
.
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml


(2)变量文件准备,vars/main.yml


[root@ansible httpd]# vim vars/main.yml 
port: 8080     
username: www 
groupname: www


(3)配置模板文件,准备httpd.conf.j2

[root@ansible httpd]# cp /root/httpd.conf templates/httpd.conf.j2  #复制一份httpd的配置文件,将其改名为jinja2模板文件
[root@ansible httpd]# vim templates/httpd.conf.j2   #修改文件,引入变量
。。。。。。
 41 #Listen 12.34.56.78:80
 42 Listen {{ port }}
 43 
。。。。。。
 65 #
 66 User {{ username }}
 67 Group {{ groupname }}
 68 
。。。。。。
#保存退出

(4)任务剧本编写,创建用户、组、安装软件、配置、启动等

******创建组的任务
[root@ansible httpd]# vim tasks/group.yaml
- name: 创建组
  group: name=www gid=60 system=yes
******创建用户的任务
[root@ansible httpd]# vim tasks/user.yaml
- name: 创建用户
  user: name=www uid=60 system=yes shell=/sbin/nologin
******安装软件的任务
[root@ansible httpd]# vim tasks/install.yaml
- name: 安装httpd
  yum: name=httpd state=installed
******配置软件的任务
[root@ansible httpd]# vim tasks/config.yaml
- name: 复制模板文件
  template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf   #src指定的文件,会自动到template目录下寻找
  notify:
    - restart httpd     #创建触发
******启动软件的任务
[root@ansible httpd]# vim tasks/start.yaml
- name: 启动httpd
  service: name=httpd state=started enabled=yes
[root@ansible httpd]# tree tasks   #查看创建的文件
tasks
├── config.yaml
├── group.yaml
├── install.yaml
├── main.yml
├── start.yaml
└── user.yaml
0 directories, 6 files
******编写main.yml,将上面写的任务全部引入到main.yml文件中
[root@ansible httpd]# vim tasks/main.yml 
- include: group.yaml
- include: user.yaml
- include: install.yaml
- include: config.yaml
- include: start.yaml

(5)编写重启httpd的动作

#因为刚才在编写配置文件的剧本时添加了触发,所以需要写触发相应的动作,没有触发就无需写动作
[root@ansible httpd]# vim handlers/main.yml 
- name: restart httpd
  service: name=httpd state=restarted


(6)编写主的httpd的角色文件,调用httpd角色

[root@ansible httpd]# cd ..
[root@ansible roles]# vim httpd_roles.yml    #其实就是创建剧本
---
- hosts: web02
  remote_user: root
  roles:
    - role: httpd

(7)查看整体的目录结构


[root@ansible roles]# tree
.
├── httpd
│   ├── defaults
│   │   └── main.yml
│   ├── files
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── README.md
│   ├── tasks
│   │   ├── config.yaml
│   │   ├── group.yaml
│   │   ├── install.yaml
│   │   ├── main.yml
│   │   ├── start.yaml
│   │   └── user.yaml
│   ├── templates
│   │   └── httpd.conf.j2
│   ├── tests
│   │   ├── inventory
│   │   └── test.yml
│   └── vars
│       └── main.yml
└── httpd_roles.yml
9 directories, 15 files


03e7ac3ae8894d8e924b475b3abab1f0.png


(8)监测剧本是否有问题

[root@ansible roles]# ansible-playbook -C httpd_roles.yml 
 [WARNING]: Found variable using reserved name: port
PLAY [web02] ****************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************
ok: [192.168.100.204]
TASK [httpd : 创建组] **********************************************************************************************************************
changed: [192.168.100.204]
TASK [httpd : 创建用户] *********************************************************************************************************************
changed: [192.168.100.204]
TASK [httpd : 安装httpd] ******************************************************************************************************************
changed: [192.168.100.204]
TASK [httpd : 复制模板文件] *******************************************************************************************************************
changed: [192.168.100.204]
TASK [httpd : 启动httpd] ******************************************************************************************************************
changed: [192.168.100.204]
RUNNING HANDLER [httpd : restart httpd] *************************************************************************************************
changed: [192.168.100.204]
PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=7    changed=6    unreachable=0    failed=0   

(9)执行剧本

[root@ansible roles]# ansible-playbook  httpd_roles.yml   #执行成功
 [WARNING]: Found variable using reserved name: port
PLAY [web02] ****************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************
ok: [192.168.100.204]
TASK [httpd : 创建组] **********************************************************************************************************************
changed: [192.168.100.204]
TASK [httpd : 创建用户] *********************************************************************************************************************
changed: [192.168.100.204]
TASK [httpd : 安装httpd] ******************************************************************************************************************
changed: [192.168.100.204]
TASK [httpd : 复制模板文件] *******************************************************************************************************************
changed: [192.168.100.204]
TASK [httpd : 启动httpd] ******************************************************************************************************************
changed: [192.168.100.204]
RUNNING HANDLER [httpd : restart httpd] *************************************************************************************************
changed: [192.168.100.204]
PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=7    changed=6    unreachable=0    failed=0  

(10)验证

[root@ansible roles]# ansible web02 -m shell -a 'echo "aaaaaa" > /var/www/html/index.html' #编写网页
192.168.100.204 | SUCCESS | rc=0 >>
[root@ansible roles]# curl 192.168.100.204:8080  #说明剧本执行成功
aaaaaa

三、Roles总结


编写任务的时候,里面不需要写执行任务的主机,只需要写- name写命令就行,每个任务都是分开编写的文件,最后可以调用main.yml文件去顺序调用想要执行的文件,非常灵活、方便


定义变量的时候直接按照key和value的格式将变量写道vars目录下的main.yml文件即可,然后任务或者模板直接调用,会自动去vars下的main.yml文件寻找


定义动作的时候,直接在动作中的main.yml文件中写触发相应的动作即可,一个文件中可以写多个动作,也可以想任务那样每个动作写一个文件,通过include引入就行,在任务调用触发的时候直接写于动作名字对应即可


模板文件默认放在template目录中,任务调用时会自动到这个目录中寻找模板文件,但是如果是一个角色调用另外一个角色的单个任务时,那么任务中有些调用的模板或者文件就需要写绝对路径

目录
相关文章
|
8月前
|
运维 负载均衡 关系型数据库
【运维知识进阶篇】用Ansible Roles重构LNMP架构(Linux+Nginx+Mariadb+PHP),实现4个项目一键部署
【运维知识进阶篇】用Ansible Roles重构LNMP架构(Linux+Nginx+Mariadb+PHP),实现4个项目一键部署
112 0
|
8月前
|
存储 运维 应用服务中间件
【运维知识进阶篇】Ansible Roles详解
【运维知识进阶篇】Ansible Roles详解
82 0
|
9月前
|
持续交付
ansible roles 自动化部署http服务
ansible roles 自动化部署http服务
57 0
|
9月前
|
应用服务中间件 PHP nginx
ansible:roles学习笔记
ansible:roles学习笔记
70 0
|
11月前
|
运维 关系型数据库 MySQL
自动化运维工具-Ansible的Roles的使用
自动化运维工具-Ansible的Roles的使用
104 0
自动化运维工具-Ansible的Roles的使用
|
运维 关系型数据库 MySQL
自动化运维工具-Ansible的Roles的使用
自动化运维工具-Ansible的Roles的使用
176 0
|
tengine 应用服务中间件 nginx
Ansible-playbook roles安装nginx实例(学习笔记二十六)
1、nginx包相关信息: nginx_user: www                        nginx用户 nginx_port: 80                         nginx监听端口 nginx_web_dir: /data/webroot/nginxnginx的目录 nginx_version: 1.
1089 0
|
应用服务中间件 nginx PHP
|
应用服务中间件 测试技术 持续交付
|
运维 关系型数据库 PHP