Я обычно использую bc
для арифметики с плавающей точкой:
file=1.txt
echo '('$(<$file)')/'$(wc -l < $file) | sed 's/ /+/g' | bc -l
Если вы можете гарантировать, что содержимое другого файла статично, вы можете просто сделать из этого файла шаблон и сохранить статические секции без изменений. Пример:
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'),
}
Вы можете просто использовать однострочное совпадение в качестве замещения для многострочного значения :
$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$',
}
Управление частью файла представляет собой анти-шаблон управления конфигурацией, который должен быть предотвращен, насколько это возможно.
Вы уже определили различные инструменты, которые могут это сделать.
Вы можете альтернативно управлять всем файлом и делать "onlyif", чтобы файл не перезаписывался каждый раз.
Как вы обнаружили, file_line действительно работает только с конфигурационными файлами в стиле init, которые представляют собой одну строку.
Лучшим вариантом будет выполнение для этого файла с вставкой sed.
В 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'
}
...
}