首页
视频
资源
登录
原
Ansible Role详解
6739
人阅读
2021/4/7 21:06
总访问:
2537388
评论:
0
收藏:
0
手机
分类:
Ansible
![ansible](https://img.tnblog.net/arcimg/hb/e283c36cf43847558bcb2c8461e20850.jpg "ansible") ># Ansible Role详解 [TOC] Roles ------------ ### Roles介绍 <p style="font-weight: 400;line-height: 1.5;color: #212529;-webkit-tap-highlight-color: transparent;box-sizing: border-box;padding: 0px 20px 20px 20px;border: 1px solid #e9ecef;border-left-width: .25rem;border-radius: .25rem;display: block;border-left-color: #5bc0de;"> ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。 roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。 要使用roles只需要在playbook中使用include指令即可。 简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中, 并可以便捷地include它们的一种机制。 角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中 </p> ### 特点 >复杂场景:建议使用roles,代码复用度高 - 变更指定主机或主机组 - 如命名不规范维护和传承成本大 - 某些功能需多个Playbook,通过includes即可实现 ### Roles各目录作用 tn>官方推荐在`/etc/ansible/roles/`目录下创建项目。 | 目录 | 描述 | | ------------ | ------------ | | /roles/project | 项目名称 (然后再该项目下创建子目录) | | files/ | 存放由copy或script模块等调用的文件 | | templates/ | template模块查找所需要模块文件的目录 | | tasks/ | 定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行包含 | | vars/ | 定义变量,至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行包含 | | meta/ | 定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其他文件需在此文件中通过include进行包含 | | default/ | 设定默认变量时使用此目录中的main.yml文件 | ### nginx示例 <p style="font-weight: 400;line-height: 1.5;color: #212529;-webkit-tap-highlight-color: transparent;box-sizing: border-box;padding: 0px 20px 20px 20px;border: 1px solid #e9ecef;border-left-width: .25rem;border-radius: .25rem;display: block;border-left-color: #5bc0de;"> 删除原有的nginx </p> ```bash # 停止nginx服务 ansible all -m service -a 'name=nginx state=stopped' # 卸载nginx应用 ansible all -m yum -a 'name=nginx state=absent' # 删除nginx用户 ansible all -m user -a 'name=nginx state=absent' # 删除nginx组 ansible all -m group -a 'name=nginx state=absent' # 关闭httpd ansible all -m shell -a 'systemctl stop httpd' ``` <p style="font-weight: 400;line-height: 1.5;color: #212529;-webkit-tap-highlight-color: transparent;box-sizing: border-box;padding: 0px 20px 20px 20px;border: 1px solid #e9ecef;border-left-width: .25rem;border-radius: .25rem;display: block;border-left-color: #5bc0de;"> (1) 创建nginx的group组 (2) 创建nginx的user用户 (3) 安装nginx包 (4) 添加模板文件 (5) 启动服务 </p> ```bash mkdir -p /etc/ansible/roles/nginx cd /etc/ansible/roles/nginx mkdir tasks mkdir templates cd tasks vim group.yml ``` >创建nginx组(`group.yml`) ```yaml - name: create group group: name=nginx gid=80 ``` >创建nginx用户(`user.yml`) ```yaml - name: create user user: name=nginx group=nginx system=yes shell=/sbin/nologin uid=80 ``` >创建安装包文件(`yum.yml`) ```yaml - name: install package yum: name=nginx ``` >启动服务(`start.yml`) ```yaml - name: start nginx service service: name=nginx state=started enabled=yes ``` >重启服务(`restart.yml`) ```yaml - name: restart nginx service service: name=nginx state=restarted ``` <p style="font-weight: 400;line-height: 1.5;color: #212529;-webkit-tap-highlight-color: transparent;box-sizing: border-box;padding: 0px 20px 20px 20px;border: 1px solid #e9ecef;border-left-width: .25rem;border-radius: .25rem;display: block;border-left-color: #5bc0de;"> 然后通过`cd ../templates/`切换到模板目录下,然后通过`cp /etc/nginx/nginx.conf nginx.conf.j2`复制nginx配置到当前模板页下;然后做如下修改: </p> ```bash # 启动进程的数量按照CPU的核心+2个 worker_processes {{ ansible_processor_vcpus+2 }} ``` >然后回到task目录下定义模板 ```bash cd ../tasks vim templ.yml ``` ```yaml - name: copy conf template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf ``` >定义主要如何执行的yml(`main.yml`) 按照顺序执行相关的文件 ```yaml - include: group.yml - include: user.yml - include: yum.yml - include: templ.yml - include: start.yml ``` >最后在调用的时,切换到`roles`目录下(`cd /etc/ansible/roles/`),创建`nginx_role.yml`剧本。role表示你要执行的项目名。 ```yaml - hosts: all remote_user: root roles: - role: nginx ``` <p style="font-weight: 400;line-height: 1.5;color: #212529;-webkit-tap-highlight-color: transparent;box-sizing: border-box;padding: 0px 20px 20px 20px;border: 1px solid #e9ecef;border-left-width: .25rem;border-radius: .25rem;display: block;border-left-color: #5bc0de;"> 检测与执行 </p> ```bash ansible-playbook -C nginx_role.yml ansible-playbook nginx_role.yml ``` <p style="font-weight: 400;line-height: 1.5;color: #212529;-webkit-tap-highlight-color: transparent;box-sizing: border-box;padding: 0px 20px 20px 20px;border: 1px solid #e9ecef;border-left-width: .25rem;border-radius: .25rem;display: block;border-left-color: #5bc0de;"> 测试端口是否开启 </p> ```bash ansible all -m shell -a 'ss -ntpl' ansible all -m shell -a 'curl 127.0.0.1' ``` ![](https://img.tnblog.net/arcimg/hb/ee3077ef58214ea798d4f003a1977eed.png) ![](https://img.tnblog.net/arcimg/hb/d43382b6e93449549f7f8e82e042fb9c.png) ### 多项目执行 <p style="font-weight: 400;line-height: 1.5;color: #212529;-webkit-tap-highlight-color: transparent;box-sizing: border-box;padding: 0px 20px 20px 20px;border: 1px solid #e9ecef;border-left-width: .25rem;border-radius: .25rem;display: block;border-left-color: #5bc0de;"> 当我们在roles目录下除了有nginx项目,如果还有一个httpd的项目,想同时进行执行的话。可以通过修改nginx_role.yml文件进行执行多个剧本 </p> ```yaml - hosts: all remote_user: root roles: - role: nginx - role: httpd ``` ### 调用第三方角色 <p style="font-weight: 400;line-height: 1.5;color: #212529;-webkit-tap-highlight-color: transparent;box-sizing: border-box;padding: 0px 20px 20px 20px;border: 1px solid #e9ecef;border-left-width: .25rem;border-radius: .25rem;display: block;border-left-color: #5bc0de;"> 如果在`main.yml`文件中,我们想调用第三方httpd项目的`copyfile.yml`文件,我们可以在`main.yml`中这样添加。 </p> ```yaml - include: roles/httpd/tasks/copyfile.yml ``` tn>需要注意的是:执行任务的时候第三方的角色yml如果是相对路径,那么需要改成绝对路径。 ### 为多角色项目定义标签 ```bash - hosts: all remote_user: root roles: - { role: nginx, tags: ['web','nginx'] } - { role: httpd, tags: ['web','httpd'] } - { role: app, tags: 'app' } ``` <p style="font-weight: 400;line-height: 1.5;color: #212529;-webkit-tap-highlight-color: transparent;box-sizing: border-box;padding: 0px 20px 20px 20px;border: 1px solid #e9ecef;border-left-width: .25rem;border-radius: .25rem;display: block;border-left-color: #5bc0de;"> 当我们需要执行指定的`app`标签时,可以通过`-t`的参数进行指定标签 </p> ```bash ansible-playbook -t web nginx_role.yml ``` ### 在多角色项目定义条件执行 <p style="font-weight: 400;line-height: 1.5;color: #212529;-webkit-tap-highlight-color: transparent;box-sizing: border-box;padding: 0px 20px 20px 20px;border: 1px solid #e9ecef;border-left-width: .25rem;border-radius: .25rem;display: block;border-left-color: #5bc0de;"> 这里我们只希望CentOS7的系统安装httpd </p> ```bash - hosts: all remote_user: root roles: - { role: nginx, tags: ['web','nginx'] } - { role: httpd, tags: ['web','httpd'] , when ansible_distribution_major_version == "7" } - { role: app, tags: 'app' } ``` ### 定义handlers与vars tn>在nginx角色项目中,我们要定义handlers与vars的话目录应该是:`/etc/ansible/roles/nginx/handlers`与`/etc/ansible/roles/nginx/vars`,在定义时请注意只能定义`main.yml`文件。如何调用请参考以往文章。 tn>关于ansible的教程要告一段落了,后期有空会补上更多可以参考:https://www.bilibili.com/video/BV1vs41177S7?p=8
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
👈{{preArticle.title}}
👉{{nextArticle.title}}
评价
{{titleitem}}
{{titleitem}}
{{item.content}}
{{titleitem}}
{{titleitem}}
{{item.content}}
尘叶心繁
这一世以无限游戏为使命!
博主信息
排名
6
文章
6
粉丝
16
评论
8
文章类别
.net后台框架
166篇
linux
17篇
linux中cve
1篇
windows中cve
0篇
资源分享
10篇
Win32
3篇
前端
28篇
传说中的c
4篇
Xamarin
9篇
docker
15篇
容器编排
101篇
grpc
4篇
Go
15篇
yaml模板
1篇
理论
2篇
更多
Sqlserver
4篇
云产品
39篇
git
3篇
Unity
1篇
考证
2篇
RabbitMq
23篇
Harbor
1篇
Ansible
8篇
Jenkins
17篇
Vue
1篇
Ids4
18篇
istio
1篇
架构
2篇
网络
7篇
windbg
4篇
AI
18篇
threejs
2篇
人物
1篇
嵌入式
2篇
python
13篇
HuggingFace
8篇
pytorch
9篇
opencv
6篇
最新文章
最新评价
{{item.articleTitle}}
{{item.blogName}}
:
{{item.content}}
关于我们
ICP备案 :
渝ICP备18016597号-1
网站信息:
2018-2024
TNBLOG.NET
技术交流:
群号656732739
联系我们:
contact@tnblog.net
欢迎加群
欢迎加群交流技术