编写一个Ansible role
前言
在这篇《Ansible Playbook的复用》文章中就说到后面会专门总结role的,这篇文章,以及下一篇文章都是专门用来总结role的,来好好的把这个role常用的功能总结全面了,总结透彻了。
role是什么
role是什么?role是Ansible中进行功能复用的利器,它是更高级别的include。它的机制并不复杂,只是自动的加载一些文件,并提供一些自动搜索功能。
实际上role并不是什么高级货,它只是需要我们遵循特定的文件夹结构来开发这个功能,就可以实现一个role,所以,所有的重点都在这个特定的文件夹结构上,要用好、写好一个role,就必须先知道这个role目录结构。
role目录结构
在Ansible中提供了一个脚手架命令来创建role所需的完整目录结构,就不需要我们手动的一个个目录的去创建了:
ansible-galaxy init <role_name>
这样一个完整的role的文件夹结构就出来了:
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
下面对每个文件和文件夹进行说明:
defaults/main.yml
:设置默认变量的地方;默认变量的优先级在所有的变量中是最低的,用于定义一些需要被覆盖的变量;files
:Ansible中unarchive、copy等模块会自动来这里找文件,从而我们不必写绝对路径,只需写文件名handlers/main.yml
:存放tasks中的notify指定的内容meta/main.yml
:定义role依赖关系的文件tasks/main.yml
:存放playbook的目录,其中main.yml是主入口文件,在main.yml中导入其他yml文件,要采用import_tasks关键字,include将要弃用了templates
:存放模板文件;template模块会将模板文件中的变量替换为实际值,然后覆盖到客户机指定路径上tests
:测试脚本vars/main.yml
:定义role中需要使用到的变量
所以,我们在自己开发一个role的时候,只需要按照这个文件夹结构,把我们写好的东西放进去就OK了,就是这样子!
开发一个简单的role
为了巩固下上面的内容,下面编写一个简单的、无任何实际意义的role,就是单纯的把上面总结的知识点用一遍。这个role就是简单的输出一些信息。
defaults/main.yml文件内容如下:
---
website: www.jellythink.com
author: Yanggd
date: 2012-07-01
vars/main.yml文件内容如下:
---
website: www.jellythink.com
tasks/main.yml文件内容如下:
---
- name: role demo
debug: msg="website is {{website}}, author is {{author}}, date is {{date}}"
- name: copy demo
copy:
src: filelst.txt
dest: ~/filelst.txt
owner: yanggd
group: yanggd
mode: '0755'
notify:
- copy finished
handlers/main.yml文件内容如下:
---
- name: copy finished
debug: msg="copy finished handler"
然后我们在files文件夹下面再存放一个task中需要用到的filelst.txt文件。这样,我们就开发了一个简单的role,如果你要开发的role非常复杂的时候,可能就需要分多个文件来编写task或者存放变量了,这个时候就需要使用include_vars
和include
了。下一篇文章将来说说如何使用这里开发的这个role。
总结
这一篇的重点就是要熟悉role的文件夹结构,以及每个文件夹下面该放下什么内容,知道这些以后,我们就只需要去做填空题就好了,我们也可以去。下一篇我们将重点来说说如何使用role,以及在使用role的过程中的一些注意事项。
人生是个圆,有的人走了一辈子也没有走出命运画出的圆圈,其实,圆上的每一个点都有一条腾飞的切线。
玩代码、玩技术
长按识别二维码,关注“果冻想”
如果觉得还不错,可以点个“在看”哦~