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