Назад | Перейти на главную страницу

Использование марионетки для обновления vagrant box

Я использую марионетку, чтобы подготовить бродячий ящик (в данном случае Ubuntu). После первоначального запуска бродячей коробки (vagrant up), Бег apt-get upgrade перечислит несколько обновлений. Я хотел бы запустить эти обновления при первой загрузке, но мне не удается заставить марионетку запускать даже apt-get upgrade:

# run apt-get update
exec { "apt-update":
  command => "/usr/bin/apt-get update"
}

# run apt-get upgrade
exec { "apt-upgrade":
  command => "apt-get upgrade -y",
  path => "/usr/bin:/usr/sbin:/bin:/usr/local/bin",
  require => Exec['apt-update'],
}

Следующее не работает с:

err: /Stage[main]//Exec[apt-upgrade]/returns: change from notrun to 0 failed: apt-get upgrade -y returned 100 instead of one of [0] at /tmp/vagrant-puppet-1/manifests/site.pp:34

** Дополнительное исследование: ** в одном сообщении группы Google было предложено следующее, что не помогло:

Exec { path => [ "/usr/bin", "/usr/sbin", "/bin", "/usr/local/bin" ] }

И я попытался добавить звонок в apt-get -f install -y раньше тоже. Ни то, ни другое не сработало.

Спасибо!

Итак, настройки пути оказались правильными, и этот пост помог мне отследить последний бит того, как это исправить: https://ask.puppetlabs.com/question/1563/why-does-exec-fail-when-executing-directly-succeeds/

По сути, dkpg выходил из строя:

notice: /Stage[main]//Exec[apt-upgrade]/returns: dpkg: warning: 'ldconfig' not found in PATH or not executable.
notice: /Stage[main]//Exec[apt-upgrade]/returns: dpkg: warning: 'start-stop-daemon' not found in PATH or not executable.
notice: /Stage[main]//Exec[apt-upgrade]/returns: dpkg: error: 2 expected programs not found in PATH or not executable.
notice: /Stage[main]//Exec[apt-upgrade]/returns: Note: root's PATH should usually contain /usr/local/sbin, /usr/sbin and /sbin.
notice: /Stage[main]//Exec[apt-upgrade]/returns: E: Sub-process /usr/bin/dpkg returned an error code (2)

Когда я добавляю /sbin к пути для апгрейда, он работает.

exec { 'apt-upgrade':
  command => "/usr/bin/apt-get --quiet --yes --fix-broken upgrade",
  logoutput => "on_failure",
  path => "/usr/bin:/usr/sbin:/bin:/usr/local/bin:/usr/local/sbin:/sbin",
  require => Exec['apt-update'],
}

Измените исходный запрос на обновление apt-get, чтобы он выглядел примерно так:

exec { 'apt-get':
    command => "/usr/bin/apt-get update",
    onlyif => "/bin/sh -c '[ ! -f /var/cache/apt/pkgcache.bin ] || /usr/bin/find /etc/apt/* -cnewer /var/cache/apt/pkgcache.bin | /bin/grep . > /dev/null'",
}

Тогда вы сможете:

# run apt-get upgrade
exec { 'apt-upgrade':
  command => "/usr/bin/apt-get upgrade -y",
  require => Exec['apt-update'],
}