Управляйте только разделом файла конфигурации с Марионеткой (мультилиния file_line)

Я обычно использую bc для арифметики с плавающей точкой:

file=1.txt
echo '('$(<$file)')/'$(wc -l < $file) | sed 's/ /+/g' | bc -l
5
09.08.2014, 02:24
4 ответа

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

auto eth0
iface eth0 inet static
address 192.168.108.5
netmask 255.255.255.0

# BEGIN PUPPET WLAN0
allow-hotplug wlan0
iface wlan0 inet static
    address <%= wlan0_address %>
    netmask <%= wlan0_netmask %>
# END PUPPET WLAN0

# More stuff that I do not want to touch through Puppet
# Static content here

Этот пример предполагает, что вы определили переменные $wlan0_address и $wlan0_netmask в другом месте.

Затем вы выполняете развертывание с помощью файлового ресурса:

file{'interfaces':
        ensure  => file,
        path    => '/etc/network/interfaces',
        content => template('/path/to/template'),
}
0
27.01.2020, 20:41

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

$wlan_address = [...]
$wlan_netmask = [...]
$wlan_string = "allow-hotplug wlan0
iface wlan0 inet static
    address ${wlan_address}
    netmask ${wlan_netmask}"

file_line { 'wlan0':
  path  => '/etc/network/interfaces',
  line  => $wlan_string,
  match => '^# PUPPET WLAN0$',
}
2
27.01.2020, 20:41

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

Вы уже определили различные инструменты, которые могут это сделать.

  • Augeas
  • stdlib/file_line
  • exec + sed

Вы можете альтернативно управлять всем файлом и делать "onlyif", чтобы файл не перезаписывался каждый раз.

Как вы обнаружили, file_line действительно работает только с конфигурационными файлами в стиле init, которые представляют собой одну строку.

Лучшим вариантом будет выполнение для этого файла с вставкой sed.

1
27.01.2020, 20:41

В puppet уже установлен модуль по умолчанию, который называется :puppetlabs -stdlib, и в этом модуле есть определенный тип, называемый file _line, который делает свое дело :)Вот мой сценарий в файле /manifests/node.pp:

node elk.ershandc.org {
...
file_line { 'backup_authorized_key' :
    ensure => 'present',
    path   => '/root/.ssh/authorized_keys',
    line   =>'ssh-rsaAAAAB3NzaC1yc2EAAAADAQABAAABAQC1ZCi/K0hlffi9ZUmveJ05l301RE6u/TzrCK+i54edzN5stR/tTjd28vFIup10HTYoZxbqBgRMrxVGDnfwtaSsCZH31g2/flZBxSZGzjySKeUqnf/YyGJP6my/IjA4xcKVcPDPx2FF/u1Sd07y7wnLizjAhtIOwq1daiCcRbXkIxfpobQt/RtJLAyDA1CwACr9NWmAezS0rnaYXRBQrmrkCBx91fMhKsarvxB3z4mTG8wVNwXvE9g2Hps6bRzff0hIXaIoVFYHwqmyIkN+4xCDGcjt3TjZp0zvTK20RR7DNOHxOGs8GBhcvitEkGY/JXgA4AJ26ncfXaspaUgEM/Rt root@devop-testbed'
 }

...
}
0
27.01.2020, 20:41

Теги

Похожие вопросы