เพิ่ม repo yum ให้กับ puppet ก่อนทำอะไรอย่างอื่น


26

มีวิธีบังคับให้หุ่นทำสิ่งต่าง ๆ ก่อนไหม? ตัวอย่างเช่นฉันต้องการให้ติดตั้ง RPM บนเซิร์ฟเวอร์ทั้งหมดเพื่อเพิ่มที่เก็บ yum (ชุมชน IUS) ก่อนที่ฉันจะติดตั้งแพ็คเกจใด ๆ


สำหรับกรณีการใช้งานที่ซับซ้อนมากขึ้นเห็นของฉันคำถามที่เกี่ยวข้อง
Matt McClure

คำตอบ:


37

หากคุณต้องการให้แน่ใจว่ามีการติดตั้งที่เก็บในเซิร์ฟเวอร์ของคุณทั้งหมดแล้วฉันจะแนะนำสิ่งนี้

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
   }
}

จากนั้นสำหรับโหนดใด ๆ ที่ขยายbaseคุณสามารถพูดได้

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

สิ่งนี้จะทำให้มั่นใจได้ว่า

  • แพ็กเกจbarจะไม่ถูกติดตั้งยกเว้นว่ามีการกำหนดที่เก็บ IUS
  • แพ็คเกจจะไม่พยายามติดตั้งก่อนที่จะมีการกำหนดที่เก็บ IUS

อาโอเค. นี่มันสุดยอดมาก ฉันไม่เห็น yumrepo ในนั้น - ขอบคุณ!
Jon Haddad

ใช้งานได้เฉพาะกับ distros ที่ใช้ Yum เท่านั้น Rhel5 เท่านั้นไม่ใช่ Rhel4
Dave Cheney

2
จะเกิดอะไรขึ้นถ้าฉันไม่ทราบว่าที่เก็บมีแพ็คเกจอะไร ตัวอย่างเช่นแพ็คเกจอาจมีอยู่ในที่เก็บfedoraบน Fedora และในepel repository บน RHEL, CentOS เป็นต้นซึ่งหมายความว่าถ้าฉันใช้สูตร / โมดูลของบุคคลที่สามฉันจะต้องปรับแต่งมัน
Cristian Ciupitu

17

ถึงแม้ว่าสเตจสามารถจัดการสิ่งนี้และสามารถพึ่งพาการทำธุรกรรมซื้อคืนของ Yum ได้ แต่ดีกว่าคือการประกาศความสัมพันธ์โดยทั่วไป

เพียงแค่ใส่ Yumrepo <| |> -> Package <| provider != 'rpm' |>หุ่นของคุณในรายการ

node default {
  Yumrepo <| |> -> Package <| provider != 'rpm' |>
}

สิ่งนี้ทำให้มันเพื่อให้ประเภท yumrepo ทั้งหมดจะได้รับการประมวลผลก่อนแพ็กเกจใด ๆ ที่ไม่มี 'rpm' เป็นผู้ให้บริการ การยกเว้นหลังนั้นคือเพื่อให้ฉันสามารถใช้แพคเกจ RPM รุ่น epel-release เพื่อช่วยในการติดตั้ง yum repo


8

(ฉันพบคำถามนี้หลังจากที่ฉันตอบเหมือนกันเกือบทั้งหมด.. ดังนั้นคิดว่าคำตอบของฉันจะถูกนำไปใช้ที่นี่เช่นกันและมันก็คุ้มค่าที่จะทำซ้ำ (ปลอดภัยกว่าที่จะมีคำตอบในสองที่ .. )

เท่าที่ฉันเข้าใจนี่คือขั้นตอนที่แน่นอนสำหรับ - พวกเขาให้คุณจัดกลุ่มและดำเนินการสั่งคลาส ฉันใช้ "ระยะ" เพื่ออัปเดตและกำหนดค่า APT ที่เซิร์ฟเวอร์ Debian ซึ่งควรคล้ายกับสิ่งที่คุณจะทำกับ YUM

ก่อนอื่นคุณต้องประกาศสเตจ "yum" ที่ระดับบนสุด (เหนือ "nodes") ดังนั้นคลาสที่อยู่ในสเตจ "yum" จะถูกเรียกใช้ก่อนหน้า "main"

stage { 'yum' : before => Stage['main'] }

จากนั้นคุณกำหนดสเตจให้กับคลาส คุณสามารถทำได้ในนิยามโหนดของคุณ:

node default {
  class { 'yumrepos' : stage => yum }

  include packages
}

ขอบคุณสำหรับสิ่งนี้ :) โดยส่วนตัวแล้วฉันชอบวิธีนี้เป็นอย่างมาก
Michael Mior

5

คุณสามารถใช้แท็ก สิ่งนี้จะช่วยให้คุณติดแท็ก repo installer ด้วยfirstrunหรือบางอย่าง

จากนั้นเรียกใช้

 puppetd --tags firstrun

และมันจะดำเนินการโมดูล / คำสั่งที่ตรงกับแท็ก


นี่คือสิ่งที่ฉันกำลังมองหา - ขอบคุณทอม!
Jon Haddad

3

สิ่งสำคัญที่คุณต้องใช้คือต้องการคีย์เวิร์ด - "ประเมินหนึ่งคลาสขึ้นไปโดยเพิ่มคลาสที่ต้องการเป็นการพึ่งพา"

ตัวอย่างการใช้ที่เก็บ apt อาจเป็น:

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];
   }
}

(ดัดแปลงมาจากตัวอย่างของ bootstrapping หุ่นเชิด )

ดังนั้นคุณสามารถดูได้ว่าแต่ละขั้นตอนต้องการให้ขั้นตอนก่อนหน้านี้สำเร็จได้อย่างไร ฉันจะปล่อยให้คุณหาวิธีนำไปใช้กับ yum เพราะฉันไม่คุ้นเคยกับที่เก็บไฟล์


0

Puppet อ่านการตั้งค่าจากบนลงล่างดังนั้นหากคุณรวมคลาสกับ yum repo ก่อนในคลาสนั้น repo นี้จะถูกเพิ่มก่อนสิ่งอื่นใด

หากคุณใช้การตั้งค่าจำเป็นต้องมีในแพ็คเกจคุณจะตรวจสอบให้แน่ใจว่ามีประเภททรัพยากรที่ต้องการอยู่ก่อนที่จะเพิ่มแพ็คเกจดังกล่าว:

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
   }
}

รหัสนี้จะเพิ่ม repo ก่อนที่จะเพิ่มแพ็คเกจ


10
Puppet ใช้ภาษาที่มีการประกาศดังนั้นจึงไม่ต้องกังวลเกี่ยวกับลำดับของสิ่งต่าง ๆ ในไฟล์ ย่อหน้าแรกของคุณผิดฉันเกรง วิธีที่ถูกต้องในการทำเช่นนี้คือการใช้requireคำหลักที่คุณได้ทำในส่วนที่สอง
Hamish Downer

0

บางสิ่งเช่นนี้ใช้ได้กับฉัน:

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]]
}

ฉันรวมบางสิ่งเช่นนี้ไว้ใน mysite.pp ด้วยวิธีนี้โมดูลหุ่นกระบอกของคุณไม่มีการอ้างอิงถึง repos yum

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.