Linux服务器教程之十六Ansible的Roles

举报
tea_year 发表于 2025/01/22 07:11:52 2025/01/22
270 0 0
【摘要】 角色是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

1724984679676.png

案例: 通过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

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。