Menambahkan yum repo ke boneka sebelum melakukan hal lain

26

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.

Jon Haddad
sumber
Untuk kasus penggunaan yang lebih kompleks, lihat juga pertanyaan terkait saya .
Matt McClure

Jawaban:

37

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 basebisa Anda katakan

class foo {
   package { "bar": ensure => installed, require => Yumrepo["IUS"] }
}

Ini akan memastikan itu

  • Paket bartidak akan diinstal kecuali repositori IUS didefinisikan
  • Paket tidak akan mencoba untuk menginstal sebelum repositori IUS didefinisikan
Dave Cheney
sumber
Ah, baiklah. Ini sangat mengagumkan. Saya tidak melihat yumrepo di sana - terima kasih!
Jon Haddad
Ini hanya bekerja dengan distro yang menggunakan Yum, jadi hanya Rhel5, bukan Rhel4
Dave Cheney
2
Apa yang terjadi jika saya tidak tahu repositori apa yang memiliki paket? Sebagai contoh, sebuah paket mungkin tersedia di repositori fedora di Fedora dan di repel epel di RHEL, CentOS dll. Ini berarti bahwa jika saya menggunakan resep / modul pihak ke-3 saya harus menyesuaikannya.
Cristian Ciupitu
17

Meskipun 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.

Steven Roberts
sumber
8

(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
}
Alexander Azarov
sumber
Terima kasih untuk ini :) Saya pribadi lebih suka pendekatan ini daripada jawaban yang diterima.
Michael Mior
5

Anda bisa menggunakan Tag . Ini akan memungkinkan Anda untuk menandai pemasang repo dengan firstrunatau sesuatu,

lalu lari

 puppetd --tags firstrun

dan itu hanya akan menjalankan modul / pernyataan yang cocok dengan tag.

Tom O'Connor
sumber
Ini persis apa yang saya cari - terima kasih Tom!
Jon Haddad
3

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.

Hamish Downer
sumber
0

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.

merobek-
sumber
10
Wayang menggunakan bahasa deklaratif, sehingga tidak khawatir tentang urutan hal-hal dalam file. Paragraf pertama Anda salah, saya khawatir. Cara yang benar untuk melakukan ini adalah dengan menggunakan requirekata kunci, yang telah Anda lakukan di bagian kedua.
Hamish Downer
0

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.

Oscar Montoya
sumber