Puppet
Puppet用于集群中主机的管理。 Puppet是C/S结构,由服务端保存客户端的配置代码manifests(*.pp) 然后由客户端访问服务端,获取配置代码,在客户端执行。
Puppet中管理的对象都被看做Resource. Puppet的配置语言是面向结果的语言,和SQL一样,只要说明Resource想要达到的状态,而不用说明达到这个状态的方式。 Resources的声明:
file { '/etc/passwd': # TYPE and TITLE
path => '/etc/passwd', # ARRIBUTES and VALUES
owner => root, # ARRIBUTES and VALUES
group => root, # ARRIBUTES and VALUES
mode => 644, # ...
}
file { 'sshdconfig':
path => $operatingsystem ? {
solaris => "/usr/local/etc/ssh/sshd_config",
default => "/etc/ssh/sshd_config"
},
owner => root,
group => root,
mode => 644,
}
以上是file类型Resources。 Puppet内建的Resources类型有:
- file
- package
- service
- notify
- cron
- user
- …
各个资源之间的关系是独立的,执行起来并不是按照其在manifest中定义的顺序。 如果想在资源之间建立关系,可以使用下面四个元属性:
- require: 依赖关系,后于依赖资源执行
- before: 依赖关系,先于依赖资源执行
- subscribe: 通知关系,在依赖资源刷新后重新执行
- notify: 通知关系,在刷新后通知依赖资源
引用资源类型的第一个字母要大写:
file {'/tmp/test1':
ensure => present,
content => "Hi.",
}
notify {'/tmp/test1 has already been synced.':
require => File['/tmp/test1'], # resource reference
}
还可以在资源定义之间使用->
和~>
表示依赖关系和通知关系。
下面是一个常见的package/file/service模式:
package { 'openssh-server':
ensure => present,
before => File['/etc/ssh/sshd_config'],
}
file { '/etc/ssh/sshd_config':
ensure => file,
mode => 600,
source => '/root/examples/sshd_config',
}
service { 'sshd':
ensure => running,
enable => true,
subscribe => File['/etc/ssh/sshd_config'],
}
Command
执行:
puppet CFG_FILE.pp
puppet --server SERVER_HOST_NAME
Resource命令:
puppet resource <TYPE> [<NAME>] [ATTRIBUTE=VALUE ...] # create resources
puppet apply *.pp # client run manifests
Puppet自动把多个manifest文件编译成catalog,然后执行。
- 类表示一组资源。
- 函数表示带参数、可执行的exec资源,用于定义新的资源类型。
- 节点用来定义不同客户端上不同的资源。
- 变量和数组
- 模块用于结构化代码,包含files(文件发布目录),manifests(以init.pp开始),templates(erb模型)
Variables, Conditionals, and Facts
- 变量:
$varible = "abc"
; - 常量: 内建、预赋值的变量,如
${ipaddress_eth0}
,由factor提供;
条件:if
if condition {
block of code
}
elsif condition {
block of code
}
else {
block of code
}
条件:case
case $operatingsystem {
centos: { $apache ="httpd" }
# that these matches are case-insensitive.
# regex is OK
redhat: { $apache = "httpd" }
debian, ubuntu: { $apache = "apache2" }
default: { fail("Unrecognized operating system for webserver") }
}
package {'apache':
name => $apache,
ensure => latest,
}
条件: Selectors三元操作符
$apache = $operatingsystem ? {
centos => 'httpd',
redhat => 'httpd',
/(?i)(ubuntu|debian)/ => 'apache2',
default => undef,
}
Modules and Classes
定义资源时可以指定provider。
- file
- source属性指定文件来源,或用content属性指定文件内容。
- template命令可通过erb模板生成文件内容。
- package
- service