создание файла шаблона ansible jinja2 на основе входных значений

Я хочу создать файл application.properties и скопировать его в определенное место. Я использую модуль шаблона для того же. но я хочу создать содержимое файла на основе количества / значений входных IP-адресов, разделенных запятыми

содержимое файла должно быть ниже.

conf_pg_hba_replication.connection = оракул репликации хоста {{IP1}} / 32 оракула репликации \ nхоста {{IP2}} / 32 оракула репликации хоста {{IP3}} / 32 ............ .

поэтому я хочу, чтобы мой файл создавался с динамическим содержимым на основе значения входного IP-адреса, разделенного запятыми.

если мое входное значение ip равно 127.0.0.1,123.123.123.123, содержимое файла должно быть

conf_pg_hba_replication.connection = репликация хоста oracle 127.0.0.1/32 trust \ nhost репликация oracle 123.123.123.123/32 trust

так же мне нужно создать содержимое файла.

Пожалуйста помоги мне с этим.

---
- name: pp
  hosts: localhost
  tasks:
   - name: pp
     template:
      src: pp.j2
      dest: pp.properties
      newline_sequence: \n

-bash-4.2$ cat pp.j2
conf_pg_hba_replication.connection=host    replication     oracle       {{slave_ip}}/32      trust

Я передаю список IPS через переменную в доступную книгу воспроизведения, как показано ниже, ansible-playbook postgres.yml -e ips_list = ip1, ip2, ip3


person Community    schedule 27.07.2020    source источник
comment
Как загрузить список IPS?   -  person Zeitounator    schedule 27.07.2020
comment
Я передаю его через переменную в доступную книгу воспроизведения, ansible-playbook postgres.yml -e ips_list = ip1, ip2, ip3   -  person    schedule 28.07.2020
comment
Это должен быть не комментарий, а изменение вашего вопроса. Пока вы занимаетесь этим, вы также можете правильно отформатировать свой первый блок кода, чтобы сделать его более читабельным.   -  person Zeitounator    schedule 28.07.2020
comment
спасибо, отредактировал вопрос. также я еще начал с кодирования и мне нужны входные данные для написания шаблона jinja2 для достижения.   -  person    schedule 28.07.2020
comment
Пожалуйста, отформатируйте свой код правильно: блоками или встроенными. У вас есть кнопки форматирования в верхней части окна редактора и справка в правой части экрана. Также обратите внимание, что SO, как правило, работает наоборот: вы пишете код и показываете, что вы сделали, и задаете вопросы о конкретных проблемах, с которыми вы сталкиваетесь, пытаясь найти решение. Здесь достаточно коротко и легко, поэтому я все же решил ответить. Но имейте это в виду для будущих вопросов.   -  person Zeitounator    schedule 28.07.2020


Ответы (2)


Вы передаете список IP-адресов, разделенных запятыми, в качестве дополнительной переменной в командной строке ansible.

Чтобы выполнить ваше требование, вам необходимо:

  1. преобразуйте строку, содержащую список, разделенный запятыми, в реальный список с помощью функции split.
  2. переберите список в шаблоне, чтобы вывести результат.

На самом деле это можно сделать за одну задачу. Учитывая следующее _2 _...

{% for slave_ip in ip_list %}
conf_pg_hba_replication.connection=host    replication     oracle        {{ slave_ip }}/32      trust
{% endfor %}

и следующий сценарий ...

---
- name: template our pp file
  hosts: localhost
  gather_facts: false
  tasks:
    - name: pp
      template:
        src: pp.j2
        dest: pp.properties
      vars:
        ip_list: "{{ ip_list_raw.split(',') }}"

что вы так называете ...

ansible-playbook test.yml -e "ip_list_raw=127.0.0.1,1.2.3.4,5.6.7.8"

вы получите следующий результат

$ cat pp.properties 
conf_pg_hba_replication.connection=host    replication     oracle        127.0.0.1/32      trust
conf_pg_hba_replication.connection=host    replication     oracle        1.2.3.4/32      trust
conf_pg_hba_replication.connection=host    replication     oracle        5.6.7.8/32      trust

Обратите внимание, что вы также можете удалить объявление vars с split в задаче шаблона, передав непосредственно список IPS в виде массива json в командной строке.

ansible-playbook test.yml -e '{"ip_list":["127.0.0.1","1.2.3.4","5.6.7.8"]}'

Или даже загрузить их из внешнего файла yaml, например. my_ip_list.yml

---
ip_list:
  - 127.0.0.1
  - 1.2.3.4
  - 5.6.7.8

нравится:

ansible-playbook test.yml -e @my_ip_list.yml'
person Zeitounator    schedule 28.07.2020
comment
Большое спасибо, мой выходной файл свойств должен быть в формате ниже conf_pg_hba_replication.connection=host replication oracle 127.0.0.1/32 trust \nhost replication oracle 1.2.3.4/32 trust\nhost replication oracle 5.6.7.8/32 trust - person ; 28.07.2020
comment
Я пробовал ниже и смог как-то получить, и я ищу вывод в одной строке и \ n в качестве разделителя для каждой записи conf_pg_hba_replication.connection={% for slave_ip in ip_list %} host replication oracle {{ slave_ip }}/32 trust {% endfor %} - person ; 28.07.2020
comment
\ n отображается как обычный разрыв строки, когда вы смотрите на файл .... - person Zeitounator; 28.07.2020
comment
Ниже приведен результат, ниже - результат conf_pg_hba_replication.connection=host replication oracle 127.0.0.1/32 trust host replication oracle 1.2.3.4/32 trust host replication oracle 5.6.7.8/32 trust - person ; 28.07.2020
comment
круто, это нормально, если я могу проигнорировать \ n в файле и продолжить вышеупомянутые изменения? предполагая, что оба файла одинаковы, если мы сохраняем \ n в одной строке и удаляем \ n и имеем разные строки. - person ; 28.07.2020

person    schedule
comment
Добро пожаловать в StackOverflow! Хотя этот ответ может предоставить решение для потребностей OP, пожалуйста, добавьте объяснение, чтобы сделать его более понятным не только для OP, но и для всего сообщества. - person xKobalt; 08.09.2020