Значение шаблона Ansible jinja 2 не должно изменяться

Я написал шаблон jinja2 в анзибле. Я пытаюсь достичь того, что если имя_службы не указано и если имя_службы уже существует на удаленном компьютере, ansible не должен изменять имя_службы с именем по умолчанию, указанным в шаблоне. Однако, когда service_name не определено, ansible заменяет имя службы на «abc» на удаленном компьютере, даже если service_name существует. Любая помощь будет оценена.

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

Спасибо


person learning fun    schedule 03.01.2020    source источник
comment
То, что вы пытаетесь сделать, невозможно только путем копирования шаблона. То, что вы сейчас получаете, - это ожидаемый результат. Вам нужно больше логики вокруг этого: прочтите файл, если он существует, посмотрите, есть ли уже определенное имя службы, если имя службы уже определено в файле, а service_name в настоящее время не задано, установите service_name со значением, затем скопируйте свой шаблон ( который не изменится, если все остальные значения идентичны).   -  person Zeitounator    schedule 03.01.2020
comment
Не могли бы вы вставить весь фрагмент кода?   -  person Venu S    schedule 04.01.2020


Ответы (1)


Следуя моему вышеупомянутому комментарию, вот возможный пример реализации, отвечающий вашим требованиям. test_template.j2 - это точная копия вашего текущего шаблона. Вы можете передать имя службы в качестве дополнительной переменной для тестирования (-e service_name=my_service)

Обычно, если service_name не определен, мы:

  • Проверьте, существует ли уже удаленный файл и slurp его содержимое в переменной
  • Найдите в файле соответствующую строку. Примечание: 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 }}"
person Zeitounator    schedule 04.01.2020