根据Ansible文档,Playbook是:
...真正简单的配置管理和多机器部署系统的基础,与已有的系统不同,非常适合部署复杂的应用程序。
而且,根据那些相同的文档,Roles是:
...基于已知文件结构自动加载某些vars_files,任务和处理程序的方法。按角色对内容进行分组还可以轻松与其他用户共享角色。
但是,这些与不同用例之间的区别对我来说并不是很明显。例如,如果我将/etc/ansible/hosts
文件配置为:
[databases]
mydb01.example.org
mydb02.example.org
[mail_servers]
mymail01.example.org
mymail_dr.example.org
...那么这个“[databases]
”条目是什么?一个角色?或者某个剧本YAML文件的名称?或者是其他东西?!?
如果有人可以向我解释这些差异,我对Ansible的理解会大大提升!
[databases]
和/etc/ansible/hosts
中的类似条目ansible.cfg
之外,如何使用可用的Playbooks / Roles添加/配置Ansible?例如,当我运行ansible-playbook someplaybook.yaml
时,Ansible如何知道在哪里找到该剧本?Playbook vs Role vs [数据库]和/ etc / ansible / hosts中的类似条目
[databases]
是一组主机的单一名称。它允许您通过单个名称引用多个主机。
角色是一组任务和其他文件,用于配置主机为特定角色提供服务。
Playbook是主机和角色之间的映射。
documentation的示例描述了示例项目。它包含两件事:
site.yml
,webservers.yml
,fooservers.yml
是剧本。roles/common/
和roles/webservers/
相应地包含common
和webservers
角色的定义。内部剧本(webservers.yml
)你有类似的东西:
---
- hosts: webservers <- this group of hosts defined in /etc/ansible/hosts, databases and mail_servers in example from your question
roles: <- this is list of roles to assign to these hosts
- common
- webservers
如果在YAML文件中定义了Playbooks,那么角色定义在哪里?
它们在roles/*
目录中定义。角色主要使用YAML文件定义,但也可以包含任何类型的资源(files/
,templates/
)。根据documentation,角色定义的结构如下:
- 如果存在roles / x / tasks / main.yml,则其中列出的任务将添加到游戏中
- 如果存在roles / x / handlers / main.yml,则其中列出的处理程序将添加到游戏中
- 如果存在roles / x / vars / main.yml,则其中列出的变量将添加到播放中
- 如果存在roles / x / meta / main.yml,则其中列出的任何角色依赖项将添加到角色列表中(1.3及更高版本)
- 任何复制任务都可以引用roles / x / files /中的文件,而无需相对或绝对地路径化它们
- 任何脚本任务都可以引用roles / x / files /中的脚本,而不必相对或绝对地路径它们
- 任何模板任务都可以引用roles / x / templates /中的文件,而无需相对或绝对地路径化它们
- 任何包含任务都可以引用roles / x / tasks /中的文件,而无需相对或绝对地路径化它们
最重要的文件是roles/x/tasks/main.yml
,在这里定义任务,执行角色时将执行这些任务。
除了生活在Ansible服务器上的ansible.cfg之外,如何使用可用的Playbooks / Roles添加/配置Ansible?例如,当我运行ansible-playbook someplaybook.yaml时,Ansible如何知道在哪里可以找到该剧本?
$ ansible-playbook someplaybook.yaml
将在当前目录中查找一个剧本。
$ ansible-playbook somedir/somedir/someplaybook.yaml
将在somedir/somedir/
目录中寻找一本剧本。
您的责任是将项目与所有剧本和角色放在服务器上。 Ansible与此无关。
Playbook vs Role vs [数据库]和/ etc / ansible / hosts中的类似条目
角色是将任务组合到一个容器中的一种方法。你可以有一个设置MySQL的角色,另一个用于设置Postfix等。
剧本定义了发生在哪里的事情。您可以在此处定义主机(主机组,请参见下文)以及将应用于这些主机的角色。
[databases]
和您库存中的其他条目是主机组。主机组定义将运行播放的一组主机。
游戏是剧本中的一组任务或角色(或两者)。在大多数情况下(和示例),剧本将只包含一个剧本。但你可以拥有任意多的人。这意味着你可以有一个剧本,它将在主机组postfix
上扮演角色mail_servers
,在主机组mysql
上扮演角色databases
:
- hosts: mail_servers
roles:
- postfix
- hosts: databases
roles:
- mysql
如果在YAML文件中定义了Playbooks,那么角色定义在哪里?
在Ansible中,几乎所有内容都在YAML中定义,这对于角色和剧本来说都很重要。
除了生活在Ansible服务器上的ansible.cfg之外,如何使用可用的Playbooks / Roles添加/配置Ansible?例如,当我运行ansible-playbook someplaybook.yaml时,Ansible如何知道在哪里可以找到该剧本?
AFAIK你必须在调用ansible-playbook
时提供剧本的路径。所以ansible-playbook someplaybook.yaml
会期待someplaybook.yaml
在你当前的目录中。但是你可以提供完整的路径:ansible-playbook /path/to/someplaybook.yaml
这是一个术语/语义问题。它可以是主观的,即使有基线定义。
我的观点如下:
任何配置管理/部署系统都具有:
source data
- 用于创建目标主机配置的数据target data
- 用于识别目标主机的数据config changes
- 我们根据source data
在target data
上对目标主机应用的一系列规则/行动source data
- 我们可以放置数据的各个地方 - group_vars
,playbook
vars,role
vars等等。这些地方会影响优先级(如果在不同的位置重新定义一个名为相同的变量,则会有非常具体的规则。 ansible
/ ansible-playbook
执行期间变量的值target data
- 是库存(并且,也可以在库存中定义库存/主机组变量!)config changes
- ansible有4个抽象级别:
任务 - 单一行动
任务列表 - 操作列表
role - 由同一'subject'分组的操作列表(或列表列表),通常所有目标都在同一主机/主机组上运行
playbook - 播放列表,每个播放可能在不同的主机组上运行,应用几个role
s / task
s /任务列表(以及handlers
等特殊任务)从“软件”方面来看 - 角色应该足够通用,可以重复使用。
同样在一些(相当大的)组织中,'角色'由A组运送,同时用于由B组维护的剧本。
以上所有允许将类似配置分组 - 到role
。将相关的子系统/组件分组到一个playbook
中。另外,值得一提的是,剧本中的1个YAML项目(包括hosts:
和tasks
,pre_tasks
,post_tasks
,roles
)被称为play
是的,一开始很混乱。
你通常将你的source data
连接到角色的语义,所以当你看到角色setup_db
被应用到相关主机组的游戏中时(例如db_hosts
)但是play
可以在几个主机组的联合上运行。这只是一个约定与灵活性的问题。
请写信给我是否增加了混乱,或澄清。谢谢。
另外请记住,如果使用旨在影响不同角色的元文件,则剧本可以调用多个角色。
示例Playbook:dual_role-playbook.yml
- name: Some Action for two roles
hosts: localhost
vars_files:
- roles/dual_role/meta/main.yml
roles:
- dual_role/container-1
- dual_role/container-2
角色文件夹和文件方案如下所示:
dual_role-playbook.yml
-- roles
-- dual_role
-- meta/main.yml
-- container-1
-- tasks/main.yml
-- templates/template.j2
-- container-2
-- tasks/main.yml
-- templates/template.j2
简单的说:
剧本就像主程序,它内容完成工作的完整说明。但是,对于大型项目,实际上并不希望将每个细节都放在其中。所以你需要角色。
角色是一个子程序,通常可以实现一个目标,例如:设置数据库服务器。您可以将它放在roles/
目录中,或者通过在rolesfile.yml
中提供URI来下载第三方角色,并要求ansible-galaxy为您下载它们。
[database]
是清单文件中定义的主机组,列出了属于database
组的主机。您还可以通过指定类似的内容来指定一组Web服务器
[web]
web1.example.com
web2.example.com
然后可以在剧本或角色中使用组web
或database
来指定要应用的主机。
这些组也可以在命令ansible
中用于运行ad-hoc命令。