Ansible运维自动化工具(roles进阶)

  • A+
所属分类:自动化工具

Ansible传送门

Ansible运维自动化工具(简介)

Ansible运维自动化工具(安装)

Ansible运维自动化工具(主机组)

Ansible运维自动化工具(模块)

Ansible运维自动化工具(playbooks简介)

Ansible运维自动化工具(playbooks应用)

Ansible运维自动化工具(roles进阶)

roles介绍

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

roles示例

vim site.yml
vim webservers.yml
vim dbservers.yml
 
roles/
  common/
  files/
  templates/
  tasks/
  handlers/
  vars/
  meta/
webservers/
  files/
  templates/
  tasks/
  handlers/
  vars/
  meta/

而在playbook中,可以这样使用roles:

---
- hosts: webservers
  roles:
    - common
    - webservers

也可以向roles传递参数,例如:

---
- hosts: webservers
  roles:
    - common
    - { role: foo_app_instance, dir: '/opt/a', port: 5000 }
    - { role: foo_app_instance, dir: '/opt/b', port: 5001 }

甚至也可以条件式地使用roles,例如:

---
- hosts: webservers
  roles:
    - { role: some_role, when: "ansible_os_family == 'RedHat'" }

创建role的步骤

(1) 创建以roles命名的目录;

(2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等;

(3)
在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建;

(4) 在playbook文件中,调用各角色;

role内各目录中可用的文件

tasks目录:至少应该包含一个名为main.yml的文件,其定义了此角色的任务列表;此文件可以使用include包含其它的位于此目录中的task文件;

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

templates目录:template模块会自动在此目录中寻找Jinja2模板文件;

handlers目录:此目录中应当包含一个main.yml文件,用于定义此角色用到的各handler;在handler中使用include包含的其它的handler文件也应该位于此目录中;

vars目录:应当包含一个main.yml文件,用于定义此角色用到的变量;

meta目录:应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系;ansible 1.3及其以后的版本才支持;

default目录:为当前角色设定默认变量时使用此目录;应当包含一个main.yml文件;

检查Ansible默认roles目录

[root@py ansible]# vim /etc/ansible/ansible.cfg
roles_path = /etc/ansible/roles:/usr/share/ansible/roles

创建roles对应的目录

[root@py ~]# cd /etc/ansible/roles/
[root@py roles]# mkdir -pv 
./{nginx,memcached,httpd,mysql}/{files,templates,vars,handlers,meta,default,tasks}
[root@py roles]# tree
├── httpd
│ ├── default
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
├── memcached
│ ├── default
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
├── mysql
│ ├── default
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
└── nginx
├── default
├── files
├── handlers
├── meta
├── tasks
├── templates
└── vars

上传nginx安装文件

ll /etc/ansible/roles/nginx/files/nginx.rpm

定义task

[root@py files]# vim /etc/ansible/roles/nginx/tasks/main.yml
- name: copy nginx package to host
  copy: src=nginx.rpm dest=/tmp/nginx.rpm
- name: install nginx
  yum: name=/tmp/nginx.rpm state=present
- name: install conf file
  template: src=nginx.conf.j2 dest=/etc/nginx.conf
  tags: ngxconf
  notify: reload nginx service
- name: start nginx service
service: name=nginx enabled=true state=started

大家可以发现此处的模板跟之前的不一样,比如说,开头没有了定义主机、用户、和task等,此处的task会自行查找/etc/ansible/roles/nginx/task/main.yml的任务(此处文件本身也是在task目录下面)。再比如说,该处指定的copy命令的src=FILENAME也是相对路径,其绝对路径为/etc/ansible/roles/nginx/file/FILENAME。又比如说定义了notify但是这里并没有handlers,是因为此处定义了的notify的名字会自行去查看该目录下面即/etc/ansible/roles/nginx/handlers/main.yml里面的handlers。还有template那里,大家有没发现也是用的相对路径,此处绝对路径为在/etc/ansible/roles/nginx/template/nginx.conf.j2。

定义handlers

[root@py nginx]# cat /etc/ansible/roles/nginx/handlers/main.yml
- name: reload nginx service
  service: name=nginx state=restarted

定义templates

复制nginx.conf文件到templates目录下面为nginx.conf.j2

[root@py nginx]# cp /etc/nginx/nginx.conf 
/etc/ansible/roles/nginx/templates/nginx.conf.j2

修改worker_rlimit_nofile读取变量

[root@py templates]# vim /etc/ansible/roles/nginx/templates/nginx.conf.j2

worker_rlimit_nofile {{ ngxlimit}};

定义vars

vim /etc/ansible/roles/nginx/vars/main.yml
ngxlimit: "65535"

meta和default的文件夹在此处暂时用不上

创建yml文件

然后我们在/etc/ansible/目录下面创建一个nginx.yml的文件

[root@py ansible]# vim /etc/ansible/nginx.yml
- hosts: webserver
  remote_user: root
  roles:
  - nginx

检查语法:

[root@py ansible]# ansible-playbook --syntax-check nginx.yml
playbook: nginx.yml

测试:

[root@py ansible]# ansible-playbook nginx.yml
YaLei

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: