Добавление строки в определенном месте в рецепте шеф-повара - PullRequest
0 голосов
/ 12 марта 2020

У меня есть файл конфигурации /etc/csync/csync2.cfg с таким форматом, как

group ha_group
{
        key /etc/csync2/key_hagroup;
        host host1;
        host host2;
        include /etc/booth;
        include /etc/corosync/corosync.conf;
        include /etc/corosync/authkey;
}

Я хочу выяснить, существует ли запись (например, include /var/tsm/tsm/tsm.conf;). Если это произойдет, ничего не делайте, а если нет, добавьте его.

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

Мой сценарий использования требует, чтобы он был добавлен в фигурные скобки {}, а не в конец файл. Я не могу создать шаблон файла, потому что содержимое /etc/csync/csync2.cfg может варьироваться от узла к узлу.

Другой альтернативой была проверка, есть ли в командной строке csync2 какая-либо опция для добавления новых записей https://github.com/LINBIT/csync2/blob/master/doc/csync2.adoc избежать обработки в рецепте

Ответы [ 2 ]

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

Вы можете обойти это с помощью FileEdit , дополнительно удалив строку } и вставив ее в конце.

file = Chef::Util::FileEdit.new("/etc/hosts")
file.insert_line_if_no_match("/www.example.com/", "www.example.com")
file.search_file_delete_line('}')
file.insert_line_if_no_match('}') 
file.write_file
0 голосов
/ 14 марта 2020

вы можете найти poise-file , line поваренные книги под рукой или использовать FileEdit напрямую

file = Chef::Util::FileEdit.new("/etc/hosts")
file.insert_line_if_no_match("/www.example.com/", "www.example.com")
file.write_file
...