Adakah cara untuk memaksa boneka melakukan hal-hal tertentu terlebih dahulu? Sebagai contoh, saya memerlukannya untuk menginstal RPM di semua server untuk menambahkan repositori yum (Komunitas IUS) sebelum saya menginstal salah satu paket.
Adakah cara untuk memaksa boneka melakukan hal-hal tertentu terlebih dahulu? Sebagai contoh, saya memerlukannya untuk menginstal RPM di semua server untuk menambahkan repositori yum (Komunitas IUS) sebelum saya menginstal salah satu paket.
Jawaban:
Jika Anda ingin memastikan repositori diinstal pada semua server Anda maka saya akan menyarankan sesuatu seperti ini
node default {
include base
}
class base {
yumrepo { "IUS":
baseurl => "http://dl.iuscommunity.org/pub/ius/stable/$operatingsystem/$operatingsystemrelease/$architecture",
descr => "IUS Community repository",
enabled => 1,
gpgcheck => 0
}
}
Lalu, untuk setiap simpul yang memanjang base
bisa Anda katakan
class foo {
package { "bar": ensure => installed, require => Yumrepo["IUS"] }
}
Ini akan memastikan itu
bar
tidak akan diinstal kecuali repositori IUS didefinisikanMeskipun tahapan dapat menangani hal ini dan juga dependensi yum repo tertentu, lebih baik menyatakan hubungan secara umum.
Hanya menempatkan Yumrepo <| |> -> Package <| provider != 'rpm' |>
di manifest boneka Anda.
node default {
Yumrepo <| |> -> Package <| provider != 'rpm' |>
}
Ini membuatnya agar semua tipe yumrepo akan diproses sebelum paket apa pun yang tidak memiliki 'rpm' sebagai penyedianya. Pengecualian yang terakhir adalah agar saya dapat menggunakan paket RPM (misalnya) rilis-epel untuk membantu menginstal yum repo.
(Saya menemukan pertanyaan ini setelah saya menjawab hampir sama .. jadi saya pikir jawaban saya juga berlaku di sini dan layak untuk diulangi (lebih aman untuk memiliki jawaban di dua tempat ..)
Sejauh yang saya mengerti, ini adalah tahapan apa - mereka membiarkan Anda mengelompokkan dan memesan eksekusi kelas. Saya menggunakan "tahapan" untuk memperbarui dan mengkonfigurasi APT di server Debian, yang seharusnya sangat mirip dengan apa yang akan Anda lakukan dengan YUM.
Pertama-tama, Anda mendeklarasikan tahap "yum" di tingkat atas (di atas "node"), sehingga kelas-kelas dalam tahap "yum" akan dieksekusi sebelum yang "utama":
stage { 'yum' : before => Stage['main'] }
Kemudian, Anda menetapkan panggung untuk kelas-kelas. Anda dapat melakukan ini dengan benar dalam definisi simpul Anda:
node default {
class { 'yumrepos' : stage => yum }
include packages
}
Anda bisa menggunakan Tag . Ini akan memungkinkan Anda untuk menandai pemasang repo dengan firstrun
atau sesuatu,
lalu lari
puppetd --tags firstrun
dan itu hanya akan menjalankan modul / pernyataan yang cocok dengan tag.
Hal utama yang perlu Anda gunakan adalah kata kunci yang diperlukan - "Evaluasi satu atau lebih kelas, tambahkan kelas yang diperlukan sebagai ketergantungan."
Contoh menggunakan repositori apt bisa berupa:
class installcustompackages {
# make sure we have the repository file and public key
file { "/etc/apt/sources.list.d/myrepo.list":
source => "puppet://puppet/files/etc/apt/sources.list.d/myrepo.list",
ensure => present;
"/etc/apt/trusted.gpg":
source => "puppet://puppet/files/etc/apt/trusted.gpg",
}
# do an update whenever the list or trusted key file change
exec { "/usr/bin/apt-get update":
alias => "aptgetupdate",
require => [ File["/etc/apt/sources.list.d/myrepo.list"], File["/etc/apt/trusted.gpg"] ],
subscribe => [ File["/etc/apt/sources.list.d/myrepo.list"], File["/etc/apt/trusted.gpg"] ],
refreshonly => true;
}
package { "mypackage":
ensure => latest,
require => Exec["aptgetupdate"];
"mypackage2":
ensure => latest,
require => Exec["aptgetupdate"];
}
service { "myservice":
enable => false,
require => Package[mypackage];
}
}
(Diadaptasi dari contoh bootstrap boneka ini ).
Jadi Anda dapat melihat bagaimana setiap tahap mengharuskan yang sebelumnya dilakukan terlebih dahulu. Saya akan meninggalkan Anda untuk mengetahui cara menerapkan ini ke yum karena saya tidak terbiasa dengan tempat menyimpan file itu.
Wayang membaca konfigurasi dari atas ke bawah, jadi jika Anda memasukkan kelas dengan yum repo pertama di kelas itu, repo ini akan ditambahkan sebelum yang lain.
Jika Anda menggunakan pengaturan yang diperlukan pada paket, Anda akan memastikan bahwa jenis sumber daya yang diperlukan ada sebelum menambahkan paket, seperti:
node 'yournode.domain.com' {
package { "bar": ensure => installed, require => Yumrepo["IUS"] }
yumrepo { "IUS":
baseurl => "http://dl.iuscommunity.org/pub/ius/stable/$operatingsystem/$operatingsystemrelease/$architecture",
descr => "IUS Community repository",
enabled => 1,
gpgcheck => 0
}
}
Kode di atas akan menambah repo sebelum menambahkan paket.
require
kata kunci, yang telah Anda lakukan di bagian kedua.
Sesuatu seperti ini bekerja untuk saya:
yumrepo { A:
descr => "A repo",
baseurl => '',
enabled => 1,
gpgcheck => 1,
gpgkey => "",
priority => 3
}
yumrepo { B:
descr => "B repo",
baseurl => '',
enabled => 1,
gpgcheck => 1,
gpgkey => "",
priority => 3
}
yumrepo { C:
descr => "C repo",
baseurl => '',
enabled => 1,
gpgcheck => 1,
gpgkey => "",
priority => 3;
}
Package {
require => [Yumrepo[A], Yumrepo[B], Yumrepo[C]]
}
Saya memasukkan sesuatu seperti ini di mysite.pp. Dengan cara ini, modul boneka Anda, bebas dari referensi ke repositori yum.