是否有可能在Ansible中定义playbook-global变量?

rab*_*ens 43 ansible

我有一个很大的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)

  • `group_vars/all` 并不完全是全局的。通常全局意味着它是共享的并且它只存在该变量的一个实例。但是“group_vars/all”不是共享的,而是为每个主机复制的。如果一台主机修改了“group_vars/all”中的变量,其他主机将看不到更改。 (2认同)