Ansible之Roles

Posted 礁之

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible之Roles相关的知识,希望对你有一定的参考价值。

一、Roles概述

(1)Roles简介

  • Roles又称为角色,playbook被称为剧本。Roles角色是自1.2版本之后引入的新特性,用于层次性、结构化的组织剧本
  • roles能够根据层次型结构自动装载变量文件、任务集、以及触发的动作等,要使用roles只需要在剧本中使用include命令引入即可
  • 简单的来说,roles就是分别将变量、文件、任务、模板以及处理器放置于不同的单独的目录,并且可以便捷的通过include引入
  • 角色一般用于基于主机构建的服务的场景中,但是也可以是用于构建守护进程等场景中,主要是使用在代码复用度较高的场景下

(2)Roles目录结构

各目录的作用:

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 624 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

(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总结

  1. 编写任务的时候,里面不需要写执行任务的主机,只需要写- name写命令就行,每个任务都是分开编写的文件,最后可以调用main.yml文件去顺序调用想要执行的文件,非常灵活、方便
  2. 定义变量的时候直接按照key和value的格式将变量写道vars目录下的main.yml文件即可,然后任务或者模板直接调用,会自动去vars下的main.yml文件寻找
  3. 定义动作的时候,直接在动作中的main.yml文件中写触发相应的动作即可,一个文件中可以写多个动作,也可以想任务那样每个动作写一个文件,通过include引入就行,在任务调用触发的时候直接写于动作名字对应即可
  4. 模板文件默认放在template目录中,任务调用时会自动到这个目录中寻找模板文件,但是如果是一个角色调用另外一个角色的单个任务时,那么任务中有些调用的模板或者文件就需要写绝对路径

以上是关于Ansible之Roles的主要内容,如果未能解决你的问题,请参考以下文章

Ansible之Roles角色

自动化运维Ansible之Roles部署配置LAMP架构

Ansible之roles使用

Ansible自动化部署之ROLES

自动化运维工具Ansible之roles

Ansible进阶之roles详解