Menginstal paket dari PPA menggunakan Wayang

8

Saya mencoba menyediakan VM secara otomatis dengan buruh pelabuhan yang sudah diinstal sebelumnya.

Init.pp default saya terlihat seperti:

class { 'apt':
 always_apt_update    => true,
}

package { [
    #'build-essential',
    #'vim',
    #'curl',
    #'zsh',
    #'git-core',
    #'htop',
    #'wget',
    #'linux-image-generic-lts-raring',
    'python-software-properties'
    #'lxc-docker'
  ]:
  ensure  => 'installed',
}

apt::ppa { 'ppa:dotcloud/lxc-docker':}

# refresh apt source
exec { "apt-update":
  command => "/usr/bin/apt-get update && apt-get install lxc-docker --force-yes",
  returns => 100
}

Perintah exec terakhir kembali (pengembalian 100 adalah default untuk pembaruan apt-get yang berhasil saya pikir):

info: / Tahap [utama] // Apt :: Ppa [ppa: dotcloud / lxc-docker] / Exec [add-apt-repository-ppa: dotcloud / lxc-docker]: Penjadwalan pembaruan Exec [apt_update] pemberitahuan: / Tahap [utama] / Apt :: Perbarui / Exec [apt_update] / pengembalian: dieksekusi pemberitahuan berhasil: / Tahap [utama] / Apt :: Pembaruan / Exec [apt_update]: Dipicu 'refresh' dari 1 acara

Namun ketika saya ssh ke box docker tidak diinstal dan berjalan apt-get install lxc-dockersaya kemudian dapat menginstalnya. Apa yang saya lakukan salah? Sepertinya saya tidak bisa membuatnya bekerja dengan banyak konfigurasi yang berbeda.

digital
sumber

Jawaban:

13

apt-getmengembalikan 0 pada keberhasilan dan 100 pada kesalahan, karena Anda dapat dengan mudah melihat dari apt-gethalaman manual. Jadi Anda mendapatkannya mundur. Anda menggabungkan dua perintah menggunakan &&, yang berarti perintah kedua hanya berjalan ketika yang pertama selesai dengan sukses (mengembalikan 0). Jadi jika apt-get updatemengembalikan "100", seperti yang Anda perkirakan salah, perintah kedua bahkan tidak akan berjalan.

Dan jika Anda membaca pesan log dengan hati-hati, Anda akan melihat bahwa sumber daya Exec yang diterapkan bernama "apt_update" dan bukan "apt-update". Yang pertama didefinisikan dalam aptkelas dan dijalankan ketika apt::ppasumber daya diterapkan. Yang terakhir adalah sumber daya Exec Anda sendiri, yang juga akan muncul dalam output log, tetapi sebagai Exec[apt-update]. Cari itu.

Dalam kasus apa pun, apa yang Anda buat di sini tidak berfungsi karena Anda mencoba menggunakan Wayang sebagai skrip Shell yang dimuliakan dan melakukannya dengan salah. Wayang mengabaikan urutan di mana Anda menentukan sumber daya dalam manifes dan alih-alih menerapkannya sesuai keinginan. Jadi untuk memastikan lxc-dockerpaket terinstal dari PPA yang ditentukan Anda harus memastikan sumber daya PPA diterapkan sebelum sumber daya paket.

Ada beberapa cara untuk melakukan itu, semuanya melibatkan Anda menentukan hubungan atau ketergantungan. Ini salah satu caranya, menggunakan panah chaining :

class { 'apt':
 always_apt_update => true,
}

apt::ppa { 'ppa:dotcloud/lxc-docker':}

# Your regular packages don't know or care about the PPA
package { [
    'build-essential',
    'vim',
    'curl',
    'zsh',
    'git-core',
    'htop',
    'wget',
    'linux-image-generic-lts-raring',
    'python-software-properties'
  ]:
  ensure  => 'installed',
}

# We single lxc-docker out to be able to specify 
# the relationship to Apt::Ppa properly
package { 'lxc-docker':
  ensure => 'installed'
}

Apt::Ppa['ppa:dotcloud/lxc-docker'] ->
Package['lxc-docker']

Ini berarti bahwa lxc-dockersumber daya paket akan diterapkan setelah apt::ppasumber daya untuk PPA "ppa: dotcloud / lxc-docker" telah diterapkan. Seperti dijelaskan apt::ppasumber daya sudah mengurus memperbarui cache APT setelah menambahkan PPA, sehingga tidak perlu untuk memanggil secara eksplisit di apt-get updatemana saja.

Daff
sumber
Anda masih perlu meminta Exec['apt_update']paket Anda diinstal dari PPA. Mewajibkan PPA sebelum Paket tidak menegakkan hubungan antara Exec dan Paket.
daxlerod
1

Dan berikut ini adalah alternatif, jawaban idiomatis menggunakan require:

class { 'apt':
 always_apt_update => true,
}

apt::ppa { 'ppa:dotcloud/lxc-docker':}

package { [others]: }    

package { 'lxc-docker':
  ensure  => 'installed',
  require => Apt::Ppa['ppa:dotcloud/lxc-docker']
}
msanford
sumber