WedX - журнал о программировании и компьютерных науках

Ansible lineinfile дублирует строку

У меня есть простой файл /etc/foo.txt. Файл содержит следующее:

#bar

У меня есть следующая доступная задача playbook, чтобы раскомментировать строку выше:

- name: test lineinfile
  lineinfile: backup=yes state=present dest=/etc/foo.txt
              regexp='^#bar'
              line='bar'

Когда я впервые запускаю ansible-playbook, строка раскомментируется, и файл /etc/foo.txt теперь содержит следующее:

bar

Однако, если я снова запустил ansible-playbook, я получу следующее:

bar
bar

Если я запустил его еще раз, то файл /etc/foo.txt будет выглядеть так:

bar
bar
bar

Как избежать такого дублирования строк? Я просто хочу раскомментировать "#bar" и покончить с этим.

15.10.2013

  • Используйте заменить на just uncomment the '#bar' and be done with it. 09.06.2019

Ответы:


1

Проблема в том, что регулярное выражение задачи соответствует только закомментированной строке #bar. Чтобы быть идемпотентной, задача lineinfile должна соответствовать как прокомментированному , так и не прокомментированному состоянию строки. Таким образом, он раскомментирует #bar, но передаст bar без изменений.

Эта задача должна делать то, что вы хотите:

- name: test lineinfile
  lineinfile: 
    backup=yes
    state=present
    dest=/etc/foo.txt
    regexp='^#?bar'
    line='bar'

Обратите внимание, что единственным изменением было добавление символа "?" в регулярное выражение.

18.10.2013
  • Но это всегда меняет файл. Насколько я понимаю, строка вставляется (файл изменяется) только при совпадении регулярного выражения. 15.11.2016
  • Пока файл каждый раз выходит одно и то же, задача идемпотентна. Это все, что имеет значение. 16.11.2016
  • Я на собственном опыте выяснил, что если вы используете insertafter в сочетании с этим, вы снова получите повторяющиеся строки. insertafter нарушает эту формулу. 09.02.2018

  • 2

    Вам нужно добавить backrefs = yes, если вы не хотите изменять регулярное выражение.

    - name: test lineinfile
      lineinfile: backup=yes state=present dest=/etc/foo.txt
                  regexp='^#bar' backrefs=yes
                  line='bar'
    

    Это изменяет поведение lineinfile с:

     find
     if found
       replace line found
     else
       add line
    

    to:

     find
     if found
       replace line found
    

    Другими словами, это делает операцию идемпотентной.

    21.02.2014

    3

    См. https://github.com/ansible/ansible/issues/4531.

    Решение состоит в том, чтобы не заменять закомментированную строку, а добавить дополнительную строку, сохранив при этом оригинал.

    15.10.2013
    Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]