Ansible вставить строку в файл более одного раза - PullRequest
1 голос
/ 06 марта 2020

У меня есть файл yaml, например:

a:
  b:
  c:
  d:

Мне нужно вставить строку после b:, c: и d:. Я могу сделать это с помощью модуля Ansible lineinfile, но только если вставляемая строка каждый раз отличается. Если строка одинакова (что возможно), lineinfile вставляет ее только один раз. Basi c invocation:

- name: "Test"
  lineinfile:
    path: "/path/to/file"   
    insertafter: "a:"
    line: "    - {{ item }}"
  with_flattened: 
    - "{{ groups.test }}" 

Предложения о том, как выполнить sh, это было бы наиболее ценно.

1 Ответ

0 голосов
/ 06 марта 2020

l oop здесь не ваш друг и не lineinfile. Вы хотите модуль replace.

Следующее строит замещающую строку в переменную, а затем использует это:

---
- hosts: localhost
  vars:
    new_lines:
    - "first line"
    - "second line"
    repl_str: '\1\n'

  tasks:
  - set_fact:
      search_str: '([bcd]:)\n(?!    - {{ new_lines[0] }})'

  - set_fact:
      repl_str: "{{ repl_str }}    - {{ item }}\n"
    with_items: "{{ new_lines }}"

  - replace:
      path: file.txt
      regexp: "{{ search_str }}"
      replace: "{{ repl_str }}"

Этот сборник пьес взял этот файл:

a:
  b:
  c:
  d:

И сделал этот файл:

a:
  b:
    - first line
    - second line
  c:
    - first line
    - second line
  d:
    - first line
    - second line

Этот бит строки поиска, (?! - {{ new_lines[0] }}), делает идемпотент плейбука.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...