Linux服务器教程之十六Ansible的Roles
【摘要】 角色是ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景。
一个项目从开始到结束,不是简单几十个playbook就可以完事了,当文件数很多,有上百个的话,仅通过简单的includes不停的引用,那最终的结果错综复杂。这个时候ansible roles就可以很好的发挥它的作用了。
roles,字面意思是角色的含义,可以理解为有相互关联功能的集合。我们把安装ntp、mem、nginx、db等等的功能角色放在一个大仓库里,然后用到哪个,从那里面去拿,拿一个,拿两个都可以。
roles:是个目录,角色集合
概念
roles(角色): 就是通过分别将variables, tasks及handlers等放置于单独的目录中,并可以便捷地调用它们的一种机制。
假设我们要写一个playbook来安装管理lamp环境,那么这个playbook就会写很长。所以我们希望把这个很大的文件分成多个功能拆分, 分成apache管理,php管理,mysql管理,然后在需要使用的时候直接调用就可以了,以免重复写。就类似编程里的模块化的概念,以达到代码复用的效果。
创建roles的目录结构
files:用来存放由copy模块或script模块调用的文件。
tasks:至少有一个main.yml文件,定义各tasks。
handlers:有一个main.yml文件,定义各handlers。
templates:用来存放jinjia2模板。
vars:有一个main.yml文件,定义变量。
meta:有一个main.yml文件,定义此角色的特殊设定及其依赖关系。
注意: 在每个角色(管理模块信息)的目录中分别创建files, tasks,handlers,templates,vars和meta目录,用不到的目录可以创建为空目录。
通过roles实现lamp
需定制三个角色: httpd,mysql,php
第1步: 创建roles目录及文件,并确认目录结构
m1# cd /etc/ansible/roles/
m1# mkdir -p {httpd,mysql,php}/{files,tasks,handlers,templates,vars,meta}
m1# touch {httpd,mysql,php}/{tasks,handlers,vars,meta}/main.yml
m1# yum install tree -y
m1# tree /etc/ansible/roles/
/etc/ansible/roles/
├── httpd
│ ├── files
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ └── vars
│ └── main.yml
├── mysql
│ ├── files
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ └── vars
│ └── main.yml
└── php
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
└── vars
└── main.yml
第2步: 准备httpd服务器的主页文件,php测试页和配置文件等**
m1# echo "test main page" > /etc/ansible/roles/httpd/files/index.html
m1# echo -e "<?php\n\tphpinfo();\n?>" > /etc/ansible/roles/httpd/files/test.php
m1# yum install httpd -y
按需求修改配置文件后,拷贝到httpd角色目录里的files子目录
m1# vim /etc/httpd/conf/httpd.conf
#管理机上的httpd.conf拷贝道道当前目录;
m1# cp /etc/httpd/conf/httpd.conf /etc/ansible/roles/httpd/files/
第3步: 编写httpd角色的main.yml文件
---
- name: 安装httpd
yum: name=httpd,httpd-devel state=present
- name: 同步httpd配置文件
copy: src=/etc/ansible/roles/httpd/files/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart httpd
- name: 同步主页文件
copy: src=/etc/ansible/roles/httpd/files/index.html dest=/var/www/html/index.html
- name: 同步php测试页
copy: src=/etc/ansible/roles/httpd/files/test.php dest=/var/www/html/test.php
- name: 启动httpd并开机自启动
service: name=httpd state=started enabled=yes
第4步: 编写httpd角色里的handler
m1# vim /etc/ansible/roles/httpd/handlers/main.yml
---
- name: restart httpd
service: name=httpd state=restarted
第5步: 编写mysql角色的main.yml文件
---
- name: 安装mysql
yum: name=mariadb,mariadb-server,mariadb-devel state=present
- name: 启动mysql并开机自启动
service: name=mariadb state=started enabled=yes
第6步: 编写php角色的main.yml文件
m1# vim /etc/ansible/roles/php/tasks/main.yml
---
- name: 安装php及依赖包
yum: name=php,php-gd,php-ldap,php-odbc,php-pear,php-xml,php-xmlrpc,php-mbstring,php-snmp,php-soap,curl,curl-devel,php-bcmath,php-mysql state=present
notify: restart httpd
第7步:编写lamp的playbook文件调用前面定义好的三个角色
m1# vim /etc/ansible/playbook/lamp.yaml
#roles的入口文件
---
- hosts: all
remote_user: root
roles:
- httpd
- mysql
- php
第8步: 执行lamp的playbook文件
m1# ansible-playbook /etc/ansible/playbook/lamp.yaml
案例: 通过roles实现lamp并安装discuz(论坛)
第1步: 创建roles目录及文件,并确认目录结构
m1# cd /etc/ansible/roles/
m1# mkdir -p {httpd,mysql,php}/{files,tasks,handlers,templates,vars,meta}
m1# touch {httpd,mysql,php}/{tasks,handlers,vars,meta}/main.yml
第2步: 准备httpd相关文件
m1# ls /etc/ansible/roles/httpd/files/
Discuz_X3.2_SC_UTF8.zip Discuz相关软件包
httpd.conf 配置好的httpd.conf配置文件
第3步: 编写httpd角色的main.yml文件
m1# vim /etc/ansible/roles/httpd/tasks/main.yml
- name: 安装httpd相关软件包
yum: name=httpd,httpd-devel state=latest
- name: 同步配置文件
copy: src=/etc/ansible/roles/httpd/files/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart httpd
- name: 拷贝discuz压缩包
copy: src=/etc/ansible/roles/httpd/files/Discuz_X3.2_SC_UTF8.zip dest=/tmp/
- name: 解压并mv网站文件到httpd家目录
shell: rm -rf /var/www/html/* && rm -rf /test/ && mkdir -p /test/ && unzip /tmp/Discuz_X3.2_SC_UTF8.zip -d /test/ &> /dev/null && mv /test/upload/* /var/www/html/ && chown -R apache.apache /var/www/html/
# 上面的命令有点多,可以写成脚本,然后使用script模块来调用执行
- name: 启动httpd并开机自启动
service: name=httpd state=started enabled=on
第4步: 编写httpd角色里的handler
m1# vim /etc/ansible/roles/httpd/handlers/main.yml
---
- name: restart httpd
service: name=httpd state=restarted
第5步: 编写mysql角色的main.yml文件
m1# vim /etc/ansible/roles/mysql/tasks/main.yml
---
- name: 安装mariadb相关软件包
yum: name=mariadb-server,mariadb-devel state=latest
- name: 启动mariadb服务并设置开机自启动
service: name=mariadb state=started enabled=on
- name: 执行建库脚本
script: /etc/ansible/roles/mysql/files/create.sh
第6步: 编写mysql的建库脚本
m1# vim /etc/ansible/roles/mysql/files/create.sh
#!/bin/bash
mysql << EOF
create database if not exists discuz default charset=utf8;
grant all on discuz.* to 'discuz'@'localhost' identified by '123';
flush privileges;
EOF
第7步: 编写php角色的main.yml文件
m1# vim /etc/ansible/roles/php/tasks/main.yml
---
- name: 安装php相关软件包
yum: name=php,php-gd,php-ldap,php-odbc,php-pear,php-xml,php-xmlrpc,php-mbstring,php-snmp,php-soap,curl,curl-devel,php-bcmath,php-mysql state=present
notify: restart httpd
第8步:编写lamp的playbook文件调用前面定义好的三个角色
m1# vim /etc/ansible/playbook/lamp.yaml
---
- hosts: all
remote_user: root
roles:
- httpd
- mysql
- php
第9步: 执行lamp的playbook文件
m1# ansible-playbook /etc/ansible/playbook/lamp.yaml
总结
角色是ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。
简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中.运维复杂的场景:建议使用 roles,代码复用度高
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)