- Roles又称为角色,playbook被称为剧本。Roles角色是自1.2版本之后引入的新特性,用于层次性、结构化的组织剧本。在ansible中,roles是playbooks的一部分。playbooks模块化之后,成为roles的组织结构,易读,代码可重用,层次清晰。
- 简单的说,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中、并可以便捷地include他们的一种机制。
- 角色一般用于基于主机构建服务的场景中、但也可以是用于构建守护进程等场景中,主要是使用在代码复用度较高的场景下
- 以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等;
各目录的作用:
- roles: 所有的角色必须放到roles目录下,这个目录可以自定义,默认的位置就在/etc/ansible/roles,并且和剧本是同级目录
- project: 具体的角色项目命令,比如nginx、tomcat、php
- files #角色名称,用来存放配置文件或者源代码包的
- handlers #存放静态文件,此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作,可以不用写
- tasks #具体任务,此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用
- templates #模板文件,用来存放配置文件,跟files目录不同的是,这里的配置文件可以调用变量
- vars #存放变量, 此目录应当包含一个main.yml文件,用于定义此角色用到的变量
role执行顺序:pre_tasks > role > tasks > post_tasks
通过roles安装配置nginx服务
[root@ansible1 ~]# mkdir /roles
[root@ansible1 roles]# mkdir nginx/ 角色叫什么就创建什么(我这里叫nginx)
在nginx目录下,就是分开的那些功能,每个功能一个目录,文件在哪创建一个目录,处理器在哪就创建一个目录。目录创建好,还有一个site.yaml的文件,这个文件名字可以随意写。
[root@ansible1 nginx]# mkdir files handlers tasks templates vars
[root@ansible1 roles]# touch site.yaml 最终执行的东西,最后写
[root@ansible1 ~]# tree /roles/ 查看目录树
任务剧本编写,创建用户、组、安装软件、配置、启动等
[root@ansible1 nginx]# vim tasks/main.yaml
--- 在这个位置可以不写
- name: install nginx package 名字的命名相当于描述,很长
yum: name={{ item }} state=latest item是一个变量 安装一个 latest/installed/present,latest直接安装最新版 删除removed/absent
with_items: 当有需要重复性执行的任务时,可以使用迭代机制。按照从上到下的顺序依次执行,当把值执行完了,任务就完了。先安装epel,再安装nginx
- epel-release 源的名字
- nginx
- name: copy nginx.conf template 名字随便写,
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf 调用模板template,拷贝nginx配置文件的模板,不是拷贝配置文件,是拷贝模板文件
notify: restart nginx 调用一个处理器,这个名字要和处理器name保持一致
- name: copy index.html
copy: src=index.html dest=/usr/share/nginx/html/index.html 拷贝它的主页文件
- name: make sure
service: name=nginx state=started 启动服务
【注意】epel源,如果最后下载不了,z'j
因为刚才在编写配置文件的剧本时添加了触发,所以需要写触发相应的动作
[root@ansible1 nginx]# vim handlers/main.yaml
---
- name: restart nginx 这个名字要和 notify保持一致
service: name=nginx state=restarted
[root@ansible1 nginx]# vim vars/main.yaml 变量文件准备
worker_connections: 10240 我只定义了一个变量,就算是100个也是这样,一行一个。
在模板文件用,把它的连接数改掉,就改成这个变量存储的值。我现在只改了一个,将来可能你去修改可能要改,发布网站的目录,日志文件的路径,keepalived,tomcat的值,但是修改之前,在模板文件要把它定义成变量。
我们会把它放在templates里,模板文件可以手动写,但一般不会手动写,它就是在原来nginx配置文件的基础上做了修改。直接拷贝一个nginx的配置文件。
[root@ansible1 templates]# cp /etc/nginx/nginx.conf nginx.conf.j2
[root@ansible1 templates]# vim nginx.conf.j2
ansible_processor_cores 用这个变量,这个没有定义,是从 facts,setup模块会获取对面机器的基本信息,基本信息里就有这么一个变量,这个变量的值是预定义变量,就已经定义好了,facts组件自动获取的变量。
worker_connections 调用变量,10240
[root@ansible1 roles]# vim site.yaml 创建剧本,就是执行程序的入口。
---
- hosts: 192.168.22.172
roles: (要是有多个roles,就接着往下写)
- nginx
[root@ansible1 files]# vim index.html
[root@ansible1 roles]# ansible-playbook -C site.yaml -C测试运行,但不会产生运行结果
[root@ansible1 roles]# ansible-playbook site.yaml
人工检查一遍,看看nginx,它应该是启动状态。访问一下没问题,
vim /etc/nginx/nginx.conf 看模板有没有生效,之前定义了10240