มีวิธีบังคับให้หุ่นทำสิ่งต่าง ๆ ก่อนไหม? ตัวอย่างเช่นฉันต้องการให้ติดตั้ง RPM บนเซิร์ฟเวอร์ทั้งหมดเพื่อเพิ่มที่เก็บ yum (ชุมชน IUS) ก่อนที่ฉันจะติดตั้งแพ็คเกจใด ๆ
มีวิธีบังคับให้หุ่นทำสิ่งต่าง ๆ ก่อนไหม? ตัวอย่างเช่นฉันต้องการให้ติดตั้ง RPM บนเซิร์ฟเวอร์ทั้งหมดเพื่อเพิ่มที่เก็บ yum (ชุมชน IUS) ก่อนที่ฉันจะติดตั้งแพ็คเกจใด ๆ
คำตอบ:
หากคุณต้องการให้แน่ใจว่ามีการติดตั้งที่เก็บในเซิร์ฟเวอร์ของคุณทั้งหมดแล้วฉันจะแนะนำสิ่งนี้
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ถึงแม้ว่าสเตจสามารถจัดการสิ่งนี้และสามารถพึ่งพาการทำธุรกรรมซื้อคืนของ Yum ได้ แต่ดีกว่าคือการประกาศความสัมพันธ์โดยทั่วไป
เพียงแค่ใส่ Yumrepo <| |> -> Package <| provider != 'rpm' |>
หุ่นของคุณในรายการ
node default {
Yumrepo <| |> -> Package <| provider != 'rpm' |>
}
สิ่งนี้ทำให้มันเพื่อให้ประเภท yumrepo ทั้งหมดจะได้รับการประมวลผลก่อนแพ็กเกจใด ๆ ที่ไม่มี 'rpm' เป็นผู้ให้บริการ การยกเว้นหลังนั้นคือเพื่อให้ฉันสามารถใช้แพคเกจ RPM รุ่น epel-release เพื่อช่วยในการติดตั้ง yum repo
(ฉันพบคำถามนี้หลังจากที่ฉันตอบเหมือนกันเกือบทั้งหมด.. ดังนั้นคิดว่าคำตอบของฉันจะถูกนำไปใช้ที่นี่เช่นกันและมันก็คุ้มค่าที่จะทำซ้ำ (ปลอดภัยกว่าที่จะมีคำตอบในสองที่ .. )
เท่าที่ฉันเข้าใจนี่คือขั้นตอนที่แน่นอนสำหรับ - พวกเขาให้คุณจัดกลุ่มและดำเนินการสั่งคลาส ฉันใช้ "ระยะ" เพื่ออัปเดตและกำหนดค่า APT ที่เซิร์ฟเวอร์ Debian ซึ่งควรคล้ายกับสิ่งที่คุณจะทำกับ YUM
ก่อนอื่นคุณต้องประกาศสเตจ "yum" ที่ระดับบนสุด (เหนือ "nodes") ดังนั้นคลาสที่อยู่ในสเตจ "yum" จะถูกเรียกใช้ก่อนหน้า "main"
stage { 'yum' : before => Stage['main'] }
จากนั้นคุณกำหนดสเตจให้กับคลาส คุณสามารถทำได้ในนิยามโหนดของคุณ:
node default {
class { 'yumrepos' : stage => yum }
include packages
}
คุณสามารถใช้แท็ก สิ่งนี้จะช่วยให้คุณติดแท็ก repo installer ด้วยfirstrun
หรือบางอย่าง
จากนั้นเรียกใช้
puppetd --tags firstrun
และมันจะดำเนินการโมดูล / คำสั่งที่ตรงกับแท็ก
สิ่งสำคัญที่คุณต้องใช้คือต้องการคีย์เวิร์ด - "ประเมินหนึ่งคลาสขึ้นไปโดยเพิ่มคลาสที่ต้องการเป็นการพึ่งพา"
ตัวอย่างการใช้ที่เก็บ 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 เพราะฉันไม่คุ้นเคยกับที่เก็บไฟล์
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 ก่อนที่จะเพิ่มแพ็คเกจ
require
คำหลักที่คุณได้ทำในส่วนที่สอง
บางสิ่งเช่นนี้ใช้ได้กับฉัน:
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