Roles 模块
Ansible为了层次化、结构化地组织Playbook,使用了角色(roles),roles可以根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。roles一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。
roles的作用
●角色允许将复杂的剧本组织成独立的、更小的剧本和文件
●角色提供了一种从外部文件加载任务、处理程序和变量的方法
●角色也可关联和引用静态的文件和模板。
●角色可以编写成满足普通用途需求,并且能被重复利用
●定义角色的文件具有特定的名称,并以严格的目录结构进行组织。
roles的目录结构
cd /etc/ansible/
tree roles/
roles/
├── web/
│ ├── 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 文件,用于定义此角色的特殊设定及其依赖关系。 |
在一个 playbook 中使用 roles 的步骤
(1)创建以 roles 命名的目录
mkdir /etc/ansible/roles/ -p #yum装完默认就有
(2)创建全局变量目录(可选)
mkdir /etc/ansible/group_vars/ -p
touch /etc/ansible/group_vars/all #文件名自己定义,引用的时候注意
(3)在 roles 目录中分别创建以各角色名称命令的目录,如 httpd、mysql
mkdir /etc/ansible/roles/httpd
mkdir /etc/ansible/roles/mysql
(4)在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建
mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}
(5)在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件,千万不能自定义文件名
touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
(6)修改 site.yml 文件,针对不同主机去调用不同的角色
vim /etc/ansible/site.yml
---
- hosts: webservers
remote_user: root
roles:
- httpd
- hosts: dbservers
remote_user: root
roles:
- mysql
(7)运行 ansible-playbook
cd /etc/ansible
ansible-playbook site.yml
示例使用roles安装lnmp
#首先创建roles的文件目录结构和文件
mkdir /etc/ansible/roles/nginx/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -p
touch /etc/ansible/roles/nginx/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml
编写nginx模块
写一个简单的tasks/main.yml
vim /etc/ansible/roles/nginx/tasks/main.yml - name: set yum copy: src=/etc/ansible/roles/nginx/files/nginx.repo dest=/etc/yum.repos.d/nginx.repo - name: yum nginx yum: name={{pkg}} state=latest - name: set conf copy: src=/etc/ansible/roles/nginx/files/default.conf dest=/etc/nginx/conf.d/default.conf - name: start nginx service service: name={{svc}} state=started enabled=yes 定义变量:可以定义在全局变量中,也可以定义在roles角色变量中,一般定义在角色变量中 vim /etc/ansible/roles/httpd/vars/main.yml pkg: nginx svc: nginx 在/etc/ansible/roles/nginx/files中准备nginx的yum文件和 default.conf配置文件(在别的主机安装复制过来) vim /etc/ansible/roles/nginx/files/nginx.repo #提前准备好nginx的yum源 [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1
编写mysql模块 vim /etc/ansible/roles/mysql/tasks/main.yml - name: remove mariadb yum: name=mariadb* state=absent - name: wget command: wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm - name: install mysql yum: name=mysql57-community-release-el7-10.noarch.rpm - name: install mysql yum: name=mysql-community-server state=latest - name: start mysqld service service: name=mysqld state=started enabled=yes - name: genggai mima shell: mysqladmin -u root -p"$(grep "password" /var/log/mysqld.log | awk 'NR==1{print $NF}')" password 'Admin@123' - name: shouquan shell: mysql -uroot -p'Admin@123' -e "grant all privileges on *.* to 'root'@'%' IDENTIFIED BY 'Admin@123';" -e "flush privileges;" - name: remove mysql57 yum: name=mysql57-community-release-el7-10.noarch state=absent
编写php模块 vim /etc/ansible/roles/php/tasks/main.yml - name: download libargon2 epel epel shell: rpm -Uvh http://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/libargon2-20161029-3.el7.x86_64.rpm ignore_errors: true - name: download libargon2 epel epel(1) shell: rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm ignore_errors: true - name: download libargon2 epel epel(2) shell: rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm ignore_errors: true - name: install php shell: yum -y install php72w php72w-cli php72w-common php72w-devel php72w-embedded php72w-gd php72w-mbstring php72w-pdo php72w-xml php72w-fpm php72w-mysqlnd php72w-opcache php72w-redis ignore_errors: true - name: start php service: name=php-fpm state=started enabled=yes - name: modify index.php copy: src=/etc/ansible/roles/php/files/index.php dest=/usr/share/nginx/html/index.php vim /etc/ansible/roles/php/files/index.php #编写首页文件 <?php $link=mysqli_connect('192.168.150.5','root','Admin@123'); if($link) echo "<h1>Success!!</h1>"; else echo "Fail!!"; ?>
编写roles示例 vim /etc/ansible/lnmp.yml - hosts: lnmpservers remote_user: root roles: - nginx - mysql - php cd /etc/ansible ansible-playbook site.yml web页面访问192.168.150.5/index.php