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 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
(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目录中,任务调用时会自动到这个目录中寻找模板文件,但是如果是一个角色调用另外一个角色的单个任务时,那么任务中有些调用的模板或者文件就需要写绝对路径
以上是关于Ansible之Roles的主要内容,如果未能解决你的问题,请参考以下文章