0

我正在编写一个 Ansible 剧本,用于设置系统,在某些配置中,某些系统可能由另一个组织提供。一个非常简单的例子:

存货:

  • 应用服务器
  • 一个数据库服务器

Playbook:设置两台服务器,并application.properties使用 db 服务器的 IP、端口和用户/密码将文件添加到应用服务器。

到目前为止工作,但随后一个要求来了,在某些部署中,数据库服务器是由另一个组织提供的,所以我不能将它包含在清单中,因为设置步骤失败,但我仍然想为应用服务器(带有我从其他人那里获得的数据库服务器信息)。

考虑到有 6 种这样的服务器类型,而不仅仅是 2 种(所以不仅仅是 2 种不同的场景,提供的服务器有很多排列),什么是涵盖这两种场景(我自己的数据库服务器和提供的数据库服务器)的最不痛苦的解决方案对我来说,这是我的)。

编辑:更具体地说,我遇到的问题是,如果我在系统不是我的时候使用 vars 而当它是我的系统时使用事实,那么我在编写application.properties.j2模板时会遇到问题,因为事实和 vars 的引用方式不同。如何在模板中使用 var ,但如果未定义 var 则使用事实?

4

1 回答 1

0

我假设您每个部署都有一个清单文件。因此,库存文件可能如下所示:

[app]
an-app.server

[db]
a-db.server

[deploymentA:children]
app
db

[deploymentA:vars]
db_ip=foo
dp_port=foo
db_user=foo
db_pass=foo

deploymentA:vars您可能会存储,但group_vars/deploymentA为简单起见,我只是将其放入库存中。

现在的剧本:

- hosts: db
  roles:
    - setup-db-server

- hosts: app
  roles:
    - setup-app-server

在数据库服务器不是由您自己管理的部署中,您根本不会在清单中定义数据库服务器。该组db将是空的。在这种情况下,第一个播放将简单地打印“没有匹配的主机”或类似的内容,然后继续下一个播放。

在您管理数据库服务器的部署中,setup-db-server将运行该角色,您可以使用deploymentA:varsfor 配置。

在您的应用程序中,deploymentA:vars无论主机是否属于您,您都可以发布application.properties文件。

于 2016-03-18T16:41:29.423 回答