一、roles简介

将多种不同的tasks的文件集中存储在某个目录下,则该目录就是角色,角色一般存放在/etc/ansible/roles/目录下,可通过ansible的配置文件来调整默认的角色目录,/etc/ansible/roles/目录下有很多子目录,其中每一个子目录对应一个角色,每个角色也有自己的目录结构,如图:

20200322142808

每个角色的定义,以特定的层级目录结构进行组织。比如:

  • files:存放有copy或script等模块调用的文件;
  • templates:存放template模块查找所需要的模板文件的目录;
  • tasks:任务存放的目录;
  • handlers:存放相关触发执行器的目录;
  • vars:变量存放的目录;
  • meta:用于存放此角色元数据;
  • default:默认变量存放的目录,文件中定义了此角色使用的默认变量;

上述目录中,tasks、handlers、vars、meta、default至少应该包含一个main.yaml文件,该目录下也可由其他.yaml文件,但是需要在main.yml文件中用include指令将其他.yml文件包含起来。

二、简单的roles示例

$ mkdir roles   
#创建一个目录,名称为roles。官方推荐在/etc/ansible/roles/这个目录,不过在哪里都是可以的
$ mkdir roles/nginx
$ cd roles/nginx/
$ mkdir tasks templates
$ cd tasks/
$ cat user.yaml 
- name: create user
  user: name=nginx uid=80 group=nginx system=yes shell=/sbin/nologin

$ cat group.yaml 
- name: create group
  group: name=nginx gid=80
$ cat yum.yaml 
- name: install package
  yum: name=nginx

$ cat templ.yaml 
- name: copy conf
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf 

$ cat stservice.yaml 
- name: start service
  service: name=nginx state=started enabled=yes

$ cat main.yaml 
- include: group.yaml
- include: user.yaml
- include: yum.yaml
- include: templ.yaml
- include: stservice.yaml
#如果需要调用别的角色的yaml文件,也可以这样写,比如:- include:roles/httpd/tasks/copyfile.yaml
注意:copyfiile.yaml文件中的源路径必须是绝对路径

$ ls
nginx.conf.j2
#该文件就是nginx的配置文件改名了而已
$ cd ../../../
$ cat nginx.yaml 
- hosts: webservers
  remote_user: root
  roles:
    - role: nginx    
#定义了多个角色,也可在接着写,每行调用一个角色
#也可以定义tags标签,比如:- { roles: httpd ,tags:[\'web\',\'httpd\']}或- { roles: httpd ,tags:\'web\'  如果需要加when语句,在此处添加 }都可以
$ ls
nginx.yaml  roles
#确保调用nginx的yaml文件是和roles是在同一目录下的
$ tree
.
├── nginx.yaml
└── roles
    └── nginx
        ├── tasks
        │   ├── group.yaml
        │   ├── main.yaml
        │   ├── reservice.yaml
        │   ├── stservice.yaml
        │   ├── templ.yaml
        │   ├── user.yaml
        │   └── yum.yaml
        └── templates
            └── nginx.conf.j2
#确保目录的层次效果是这样的
$ ansible-playbook nginx.yaml 
#如果定义了标签,就可对标签进行操作(比如:web或httpd)
$ ansible webservers -m shell -a \'ss -lntp | grep nginx\'
#确认被控端的主机nginx已经启动

一个简单的nginx的roles已经编写完成了!

三、roles示例二

$ mkdir app
$ cd app/
$ mkdir tasks templates vars handlers files
$ cd tasks/
$ cat group.yaml 
- name: create group
  group: name=apache system=yes
$ cat user.yaml 
- name: create user
  user: name=apache group=apache system=yes shell=/sbin/nologin
$ cat yum.yaml 
- name: install package
  yum: name=httpd
$ cat templ.yaml 
- name: copy file
  template: src=httpd.conf.j2 dest=/etc/httpd/httpd.conf
  notify: restart service

$ cat copyfile.yaml 
- name: copy config
  copy: src=vhosts.conf dest=/etc/httpd/conf.d/ owner=apache
$ cat start.yaml 
- name: start service
  service: name=httpd state=started
$ cat main.yaml 
- include: group.yaml
- include: user.yaml
- include: yum.yaml
- include: templ.yaml
- include: copyfile.yaml
- include: start.yaml
$ ls files/vhosts.conf 
files/vhosts.conf
#空文件用于测试
$ cat handlers/main.yaml 
- name: restart service
  service: name=httpd state=restarted
$ cat templates/httpd.conf.j2 
#httpd的配置文件
$ cat vars/main.yaml 
username: apache
groupname: apache
$ tree
.
├── files
│   └── vhosts.conf
├── handlers
│   └── main.yaml
├── tasks
│   ├── copyfile.yaml
│   ├── group.yaml
│   ├── main.yaml
│   ├── start.yaml
│   ├── templ.yaml
│   ├── user.yaml
│   └── yum.yaml
├── templates
│   └── httpd.conf.j2
└── vars
    └── main.yaml
#目录结构
$ cat httpd.yaml 
---
- hosts: webservers
  remote_user: root
  roles:
    - httpd
$ ls
httpd.yaml  nginx.yaml  roles
#确保与roles目录在同一目录下
$ ansible-playbook httpd.yaml 
$ ansible all -m shell -a \'ps -ef | grep apache\'
//根据配置文件中修改的内容自行进行修改

版权声明:本文为lvzhenjiang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lvzhenjiang/p/14199463.html