ansible-playbook 之 roles
roles
roles用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令引入即可。
简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷的include它们的一种机制。roles一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。主要使用场景代码复用度较高的情况下。
假如我们现在有3个被管理主机,第一个要配置成httpd,第二个要配置成haproxy服务器,第三个要配置成MySQL(mariadb)服务器。我们如何来定义playbook?
第一个play用到第一个主机上,用来构建httpd,第二个play用到第二个主机上,用来构建haproxy。这些个play定义在playbook中比较麻烦,将来也不利于模块化调用,不利于多次调用。比如说后来又加进来一个主机,这第3个主机既是httpd服务器,又是haproxy服务器,我们只能写第3个play,上面写上安装httpd和haproxy。这样playbook中的代码就重复了。
为了避免代码重复,可以定义一个角色叫httpd,第二个角色叫haproxy,并使用roles实现代码重复被调用。
#roles 的目录结构: cd /etc/ansible/ tree roles/ roles/ ├── web/ #相当于 playbook 中的 每一个 play 主题 │ ├── files/ │ ├── templates/ │ ├── tasks/ │ ├── handlers/ │ ├── vars/ │ ├── defaults/ │ └── meta/ └── db/ ├── files/ ├── templates/ ├── tasks/ ├── handlers/ ├── vars/ ├── defaults/ └── meta/ #roles 内各目录含义解释 ●files 用来存放由 copy 模块或 script 模块调用的文件。 ●templates 用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件。 ●tasks 此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件。 ●handlers 此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作。 ●vars 此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。 ●defaults 此目录应当包含一个 main.yml 文件,用于为当前角色设定默认变量。 这些变量具有所有可用变量中最低的优先级,并且可以很容易地被任何其他变量覆盖。所以生产中我们一般不在这里定义变量 ●meta 此目录应当包含一个 main.yml 文件,用于定义此角色的元数据信息及其依赖关系。 #roles角色的作用 可以把playbook剧本里的各个play看作为一个角色,将各个角色的tasks任务,vars变量,template模板和copy,script模块使用的相关文件等内容放置在指定角色的目录里统一管理,在需要的时候可在playbook中使用roles角色直接调用即可。也就是说roles角色可以在playbook中实现代码的复用 roles/ #角色总目录,其每个子目录就是一个角色 nginx/ #相当于playbook中的每一个play主题,目录名就是角色名 files/ #存放copy、script模块调用的文件 templates/ #存放template模块调用的xxx.j2 模板文件 tasks/main.yml #定义此角色的tasks普通任务列表 handlers/main.yml #定义此角色通过notify触发时执行的handiers处理器任务列表 vars/main.yml #定于此角色用的自定义变量 defaults/main.yml #定义此角色用的默认变量(一般不用) meta/main.yml #定义此角色的元数据信息和依赖关系 mysql/ ... php/ ... vim xxx.yml - name: hosts: remote_user:
LNMP
#创建MySQL,nginx,php目录
#创建7个子目录
NGINX#
nginx_addr: 192.168.19.24 nginx_port: 80 server_name: www.cxk.com root_dir: /var/www/html php_addr: 192.168.19.25 php_port: 9000 pkg: nginx svc: nginx
[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
location ~ \.php$ {
root {{root_dir}};
fastcgi_pass {{php_addr}}:{{php_port}};
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME {{root_dir}}$fastcgi_script_name;
include fastcgi_params;
}
- name: disable firewalld service: name=firewalld state=stopped enabled=no - name: disable selinux command: '/usr/sbin/setenforce 0' ignore_errors: true - name: copy nginx repo copy: src=nginx.repo dest=/etc/yum.repos.d/ - name: install nginx yum: name={{pkg}} state=present - name: create root dir file: path={{root_dir}} state=directory - name: prepare nginx config file template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf notify: "reload nginx" - name: start nginx service: name={{svc}} state=started enabled=yes
- name: reload nginx
service: name={{svc}} state=reloaded
- name: install nginx
hosts: webservers
remote_user: root
roles:
- nginx
MySQL#
wget https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm
[mysql-connectors-community] name=MySQL Connectors Community baseurl=http://repo.mysql.com/yum/mysql-connectors-community/el/7/$basearch/ enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql [mysql-tools-community] name=MySQL Tools Community baseurl=http://repo.mysql.com/yum/mysql-tools-community/el/7/$basearch/ enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql # Enable to use MySQL 5.5 [mysql55-community] name=MySQL 5.5 Community Server baseurl=http://repo.mysql.com/yum/mysql-5.5-community/el/7/$basearch/ enabled=0 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql # Enable to use MySQL 5.6 [mysql56-community] name=MySQL 5.6 Community Server baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/7/$basearch/ enabled=0 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql [mysql57-community] name=MySQL 5.7 Community Server baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
[mysql80-community]
name=MySQL 8.0 Community Server
baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
[mysql-tools-preview]
name=MySQL Tools Preview
baseurl=http://repo.mysql.com/yum/mysql-tools-preview/el/7/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
[mysql-cluster-7.5-community]
name=MySQL Cluster 7.5 Community
baseurl=http://repo.mysql.com/yum/mysql-cluster-7.5-community/el/7/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
[mysql-cluster-7.6-community]
name=MySQL Cluster 7.6 Community
baseurl=http://repo.mysql.com/yum/mysql-cluster-7.6-community/el/7/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
#避免重复,用include调用
- include: "init.yml" - name: remove mariadb yum: name=mariadb* state=absent - name: copy mysql repo copy: src=mysql-community.repo dest=/etc/yum.repos.d/ - name: modify mysql repo replace: path=/etc/yum.repos.d/mysql-community.repo regexp="gpgcheck=1" replace="gpgcheck=0" - name: install mysql yum: name={{pkg}} state=present - name: start mysql service: name={{svc}} state=started enabled=yes - name: init mysql shell: passd=$(grep "password" /var/log/mysqld.log | awk '{print $NF}') && mysql -uroot -p"$passd" --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'Admin@123';" && mysql -uroot -pAdmin@123 -e "grant all privileges on *.* to root@'%' identified by 'Admin@123' with grant option;" ignore_errors: true
PHP#
user_name: php php_addr: 192.168.19.25:9000 nginx_addr: 192.168.19.24 svc: php-fpm
- include: "init.yml" - name: install php repo shell: rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm && rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm ignore_errors: true - name: install php yum: name=php72w,php72w-cli,php72w-common,php72w-devel,php72w-embedded,php72w-gd,php72w-mbstring,php72w-pdo,php72w-xml,php72w-fpm,php72w-mysqlnd,php72w-opcache state=present - name: create php user user: name={{user_name}} shell=/sbin/nologin create_home=no - name: modify php config file replace: path=/etc/php.ini regexp=";date.timezone =" replace="date.timezone = Asia/Shanghai" notify: "reload php-fpm" - name: modify user and group in www.conf replace: path=/etc/php-fpm.d/www.conf regexp="apache" replace="{{user_name}}" notify: "reload php-fpm" - name: modify listen addr in www.conf replace: path=/etc/php-fpm.d/www.conf regexp="127.0.0.1:9000" replace="{{php_addr}}" notify: "reload php-fpm" - name: modify allowed_clients in www.conf replace: path=/etc/php-fpm.d/www.conf regexp="127.0.0.1" replace="{{nginx_addr}}" notify: "reload php-fpm" - name: start php-fpm service: name={{svc}} state=started enabled=yes
- name: reload php-fpm
service: name={{svc}} state=reloaded
- name: install mysql hosts: dbservers remote_user: root roles: - mysql - name: install php hosts: phpservers remote_user: root roles: - php
#设置测试文件
#出不来,就重启下,rpcbind和nfs
- name: create php root dir file: path=/var/www/html state=directory - name: mount nfs mount: src="192.168.19.24:/var/www/html" path=/var/www/html fstype=nfs state=mounted opts="defaults,_netdev"
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求