Puppet
facter
Learning Puppet 笔记
Resources and the RAL
- Resources: Imagine a system’s configuration as a collection of many independent atomic units; call them “resources.”
- 资源可分类
- 资源类型描述抽离于它的具体操作步骤
- Puppet 指定资源的期望状态,而不是直接指定具体操作
- 以上三点组成 Puppet 的资源抽象层 (RAL), RAL 包括 types(高级别抽象模型) 和 providers(平台相关实现),这样可以使用平台无关的方式来描述资源得期望状态。
- 每个资源(Resource )的描述包括: resource type, one title, a number of attributes, each attribute has a value
user { 'dave': ensure => present, uid => '507', gid => 'admin', shell => '/bin/ksh', home => '/home/dave', managehome => true, }
This syntax is called a resource declaration
- Resource Types : puppet_core_types_cheatsheet.pdf, the type references
puppet describe
: Thepuppet describe
subcommand can list info about the currently installed resource types on a given machine.puppet resource
: Puppet includes a command calledpuppet resource
, which can interactively inspect and modify resources on a single system. Usage:# puppet resource <TYPE> [<NAME>] [ATTRIBUTE=VALUE ...]
Manifests
.pp
: Puppet programs are called “manifests,” and they use the.pp
file extension.- 完整语法链接: lang resources
- 大括号,冒号,逗号要正确
- 大小写敏感。 类型(type)和属性(attributes)名必须小写
- 字符串值的书写: datatypes
- All types have a special attribute called the namevar, 该属性缺失就默认以 title 替代
- Before being applied, manifests get compiled into a document called a catalog
puppet apply <.pp file >
- Puppet agent/master
Resource Ordering
- You can embed relationship information in a resource with the
before
,require
,notify
, andsubscribe
metaparameters. - You can also declare relationships outside a resource with the
→
and~>
chaining arrows. - Relationships can be either ordering (this before that) or ordering-with-notification (this before that, and tell that whether this was changed).
- Puppet’s relationship behaviors and syntaxes are documented in the Puppet reference manual page on relationships.
- The
ordering
setting inpuppet.conf
determines the order in which unrelated resources are applied.
Variables, Conditionals, and Facts
- Variables: 语法类似 php, 但实际是常量,只能被赋值一次, 不能修改。
- Conditionals:
if
,elseif
,else
,case
,default
- Puppet has a bunch of built-in, pre-assigned variables that you can use.
- Facts: facts ,Puppet uses a tool called Facter, which discovers some system information, normalizes it into a set of variables, and passes them off to Puppet. Puppet’s compiler then has access to those facts when it’s reading a manifest.
Modules and Classes
- Classes are named blocks of Puppet code, which can be created in one place and invoked elsewhere.
- Puppet 的 class 更像是宏, 但拥有变量域。
include <class name>
来起作用。- Modules:
- Modules are just directories with files, arranged in a specific, predictable structure. The manifest files within a module have to obey certain naming restrictions.
- Puppet looks for modules in a specific place (or list of places). This set of directories is known as the
modulepath
, which is a configurable setting - If a class is defined in a module, you can declare that class by name in any manifest. Puppet will automatically find and load the manifest that contains the class definition.
- 一个 module 就是一个路径, 模块名就是路径名
- module layout: 模块包含子文件夹
manifests
,files
,templates
等等, 详看 a page of info about module layout 以及 module cheat sheet. - module 静态文件(
files/
下)的引用格式:puppet:///modules/模块名/文件名(可包括files下的子路径)
例如:
puppet:///modules/ntp/config_files/linux/ntp.conf.el
引用
ntp
模块下的files/config_files/linux/ntp.conf.el
文件.
- puppet.conf: The Puppet config file is called puppet.conf, and in Puppet Enterprise it is located at
/etc/puppetlabs/puppet/puppet.conf
- The format of puppet.conf is explained in the configuration docs
- Puppet Forge: 模块仓库. 使用方式:install module:
$ sudo puppet module install puppetlabs-mysql//forge 里模块名有用户名前缀
List all installed modules:
$ sudo puppet module list
Templates
- Templates are saved as files with the
.erb
extension. and be stored in thetemplates/
directory of any module. There can be any number of subdirectories insidetemplates/
. - Use a template by the function
template
:file {'/etc/foo.conf': ensure => file, require => Package['foo'], content => template('foo/foo.conf.erb'), }
template
参数格式为<MODULE NAME>/<FILENAME INSIDE TEMPLATES DIRECTORY>
. - Use a template by the function
inline_template