自动化运维-ansible中对roles的创建与使用
自动化运维-ansible中对roles的创建与使用
一、Ansible 角色概述
角色的作用
随着 Playbook 复杂度增加,代码重复利用变得困难。Ansible 角色提供了一种标准化方式打包任务、变量、文件和模板,使得代码可以轻松地在不同项目间共享和重用。
角色的核心优势
- 模块化设计:将相关功能组织成独立单元
- 代码复用:轻松在不同项目间共享配置
- 协作开发:多个管理员可并行开发不同角色
- 易于维护:大型项目通过角色分解更易管理
- 社区支持:可从 Ansible Galaxy 获取社区贡献的角色
二、各目录作用说明
- defaults/main.yml - 定义默认变量,优先级最低,适合设置可覆盖的默认值
- vars/main.yml - 定义角色内部变量,优先级高,通常不应在playbook中修改
- tasks/main.yml - 包含角色的主要任务序列
- handlers/main.yml - 定义角色使用的处理器
- files/ - 存放静态文件,任务中可直接引用文件名
- templates/ - 存放Jinja2模板,任务中可直接引用模板名
- meta/main.yml - 包含角色作者、许可证、平台要求和依赖关系
- tests/ - 包含测试角色用的清单和playbook
三、执行顺序控制
Playbook 中任务执行顺序:
pre_tasks
- 在角色之前执行roles
- 按顺序执行角色任务tasks
- 普通任务post_tasks
- 在角色和普通任务后执行handlers
- 被触发的处理器,最后执行
四、动态角色包含
除了静态角色定义,还可以在任务中动态包含角色:
include_role
:动态包含,在执行时处理import_role
:静态导入,在解析时处理
五、创建与使用角色
-
创建角色
[student@master ansible]$ cd roles/ [student@master roles]$ ansible-galaxy init testuser [student@master roles]$ ls testuser/
-
给角色定义变量
[student@master roles]$ cd testuser/ [student@master testuser]$ vim vars/main.yml # playbook内容如下 --- a: 1 b: 2 c: 3
-
给角色写任务
[student@master testuser]$ vim tasks/main.yml # 内容如下 --- - name: test1debug:msg: "{{a}}"- name: test2debug:msg: "{{b}}"- name: test3debug:var: c
-
创建一个 playbook 来使用角色
[student@master ansible]$ vim testuser.yml # playbook内容如下 --- - name: testuhosts: node1roles:- testuser
六、创建与使用角色示例
需求:
在/etc/ansible/roles中创建名为http的角色
1、部署yum仓库
2、安装httpd软件包
3、模板文件index.html.j2已存在,用户创建具有以下输出的文件/var/www/html/index.html:
Welcome to HOSTNAME on IPADDRESS
当index.html内容发生改变时,重启httpd服务
其中HOSTNAME是受控节点的完全合格域名,IPADDRESS则是受控节点的IP地址
按照上方所述,创建一个使用此角色的playbook /etc/ansible/newrole.yml,该playbook在所有主机上运行
yum 仓库已经部署完成
-
创建 http 角色
[student@master ansible]$ cd roles/ [student@master roles]$ ansible-galaxy init http
-
新建 index.html.j2 模板
[student@master http]$ vim templates/index.html.j2 # 编辑内容如下 Welcome to {{ansible_fqdn}} on {{ansible_default_ipv4.address}}
-
给角色写任务
[student@master http]$ vim tasks/main.yml # 内容如下 --- # tasks file for http - name: install httpd firewalldyum:name:- httpd- firewalldstate: present- name: cp filetemplate:src: index.html.j2dest: //var/www/html/index.html- name: restartedservice:name: "{{item}}"state: restartedenable: yesloop:- httpd- firewalld- name: set firewalldfirewalld:service: httpstate: enabledpermanent: yesimmediate: yes
-
创建一个 playbook 来使用角色
[student@master ansible]$ vim httpuser.yml # 内容如下 --- - name: webhosts: allroles:- http
七、系统角色
-
安装系统角色
[student@master ansible]$ sudo yum -y install rhel-system-roles
-
将时钟同步的系统角色复制到/etc/ansible/roles目录下,并重名了角色名为timesync
[student@master ansible]$ cp -r /usr/share/ansible/roles/rhel-system-roles.timesync -p roles/timesync
-
书写playbook,并执行
[student@master ansible]$ vim timesync.yml # 内容如下 --- - name: chronyhosts: test01vars:timesync_ntp_servers:- hostname: ansible.example.comiburst: yesroles:- timesync