首页 > 解决方案 > Ansible jinja 2 模板值不应该改变

问题描述

我已经在 ansible 中编写了 jinja2 模板。我想要实现的是,如果未提及 service_name 并且远程计算机上已存在 service_name,则 ansible 不应使用模板中提到的默认名称更改 service_name。但是,当未定义 service_name 时,即使 service_name 存在,ansible 也会在远程机器上用“abc”替换服务名称。任何帮助,将不胜感激。

active={{ active_status}} 
instrument={{ instrument_status }} 
{% if service_name is defined %} 
service_name={{ service_name }} 
{% else %} 
service_name=abc 
{% endif %}

谢谢

标签: ansibleansible-2.xansible-inventoryansible-template

解决方案


根据我的上述评论,这里有一个可能的示例实现来满足您的要求。test_template.j2是您当前模板的精确副本。您可以将服务名称作为额外变量传递给 test ( -e service_name=my_service)

基本上,如果service_name没有定义,我们:

  • 检查远程文件是否已存在并将slurp其内容放入 var
  • 在文件中查找相关行。注意:regex_replace('None', '')这里是为了确保如果之前的搜索/匹配没有返回任何内容,我们会得到一个空字符串。
  • 仅当在先前任务中发现相关内容时才设置服务名称

正确完成此检查/设置后,您只需复制模板即可,无论情况如何。

---
- name: Conditional writing of template
  hosts: localhost
  gather_facts: false

  vars:
    my_dest: /tmp/test_file.txt
    active_status: some active value
    instrument_status: some instrument value

  tasks:

    - name: Try to read service name from existing file when it is not defined
      when: service_name is not defined
      block:
        - name: Check if file exists
          stat:
            path: "{{ my_dest }}"
          register: my_file

        - name: Try to read target file if exists
          slurp:
            src: "{{ my_dest }}"
          when: my_file.stat.exists
          register: my_file_slurp

        - name: Look for service name if there
          set_fact:
            looked_service: >-
              {{
                my_file_slurp.content
                | b64decode
                | regex_search('^service_name=.*$', multiline=true)
                | regex_replace('^service_name=(.*)$', '\1')
                | regex_replace('None', '')
              }}
          when: my_file.stat.exists

        - name: Update service name if found
          set_fact:
            service_name: "{{ looked_service }}"
          when: looked_service | default('') | length > 0


    - name: Copy template file to destination
      template:
        src: test_template.j2
        dest: "{{ my_dest }}"

推荐阅读