本系列文資料可參考以下:
前面 17 天講了一堆 Puppet 的一些重要的用法,接下來的 Day 18、19、20 是直接帶領各位在實務上可能用到的經驗。
這篇主要是以 Linux base 的基礎設定為主,每一個管理員針對自己的每一台系統都會有 應該 要做的事情,例如 ntp 校時、
這個篇幅屬於可 LAB 性質,可以參考 shazi7804/puppet-master-docker 來實作 Puppet code。
在這個 workshop 會需要用到以下 module
class { 'motd':
template => "${module_name}/base/motd.erb",
}
因為想要依照不同的 node 給予相對應訊息,所以採用 motd 的 template。
templates/motd.erb
================================================
The site <%= @fqdn %> is managed by Puppet.
用 facts 的 fqdn 動態改變字串。
file { '/etc/hostname':
ensure => file,
content => $trusted['certname'],
notify => Exec['hostname-refresh']
}
exec { 'hostname-refresh':
command => 'hostname -F /etc/hostname',
path => '/bin:/usr/sbin:/usr/bin:/sbin',
refreshonly => true
}
因為必須先設定 /etc/hostname 後才使用 hostname -F 去生效,所以會有順序上的問題,在 exec 這邊用 refreshonly 被動的方式等待觸發才會執行,而 file 有異動的時候會 notify Exec['hostname-refresh']。
augeas { 'set-environment':
lens => 'Shellvars.lns',
incl => '/etc/environment',
changes => template("${module_name}/environment.erb"),
}
augeas 是用來管理所有系統設定檔,特性是可以處理單行而不影響既有的資料,因為 environment 可能會有許多 application 會共用這隻檔案,所以不適合用 file 來管理,如果用 file 就咬死這隻檔案的彈性了。
file_line { 'sudo_rule-sudo':
path => '/etc/sudoers',
line => '%sudo ALL=(ALL:ALL) ALL',
}
這邊用到 stdlib 的 file_line,其用途跟 augeas 很像,都是用來控制單行不影響既有資料,不過 file_line 可以處理非系統設定檔。
class { '::ntp':
servers => ['time.google.com'],
}
class { '::snmp':
agent_address => 'udp:161',
com2sec => ["notConfigUser default public"],
views => ['systemview included .1'],
}
最後 deploy 到 node 驗證一下是否都有確實安裝。