【问题标题】:Defining multiple cases for an Ansible variable based on multiple conditions基于多个条件为 Ansible 变量定义多个案例
【发布时间】:2023-01-12 03:55:19
【问题描述】:

我这里有这个变量,在 .yaml 变量文件中设置

patch_plan: 'foo-{{ patch_plan_week_and_day }}-bar'

我希望根据role动态设置我的patch_plan_week_and_day变量environment 这是在该变量文件之外的其他地方(现在无关紧要)设置的另外 2 个变量。

例如,我将解释3种情况:

  • 如果role = 'master'environment = 'srvb' 那么patch_plan_week_and_day = 'Week1_Monday' 就是patch_plan = 'foo-Week1_Monday-bar' 的最终结果。
  • 如果role != 'master'environment = 'srvb' 那么patch_plan_week_and_day = 'Week1_Tuesday' 就是patch_plan = 'foo-Week1_Tuesday-bar' 的最终结果
  • 如果role = 'slave'environment = 'pro'那么patch_plan_week_and_day = 'Week3_Wednesday'patch_plan = 'foo-Week3_Wednesday-bar'的最终结果

这是代码的想法:

patch_plan: 'foo-{{ patch_plan_week_and_day }}-bar'

# Patch Plans
## I want something like this:

# case 1
patch_plan_week_and_day: Week1_Monday
when: role == 'master' and environment == 'srvb'

# case 2
patch_plan_week_and_day: Week1_Tuesday
when: role != 'master' and environment == 'srvb'

# case 3
patch_plan_week_and_day: Week3_Wednesday
when: role == 'slave' and environment == 'pro'

我总共有14个案例。

【问题讨论】:

    标签: variables ansible conditional-statements case


    【解决方案1】:

    这里有很多考虑......

    您似乎尝试使用 Ansible 作为编程语言which it isn't。你已经开始实施一些没有关于你的用例和实际问题的描述的东西。给定的例子看起来像一个反模式。

    ... 根据角色和环境动态设置 v ...

    它实际上是“静态的”并且基于系统的属性。您只尝试在运行时生成值。可以或应该应用补丁的时间段(补丁窗口)是关于系统的事实,通常在配置管理数据库 (CMDB) 中配置。所以这种信息应该已经存在,或者在数据库中,或者在Ansible inventory 中,或者作为系统本身的Custom fact

    ...这是在该变量文件之外的其他地方(现在无关紧要)设置的另外 2 个变量。 ...

    可能它确实很重要,也许您可​​以在那里配置补丁周期或补丁窗口。

    通过进一步采用您的方法,您会将 Playbook 逻辑与基础结构描述或配置属性混合在一起,从而导致代码的可读性较差,并且将来可能无法维护。您将失去在版本控制系统 (VCS)、CMDB 或库存中维护系统配置的机会。

    因此,请避免使用 CASE、SWITCH 和 IF THEN ELSE ELSEIF 结构,而是描述系统的所需状态。

    一些进一步的阅读

    除了已经给出的来源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-20
      相关资源
      最近更新 更多