Ansible-角色
一、Roles 模块
Ansible为了层次化、结构化地组织Playbook,使用了角色(roles),roles可以根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。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 示例: mkdir /etc/ansible/roles/httpd/{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/httpd/{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
编写httpd模块
写一个简单的tasks/main.yml vim /etc/ansible/roles/httpd/tasks/main.yml - name: install apache yum: name={{pkg}} state=latest - name: start apache service: enabled=true name={{svc}} state=started //定义变量:可以定义在全局变量中,也可以定义在roles角色变量中,一般定义在角色变量中 vim /etc/ansible/roles/httpd/vars/main.yml pkg: httpd svc: httpd -------编写mysql模块------- vim /etc/ansible/roles/mysql/tasks/main.yml - name: install mysql yum: name={{pkg}} state=latest - name: start mysql service: enabled=true name={{svc}} state=started vim /etc/ansible/roles/mysql/vars/main.yml pkg: - mariadb - mariadb-server svc: mariadb -------编写php模块----- vim /etc/ansible/roles/php/tasks/main.yml - name: install php yum: name={{pkg}} state=latest - name: start php-fpm service: enabled=true name={{svc}} state=started vim /etc/ansible/roles/php/vars/main.yml pkg: - php - php-fpm svc: php-fpm -----编写roles示例----- vim /etc/ansible/site.yml --- - hosts: webservers remote_user: root roles: - httpd - mysql - php cd /etc/ansible ansible-playbook site.yml
例: