
- 一、Roles概述
- (1)Roles简介
- (2)Roles目录结构
- 二、使用Roles
- (1)创建目录
- (2)变量文件准备,vars/main.yml
- (3)配置模板文件,准备httpd.conf.j2
- (4)任务剧本编写,创建用户、组、安装软件、配置、启动等
- (5)编写重启httpd的动作
- (6)编写主的httpd的角色文件,调用httpd角色
- (7)查看整体的目录结构
- (8)监测剧本是否有问题
- (9)执行剧本
- (10)验证
- 三、Roles总结
- Roles又称为角色,playbook被称为剧本。Roles角色是自1.2版本之后引入的新特性,用于层次性、结构化的组织剧本
- roles能够根据层次型结构自动装载变量文件、任务集、以及触发的动作等,要使用roles只需要在剧本中使用include命令引入即可
- 简单的来说,roles就是分别将变量、文件、任务、模板以及处理器放置于不同的单独的目录,并且可以便捷的通过include引入
- 角色一般用于基于主机构建的服务的场景中,但是也可以是用于构建守护进程等场景中,主要是使用在代码复用度较高的场景下
各目录的作用:
二、使用Rolesroles: 所有的角色必须放到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安装配置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目录中,任务调用时会自动到这个目录中寻找模板文件,但是如果是一个角色调用另外一个角色的单个任务时,那么任务中有些调用的模板或者文件就需要写绝对路径
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)