ansible角色roles

Posted givenchy_yzl

tags:

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

roles角色

知识储备

什么是roles?

角色是ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等文件的工具。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中,roles是配置清单调试工具,降低项目复杂性

运维复杂的场景:建议使用 roles,代码复用度高

roles:多个角色的集合目录, 可以将多个的role,分别放至roles目录下的独立子目录中,如下示例

roles/
 mysql/
 nginx/
 tomcat/
 redis/

默认roles存放路径

/root/.ansible/roles
/usr/share/ansible/roles
/etc/ansible/roles

Ansible Roles目录编排

├── nginx -------------roles名称
│   ├── defaults--------必须存在的目录,存放默认的变量,模板文件中的变量就是引用自这里。defaults中的变量优先级最低,通常我们可以临时指定变量来进行覆盖
│   │   └── main.yml-------------每个目录都应该有,主入口文件
│   ├── files -------------ansible中unarchive、copy等模块会自动来这里找文件,从而我们不必写绝对路径,只需写文件名
│   │   ├── mysql.tar.gz
│   │   └── nginx.tar.gz
│   ├── handlers -----------存放tasks中的notify(触发器)指定的内容
│   │   └── main.yml
│   ├── meta----------存放依赖文件,可以没有
│   ├── tasks --------------存放playbook的目录,其中main.yml是主入口文件,在main.yml中导入其他yml文件,要采用import_tasks关键字,include要弃用了
│   │   ├── install.yml
│   │   └── main.yml -------主入口文件
│   ├── templates ----------存放模板文件。template模块会将模板文件中的变量替换为实际值,然后覆盖到客户机指定路径上
│   │   └── nginx.conf.j2
│   └── vars-------------可以没有

Roles各目录作用

files/ :存放由copy或script模块等调用的文件

templates/:template模块查找所需要模板文件的目录

tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含

handlers/:至少应该包含一个名为main.yml的文件;此目录下的其它的文件需要在此文件中通过

include进行包含

vars/:定义变量,至少应该包含一个名为main.yml的文件;此目录下的其它的变量文件需要在此文件中通过include进行包含

meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其它文件需在此文件中通过include进行包含

default/:设定默认变量时使用此目录中的main.yml文件,比vars的优先级低

创建roles

创建roles的步骤

1 创建以roles命名的目录(必须以roles命名)
2 在roles目录中分别创建以各角色名称命名的目录,如mysql等
3 在每个角色命名的目录中分别创建files、handlers、tasks、templates和vars等目录;用不到的目录可以创建为空目录,也可以不创建
4 在每个角色相关的子目录中创建相应的文件,如 tasks/main.yml,templates/nginx.conf.j2
5 在playbook文件中,调用需要的角色

[root@m01 package]# mkdir -p /root/package/roles/nginx/{files,handlers,tasks,templates,vars,meta,defaults}
[root@m01 package]# tree
.
└── roles
    └── nginx
        ├── files
        ├── handlers
        ├── meta
        ├── tasks
        ├── templates
        └── vars

使用roles编排web机器
1、创建用户(变量)
2、安装nginx
3、修改配置文件(变量及循环)
4、启动服务

针对大型项目使用Roles进行编排

# 范例
nginx-role.yml 
roles/
└── nginx 
     ├── files
     │   └── main.yml 
     ├── tasks
     │   ├── groupadd.yml 
     │   ├── install.yml 
     │   ├── main.yml 
     │   ├── restart.yml 
     │   └── useradd.yml 
     └── vars 
         └── main.yml

playbook调用角色

调用角色方法1

---
- hosts: web
  remote_user: root
  roles:
    - mysql
    - memcached
    - nginx  

调用角色方法2

---
- hosts: all
  remote_user: root
  roles:
    - mysql
    - { role: nginx, username: nginx }

调用角色方法3

---
- hosts: all
  remote_user: root
  roles:
    - { role: nginx, username: nginx, when: ansible_distribution_major_version == '7' }

调用角色方法4

---
- hosts: appsrvs
  remote_user: root
  roles:
    - { role: nginx ,tags: [ 'nginx', 'web' ] ,when: ansible_distribution_major_version == "6" }
    - { role: httpd ,tags: [ 'httpd', 'web' ] }
    - { role: mysql ,tags: [ 'mysql', 'db' ] }
    - { role: mariadb ,tags: [ 'mariadb', 'db' ] }

案例
httpd角色
#创建角色相关的目录
[root@ansible ~]#mkdir -pv /data/ansible/roles/httpd/{tasks,handlers,files}

#创建角色相关的文件
[root@ansible ~]#cd /data/ansible/roles/httpd/

#main.yml 是task的入口文件
[root@ansible ~]#vim tasks/main.yml

  • include: group.yml
  • include: user.yml
  • include: install.yml
  • include: config.yml
  • include: index.yml
  • include: service.yml

[root@ansible ~]#vim tasks/group.yml

  • name: create apache group
    group: name=apache system=yes gid=80

[root@ansible ~]#vim tasks/user.yml

  • name: create apache user
    user: name=apache system=yes shell=/sbin/nologin home=/var/www/ uid=80 group=apache

[root@ansible ~]#vim tasks/install.yml

  • name: install httpd package
    yum: name=httpd
    [root@ansible ~]#vim tasks/config.yml
  • name: config file
    copy: src=httpd.conf dest=/etc/httpd/conf/ backup=yes
    notify: restart
    [root@ansible ~]# tasks/index.yml
  • name: index.html
    copy: src=index.html dest=/var/www/html/
    [root@ansible ~]#vim tasks/service.yml
  • name: start service
    service: name=httpd state=started enabled=yes
    [root@ansible ~]#vim handlers/main.yml
  • name: restart
    service: name=httpd state=restarted

#在files目录下准备两个文件
[root@ansible ~]#ls files/
httpd.conf index.html
[root@ansible ~]#tree /data/ansible/roles/httpd/
/data/ansible/roles/httpd/
├── files
│ ├── httpd.conf
│ └── index.html
├── handlers
│ └── main.yml
└── tasks
├── config.yml
├── group.yml
├── index.yml
├── install.yml
├── main.yml
├── service.yml
└── user.yml
3 directories, 10 files
#在playbook中调用角色
[root@ansible ~]#vim /data/ansible/role_httpd.yml

httpd role

  • hosts: websrvs
    remote_user: root
    roles:
    • httpd

#运行playbook
[root@ansible ~]#ansible-playbook /data/ansible/role_httpd.yml
Copy to clipboardErrorCopied
NGINX角色
[root@ansible ~]#mkdir -pv /data/ansible/roles/nginx/{tasks,handlers,templates,vars}

#创建task文件
[root@ansible ~]#cd /data/ansible/roles/nginx/
[root@ansible nginx]#vim tasks/main.yml

  • include: install.yml
  • include: config.yml
  • include: index.yml
  • include: service.yml
    [root@ansible nginx]#vim tasks/install.yml
  • name: install
    yum: name=nginx

[root@ansible nginx]#vim tasks/config.yml

  • name: config file for centos7
    template: src=nginx7.conf.j2 dest=/etc/nginx/nginx.conf
    when: ansible_distribution_major_version==“7”
    notify: restart
  • name: config file for centos8
    template: src=nginx8.conf.j2 dest=/etc/nginx/nginx.conf
    when: ansible_distribution_major_version==“8”
    notify: restart

#跨角色调用文件
[root@ansible nginx]#vim tasks/index.yml

  • name: index.html
    copy: src=roles/httpd/files/index.html dest=/usr/share/nginx/html/
    [root@ansible nginx]#vim tasks/service.yml
  • name: start service
    service: name=nginx state=started enabled=yes
    #创建handler文件
    [root@ansible nginx]#cat handlers/main.yml
  • name: restart
    service: name=nginx state=restarted
    #创建两个template文件
    [root@ansible nginx]#cat templates/nginx7.conf.j2
    …省略…
    user {{user}};
    worker_processes {{ansible_processor_vcpus+3}}; #修改此行
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    …省略…
    [root@ansible nginx]#cat templates/nginx8.conf.j2
    …省略…
    user nginx;
    worker_processes {{ansible_processor_vcpus**3}}; #修改此行
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    …省略…
    #创建变量文件
    [root@ansible nginx]#vim vars/main.yml
    user: daemon
    #目录结构如下
    [root@ansible ~]#tree /data/ansible/roles/nginx/
    /data/ansible/roles/nginx/
    ├── handlers
    │ └── main.yml
    ├── tasks
    │ ├── config.yml
    │ ├── file.yml
    │ ├── install.yml
    │ ├── main.yml
    │ └── service.yml
    ├── templates
    │ ├── nginx7.conf.j2
    │ └── nginx8.conf.j2
    └── vars
    └── main.yml
    4 directories, 9 files
    #在playbook中调用角色
    [root@ansible ~]#vim /data/ansible/role_nginx.yml

#nginx role

  • hosts: web
    roles:
    • role: nginx

#运行playbook
[root@ansible ~]#ansible-playbook /data/ansible/role_nginx

以上是关于ansible角色roles的主要内容,如果未能解决你的问题,请参考以下文章

Ansible-08-角色

Ansible之Roles角色

Ansible的roles角色详解

ansible 角色定义及调用(nginx)

Ansible角色管理-Roles(实例演示!!!)

掌握Ansible角色(Roles)自动化部署配置LAMP架构