我有一个很大的Ansible playbook,在运行它时构建了Docker镜像.我使用越来越多的数字作为标签来版本化它们.目前,我必须在每个hosts:部分指定这一点.
我知道有全局变量但是通过搜索"ansible""全局变量"我发现它们,它们必须在剧本之外定义.是否有可能为剧本定义全局变量?
yda*_*coR 16
Ansible有一个默认all组,有趣的是,它包含清单文件中的所有主机.
因此,您可以对任何主机组执行此操作,并为主机组提供group_vars.
如上一个链接所示,这些可以直接在清单文件中定义,也可以包含在一个单独的文件中,该文件以group_vars与库存文件相同的目录级别的目录中的组命名.
然后,示例目录结构可能如下所示:
-ansible
|--inventory
| |--group_vars
| | |--all
| | |--dev
| | |--test
| | |--prod
| | |--webservers
| | |--databases
| |--dev
| |--test
| |--prod
|--roles
...
Run Code Online (Sandbox Code Playgroud)
您的开发库存文件可能看起来像:
[dev:children]
webservers
databases
[webservers]
web1.dev
web2.dev
[databases]
database-master.dev
database-slave.dev
Run Code Online (Sandbox Code Playgroud)
所有这些主机现在将选择任何特定于主机的配置(可以在线定义,或者像group_vars一样可以放入host_vars文件夹中),也可以配置它们所在的特定组webservers,然后是组它们也是从这样的继承dev而且默认情况下也是如此all.
然后,这可以用于以比主机更粗糙的方式配置事物.
诸如NTP服务器之类的东西可能希望全部定义,而DNS服务器可能希望在环境级别定义(如果您的网络被分段为开发,测试和生产,他们可能需要设置不同的DNS服务器/etc/resolv.conf),而不同类型的服务器可能有不同的配置,例如要安装的软件包列表.最后,有些事情可能需要特定于主机,例如在复制组中设置MySQL服务器ID.
相反,如果您只想定义playbook全局设置而不是整个库存(因此可以通过其他playbooks访问),那么您只需vars在播放定义中使用一个块,如下所示:
- hosts: webservers
vars:
http_port: 80
tasks:
- name: Task1 to be ran against all the webservers
...
Run Code Online (Sandbox Code Playgroud)
如前所述,您也可以在all此处使用该组:
- hosts: all
vars:
ntp_pool:
- ntp1.domain
- ntp2.domain
tasks:
- name: Task1 to be ran against all the servers
...
Run Code Online (Sandbox Code Playgroud)
一般来说,我强烈建议使用角色来构建针对某些主机运行的内容,然后使用清单来解释哪些服务器是什么类型,然后在库存级别使用group_vars目录来包含这些组的所有变量主机.以这种方式做事将有助于您将事物放在合理的位置,并允许您轻松地重用代码库.
Pet*_*026 15
如果您使用的标记/版本适用于所有主机,则使用group_vars/all是可行的选项.
如果修订号特定于host_vars/host_name文件中的每个主机条目可能会更好.
如果你想阅读并初始化var然后在每次播放后增加它,那么在剧本中播放游戏(或者你说的每个主机)就会更难以持久化这些信息.例如,如果您要部署N个docker实例,您可以执行一些动态库存魔术,如下所示:
- hosts: localhost
tasks:
- add_host: name=docker_{{item}} groups="dockers,other" tag={{item}}
with_sequence: start={{ext_def_start}} count={{ext_def_num}}
- hosts: docker_*
tasks:
- debug: var=tag
Run Code Online (Sandbox Code Playgroud)