首页 > 解决方案 > 在ansible中替换Jijnja模板文件中的主机变量

问题描述

我需要用主机文件中定义的变量替换文件。

env: acc
abcserverName:
  -  name: abc1
  -  name: abc2

 - hosts: "abc.1234.com"
  become: yes
  tasks:
 - name: deploy abc control file
     template:
       src: abc-control.j2
       dest: /etc/init.d/{{ env }}-{{ item.name }}
     with_items:
       - "{{ abcservername }}"
 - name: start abcserver
    command: /etc/init.d/control-{{ env }}-{{ item.name }}  start
    with_items:
      - "{{ abcserverName }}"

这将复制 init.d 中的 2 个文件,如下所示:

/etc/init.d/control-acc-abc1
/etc/init.d/control-acc-abc2

要求

在上述每个控制文件中,我还需要获取正确的“abcserverName”

例如在“/etc/init.d/control-acc-abc1”中,我想要

SERVER_NAME=abc1

例如在“/etc/init.d/control-acc-abc2”中

SERVER_NAME=abc2

我对 jinja 模板了解不多,谷歌向我展示了复杂的示例。任何帮助实现这一点表示赞赏。

标签: ansiblejinja2

解决方案


以这个 jinja2 代码为例:

SERVER_NAME={{ server_name }}

server_name实际上并没有定义,要使用它,您需要将它作为变量传递给您的模板。

使用您的任务:

- name: deploy abc control file
 template:
   src: abc-control.j2
   dest: /etc/init.d/{{ env }}-{{ item.name }}
 with_items:
   - "{{ abcservername }}" 
 vars:
   server_name: {{ item.name }}

现在“control-acc-abc1”将 server_name 设置为 abc1,“control-acc-abc2”将 server_name 设置为 abc2


推荐阅读