Добавьте строку внутри файла конфигурации через ansible - PullRequest
1 голос
/ 08 мая 2020

Мне нужно добавить новую строку в один из файлов конфигурации. Я должен добавить "mycustomimage" с "," в "images =". Короче говоря, мой требуемый результат: images = previousimage, mycustomimage

View mycnf.conf

id=1
images=previousimage

Для этого я попробовал этот код

---
- hosts: test_server
  - name: Add new string after "," in images
    lineinfile:
        path: /home/mycnf.conf
        regexp: 'images='
        insertafter: '^,'
        line: mycustomimage

Expected output

id= 1
images=previousimage,mycustomimage

Но у меня это не работает. Есть предположения? Заранее спасибо! Сид

Ответы [ 4 ]

1 голос
/ 10 мая 2020

Мы предполагаем, что вы не знаете, что такое previousimage, что у вас может быть несколько предыдущих изображений, и вы хотите добавить mycustomimage, и вы хотите, чтобы playbook был идемпотентным:

---
- hosts: all
  connection: ssh
  become: no
  gather_facts: no


  vars:
    image_name: mycustomimage

  tasks:
  - lineinfile:
      path: testfile.txt
      regexp: '^images=(.*(?<!{{ image_name }}))'
      line: '\1,{{ image_name }}'
      backrefs: yes

Итак, давайте объясним регулярное выражение: ^images= вы можете выяснить сами!

Первая скобка начинает блок backref, и он собирает все до конца строки: .*

Затем он оглядывается на то, что он только что втянул, и проверяет, что {{ image_name }} не находится в конце: (?<!{{ image_name }})

Наконец, мы закрываем блок обратной ссылки с помощью ).

1 голос
/ 08 мая 2020

Это поможет

- name: replace line
  lineinfile:
    path: myfile.txt
    regexp: "^image="
    line: 'image=previousimage,customimage'
1 голос
/ 09 мая 2020

Предполагая, что previousimage неизвестно, вы можете сделать две вещи:

1. Получить эту строку, используя grep, зарегистрируйтесь в переменной и добавьте строку

- name: get line
  shell: grep "^image=" /config/file.something
  register: current_image

- name: update image
  lineinfile:
    path: /config/file.something
    regexp: '^image='
    line: "{{ current_image.stdout }},{{ new_image | default('customimage') }}"

2. Создайте шаблон для этого файла конфигурации и визуализируйте его каждый раз, когда запускается playbook и обнаруживается изменение:

- set_fact:
    images: <list of images retrieved by lookup or static>

- name: update config.something
  template:
     src: my_template.j2
     dest: /config/file.something

Шаблон будет выглядеть следующим образом:

id={{ id }}
images={{ images | join(",") }}
1 голос
/ 08 мая 2020

Из вашего примера

  1. Вы знаете, что последняя строка, которую вы хотите иметь в файле, - images=previousimage,mycustomimage
  2. Вы хотите добавить эту строку вместо уже существующей image=.* строка, если она существует и не соответствует последней.

Следующее будет выполнять работу

    - name: Replace line if needed
      lineinfile:
        path: /home/mycnf.conf
        regex: images=.*
        line: images=previousimage,mycustomimage

Примечание. Если по какой-либо причине в ваш файл для регулярного выражения, строка будет добавлена ​​в конец файла.

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