LINUX.ORG.RU
решено ФорумAdmin

Обновление пакетов с помощью puppet

 , ,


0

1

Всем доброго времени суток.

Подскажите, как правильно обновлять пакеты с помощью puppet. Планируется обновление клиентов 1с, но, тесты делаю на Virtualbox'е. Думаю, это не критично.

Собственно, скастылил такое:

class 1c_update {
        file { "/tmp/":
                ensure => directory
        }

        file { "/tmp/virtualbox-5.2_5.2.18-124319~Ubuntu~trusty_amd64.deb":
                ensure => present,
                source => "/tmp/virtualbox-5.2_5.2.18-124319~Ubuntu~trusty_amd64.deb"
        }

        package { "1c_update":
                provider => dpkg,
                ensure => latest,
                source => "/tmp/virtualbox-5.2_5.2.18-124319~Ubuntu~trusty_amd64.deb"
        }
}

На клиенте:

$ sudo service puppet stop
 * Stopping puppet agent                                                                                                                                                                                                         [ OK ] 
$ sudo puppet agent -v --no-daemonize

Оно обновляет, всё хорошо...казалось бы. Но, если я повторно проделаю эти две команды, то он снова запустит установку пакета, хотя он уже в актуальной версии относительно имеющегося пакета. Это нормальное поведение или я что-то упускаю?


Это нормальное поведение или я что-то упускаю?

Ненормальное

вместо:

ensure => latest,
укажи нужную версию
ensure => '5.2'

afanasiy ★★★★
()
Ответ на: комментарий от afanasiy

Описанное в документации пробовал проделывать.

class virtualbox {
        package { "virtualbox":
                provider => dpkg,
                ensure => '5.2.18-124319~Ubuntu~trusty',
                source => "/tmp/virtualbox-5.2_5.2.18-124319~Ubuntu~trusty_amd64.deb"
        }
}

Получаю:

$ sudo service puppet stop
 * Stopping puppet agent
$ sudo puppet agent -v --no-daemonize
Notice: Starting Puppet client version 3.4.3
Info: Retrieving plugin
Info: Caching catalog for w071
Error: Failed to apply catalog: Parameter ensure failed on Package[virtualbox]: Provider must have features 'versionable' to set 'ensure' to '5.2.18-124319~Ubuntu~trusty' at /etc/puppet/manifests/classes/1c_update.pp:7
Wrapped exception:
Provider must have features 'versionable' to set 'ensure' to '5.2.18-124319~Ubuntu~trusty'

ensure пробовал указывать и installed, и 5.2, и 5.2.18.. В общем перебрал несколько вариантов. Когда указываю версию, то вообще ошибка, когда указываю latest/installed, то все-равно устанавливает каждый раз. Может это конечно с Virtualbox такие приколы.

hanharr
() автор топика
Ответ на: комментарий от hanharr

Думаю, в твоем случае будет правильным написать свой custom fact.

Что-то типа:

Facter.add("1c_version") do
  setcode do
    Facter::Util::Resolution.exec("dpkg -s virtualbox | grep Version | awk '{ print substr($2,1,length($2)) }'")
  end
end
Ну и потом от него плясать в манифесте:
 if $1c_version == 5.2 
и т.д.

afanasiy ★★★★
()

package {«mc» : provider => zypper, allow_virtual => false, ensure => installed }

Это для opensuse, для убунты провайдер другой

А вообще читайте документацию в puppet есть опции для всего

ism ★★★
()
Последнее исправление: ism (всего исправлений: 3)
Ответ на: комментарий от afanasiy

В общем, такая штука была только с virtualbox'ом. Попробовал с пакетами 1с и с ними такой проблемы нет. Но, столкнулся с новым приколом.

Error: Could not update: Execution of '/usr/bin/dpkg --force-confold -i /home/SIZ37/ratkin.roman/share/IT/1c_distrib/Плат8_3_12_1616_Сент_2018/deb/for_install/1c-enterprise83-client-nls_8.3.12-1616_amd64.deb' returned 1: (Reading database ... 155407 files and directories currently installed.)
Preparing to unpack .../1c-enterprise83-client-nls_8.3.12-1616_amd64.deb ...
Unpacking 1c-enterprise83-client-nls (8.3.12-1616) ...
dpkg: dependency problems prevent configuration of 1c-enterprise83-client-nls:
 1c-enterprise83-client-nls depends on 1c-enterprise83-client (= 8.3.12-1616); however:
  Package 1c-enterprise83-client is not installed.

dpkg: error processing package 1c-enterprise83-client-nls (--install):
 dependency problems - leaving unconfigured
Errors were encountered while processing:
 1c-enterprise83-client-nls

Error: /Stage[main]/1c-enterprise83/Package[1c-enterprise83-client-nls]/ensure: change from purged to latest failed: Could not update: Execution of '/usr/bin/dpkg --force-confold -i /home/SIZ37/ratkin.roman/share/IT/1c_distrib/Плат8_3_12_1616_Сент_2018/deb/for_install/1c-enterprise83-client-nls_8.3.12-1616_amd64.deb' returned 1: (Reading database ... 155407 files and directories currently installed.)
Preparing to unpack .../1c-enterprise83-client-nls_8.3.12-1616_amd64.deb ...
Unpacking 1c-enterprise83-client-nls (8.3.12-1616) ...
dpkg: dependency problems prevent configuration of 1c-enterprise83-client-nls:
 1c-enterprise83-client-nls depends on 1c-enterprise83-client (= 8.3.12-1616); however:
  Package 1c-enterprise83-client is not installed.

dpkg: error processing package 1c-enterprise83-client-nls (--install):
 dependency problems - leaving unconfigured
Errors were encountered while processing:
 1c-enterprise83-client-nls

Если после этого сделать sudo apt-get -f install, то всё становится нормально. Как можно вернуть результат выполнения и в зависимости от него выполнить еще какое-то действие?

hanharr
() автор топика

NixOS

или я что-то упускаю

Да, ты упускаешь, что уже не 2010 год. Даже в глубинке уже все перешли с говнокуколки на говноансибл, а прогрессивная часть человечества наконец-то открывает для себя NixOS.

anonymous
()
Ответ на: NixOS от anonymous

Даже в глубинке уже все перешли с говнокуколки на говноансибл, а прогрессивная часть человечества наконец-то открывает для себя NixOS.

Не перехожу с говнокуколки из-за наличия в сети шиндошьс машин, которые умеют только её.

afanasiy ★★★★
()
Ответ на: комментарий от afanasiy

Скостылил такое шаманство. Хоть ошибка и валится, но в итоге всё встаёт нормально.

Вопрос, можно ли это сделать более изящно? По идее, методом тыка, я узнал каких пакетов ему не хватает и могу в этом же манифесте сначала поставить их. Насколько это правильно с точки зрения автоматизации? И, правильно ли описывать каждый отдельный пакет в package или можно как-то сгруппировать?

И, в принципе, у нас есть apt-mirror. Как я понял, там можно добавить свою группу пакетов и тогда можно будет обновить командой sudo apt-get install 1c-enterprise83*. Не знаю, как способ более гибкий, ибо подобное происходит раз в пол года.

hanharr
() автор топика
Последнее исправление: hanharr (всего исправлений: 2)
Ответ на: комментарий от hanharr

Пердолиться руками с зависимостями
Насколько это правильно с точки зрения автоматизации?

Сам-то как думаешь?

Deleted
()
Ответ на: комментарий от Deleted

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

hanharr
() автор топика
Ответ на: комментарий от hanharr

Добавь пакеты в репозиторий, или сделай под них отдельный, и пусть пакетный менеджер разруливает зависимости. И в puppet'е у тебя будет джва ресурса, с добавлением репо, и установкой пакета, а не стопицот на каждый пакет.

Deleted
()
Ответ на: комментарий от Deleted

Спасибо, так действительно выглядит лаконичнее и мудрее.

hanharr
() автор топика
Ответ на: комментарий от afanasiy

Спасибо за помощь, пока реализовал в виде самопального репозитория с помощью reprepro. Подписал сертификатом и с помощью puppet раскидал на все машины. При перезапуске машинки скрипт перезапускает puppet и заодно делает sudo apt-get update && sudo apt-get dist-upgrade.

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

class cert-import {
    file { 'certpath':
        path    => '/usr/local/script/cert/',
        ensure  => directory,
        mode    => 755
    }

    file { 'gpgkey':
        path    => '/usr/local/script/cert/gpgkey.asc',
        ensure  => file,
        mode    => 555,
        require => File['certpath'],
        source  => "puppet://puppet/files/gpgkey.asc"
    }

    exec { 'apt-key-add':
        cwd     => '/usr/local/script/cert/',
        command => '/usr/bin/apt-key add gpgkey.asc',
        require => File['gpgkey'],
        onlyif  => 'test "$(apt-key list | grep 3878D3C1)" = ""'
    }
}
hanharr
() автор топика
Последнее исправление: hanharr (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.