在 Ansible 中包含一个文件,并让它根据 when 条件执行 2 个或更多操作

Include a file in Ansible and have it perform 2 or more actions based on when condition

正在尝试包含名为 Agent-install.yml 的文件 并基于主机名的前 2 个字符(例如:dserver 或 qserver 或 userver 或 pserver) 想使用 sed 将 agent.properties.j2 更新为适当的值...

即如果主机名以 ds/qs/us 开头,则 agent.setup.IP=DevMaster1 否则,如果主机名以 ps 开头,则 agent.setup.IP=ProdMaster1

在任何一种情况下,它们都应该包括 Agent-install.yml (顺便说一句,我在 playbook 运行 中传递了主机名,它确实有效 (只是没有 2 个动作)sed 部分是我想在这里添加的

有人知道如何做到这一点吗? 我试过使用 when 条件执行 2 个操作(但认为这是不允许的) 还尝试了 -block 允许多个操作但不允许 include

有更好的方法吗?

- name: Include if Pre-PROD
  include: Agent-install.yml
  local_action: shell sed -i 's@.*agent.setup.IP=localhost.*@agent.setup.IP=DevMaster1@' ../templates/agent.properties.j2
  when: hosts[0:2] == "ds" or "qs" or "us"
  ignore_errors: yes

- name: Include if PROD
  include: Agent-install.yml
  local_action: shell sed -i 's@.*agent.setup.IP=localhost.*@agent.setup.IP=ProdMaster1@' ../templates/agent.properties.j2
  when: hosts[0:2] == "ps"
  ignore_errors: yes

看来你走错了路...

模板用于根据输入数据生成不同的结果文件。
您不应该在本地 sed 模板。

将您的 agent.properties.j2 模板修改为:

agent.setup.IP={{ agent_ip }}

然后在你的剧本中:

- set_fact:
    agent_ip: "{{ 'ProdMaster1' if hosts[0:2] == 'ps' else 'DevMaster1' }}"

- template:
    src: agent.properties.j2
    dest: agent.properties.conf

这样 agent.properties.conf 在目标主机上会有​​适当的价值。