Ansible角色目录结构概述
在本文中,我将对Ansible角色目录结构进行概述。在使用Ansible时,建议使用项目目录,以便以一致的方式组织内容。每个项目目录可能都有自己的目录ansible.cfg文件
,目录以及剧本。角色可以用来标准化和方便地重用Ansible的特定部分
什么是Ansible角色?
Ansible剧本可以非常相似:一个剧本中使用的代码也可以在其他剧本中使用
为了便于重用代码,可以使用角色。
Ansible角色由多个文件夹组成,每个文件夹包含多个YAML文件。
默认情况下,它们具有主.yml文件,但需要时可以有多个。
这是所有Ansible角色的标准化结构,允许Ansible playbooks自动加载位于单独YAML文件中的预定义变量、任务、处理程序、模板和默认值。
每个Ansible角色应该至少包含以下目录中的一个,如果不是全部的话。
理解ansible角色目录结构
我已经创建了一个新角色"roles"。下面是"roles"目录的ansible roles目录结构。
roles ├── defaults │ └── main.yml ├── files ├── handlers │ └── main.yml ├── meta │ └── main.yml ├── README.md ├── tasks │ └── main.yml ├── templates ├── tests │ ├── inventory │ └── test.yml └── vars └── main.yml
现在我们将了解这个ansible roles目录结构中的单个目录。这个结构中的每个目录都有不同的用途,我们将在下面讨论
默认文件夹defaults
defaults/main.yml
是一个配置文件,可用于为角色中使用的变量定义默认值。它允许集中管理角色变量的默认值。
默认值总是易受攻击的,因为它们根据用户的需要和策略变化很大。
使用此解决方案允许一个文件更改所有值
files文件夹
此文件夹保存完成角色任务所需的所有额外文件。
这些文件通常作为某些任务的一部分被分派到远程主机。
它们通常是静态的,不包含任何要更改、复制、提取或者压缩到远程主机的变量。
handlers文件夹
handlers/main.yml
其中我们将定义诸如restart nginx之类的处理程序。它主要用于服务管理应用由另一个任务执行的配置更改。
处理程序可以在同一个角色中调用,也可以从其他角色调用,也可以从调用剧本中调用。
meta文件夹
meta/main.yml
是角色的元数据文件。这些文件夹包含角色元数据,其中包括有关作者、许可证、兼容性和依赖关系的信息。
此选项的主要用途是声明依赖项,更具体地说,是角色。
如果当前角色依赖于另一个角色,则该角色将在元文件夹中声明。
任务文件夹tasks
tasks/main.yml
你大部分时间都会其中度过。它包含主YAML文件。
这些文件中的代码通过调用角色的所有其他已定义元素来执行主角色任务。
当角色运行时,Ansible将执行此文件中定义的任何操作。
模板文件夹templates
此文件夹包含角色用于创建实际配置文件的模板文件。
然后由角色将它们部署到远程主机。
它们是Jinja2模板引擎脚本,支持循环和其他功能。
测试文件夹tests
此文件夹包含一个测试环境,其中包含一个列表文件和一个用于测试角色的剧本脚本。
这主要用于使用连续集成系统(如Jenkins或者Travis CI)自动测试角色时
虽然刚刚讨论了八个文件夹,但并非所有文件夹都是强制性的。即使只提供任务文件,角色也非常有用。大多数情况下,我们会发现我们在tasks文件夹中工作,在handlers和templates中找到支持文件。
vars文件夹
这是存储角色变量的地方。
通常,它用于不需要在环境之间进行任何更改的永久变量。
如何在角色中定义变量?
变量可以在ansible roles目录结构的不同级别上定义。
main.yml
在"vars"文件夹中有默认变量,用于默认角色功能。它们不打算被覆盖
默认值/主.yml
可以包含默认变量。它们的优先级较低,可以被回放中设置的具有相同名称且优先级较高的变量覆盖Playbook变量将始终覆盖角色中设置的变量。站点特定变量(如机密和vault加密数据)应始终从playbook进行管理,因为角色变量是通用的
角色变量是在调用角色时在playbook中定义的,它们具有最高的优先级并覆盖playbook变量以及清单(Inventory)变量
不同的角色位置
角色可以存储在默认位置,也可以从剧本中轻松使用
./roles
具有最高优先级然后是
~/.ansible/roles
最后是
/etc/ansible/roles