puppet定义资源,配置语言
Posted lriwu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了puppet定义资源,配置语言相关的知识,希望对你有一定的参考价值。
定义资源:
type {‘title‘:
attribute1 => value1,
attribute2 => value2,
}
要点:type表示资源类型必须小写;title是定义资源名称,在同一类型下必须惟一;
常用资源类型:
user, group, file, package, service, exec, cron, notify
资源的3类特殊属性:
NameVar:名称变量,值必须唯一(如果NameVar类型的属性未指定值会使用item定义的值);
ensure:用于控制资源的存在性
ensure =>file 存在且为一个普通文件
ensure =>directory 存在且为一个目录
ensure =>present 存在,可通用于描述上述三种(默认为present)
ensure =>absent 不存在
metaparameters:元参数,通常是所有类型都支持的属性。
group:
管理组资源
常用属性:
name: 组名,NameVar
gid:GID
system: true|false #是否为系统组
ensure: present, absent
members:组内成员
user:
管理用户
常用属性:
commet:注释信息
ensure:present, absent
expiry:账号过期期限;
gid:基本组id
groups:附加组
home:家目录
shell:默认shell
name: NameVar
system:是否为系统用户,true|false
uid: UID
password:
file:
管理文件及其内容、从属关系以及权限;内容可通过content属性直接给出,也可通过source属性根据远程服务器路径下载生成;
指明文件内容来源:
content:直接给出文件内容,支持\\n(换行), \\t(制表符);
source:从指定位置下载文件;
recurse:true|false 递归下载目录下的文件;
ensure:file, directory, link, present, absent #前3个用于区别文件类型;
常用属性:
force:强制运行,可用值yes, no, true, false(如创建一个文件与目录重名了,默认是不会覆盖的,如果要强制创建会删除目录只保留文件);
group:属组
owner:属主
mode:权限,支持八进制格式权限,以及u,g,o的赋权方式
path:目标路径;
source:源文件路径;可以是本地文件路径(单机模型),也可以使用puppet:///modules/module_name/file_name;
target:当ensure为“link”时,target表示path指向的文件是一个符号链接文件,其目标为此target属性所指向的路径;此时content及source属性自动失效;
#mkdir /manifests
#vim test1.pp
group{‘distro‘:
gid => 2000,
ensure => present,
}
user{‘centos‘:
uid => 2000,
gid => 2000,
shell => ‘/bin/bash‘
home => ‘/home/centos‘
ensure => present,
}
file{‘/tmp/mydir‘:
ensure => directory,
} #创建空目录/tmp/mydir
file{‘/tmp/puppet.file‘:
content => ‘puppet testing\\nsecond line.‘,
ensure => file,
owner => ‘centos‘,
group => ‘distro‘,
mode => ‘0400‘,
} #创建文件/tmp/puppet.file
file{‘/tmp/fstab.puppet‘:
source => ‘/etc/fstab‘,
ensure => file,
} #复制
file{‘/tmp/puppet.link‘:
ensure => link,
target => ‘/tmp/puppet.file‘,
} #创建链接文件,名称为/tmp/puppet.link,链接至/tmp/puppet.file文件
#puppet apply -v test1.pp
exec:
运行一外部命令;命令应该具有“幂等性”;
幂等性:命令可以运行多次(如创建文件,第一次可以创建,第二次运行后文件已经存在);
1、命令本身具有 幂等性;
2、资源有onlyif, unless,creates等属性以实现命令的条件式运行;
3、资源有refreshonly属性,以实现只有订阅的资源发生变化时才执行;
command:运行的命令;NameVar;(如果command未指定会使用item定义的值)
creates:此属性指定的文件不存在时才执行此命令;
cwd:在此属性指定的路径下运行命令即先cd至该目录下再执行命令;
user: 以指定的用户身份运行命令;
group: 指定组身份运行命令;
onlyif:给定一个测试命令;仅在此命令执行成功(返回状态码为0)时才运行command指定的命令;
unless:给定一个测试命令;仅在此命令执行失败(返回状态码不为0)时才运行command指定的命令;
refresh:接受到其它资源发来的refresh通知时,默认是重新执行exec定义的command,refresh属性可改变这种行为,即可指定仅在refresh时运行的命令;
refreshonly:仅在收到refresh通知,才运行此资源;true|false
returns:期望的状态返回值,返回非此值时表示命令执行失败;
tries:尝试执行的次数;
timeout:超时时长;
path:指明命令搜索路径,其功能类型PATH环境变量;其值通常为列表[‘path1‘, ‘path2‘, ...];如果不定义此属性,则必须给定命令的绝对路径;
#vim test2.pp
exec{‘/usr/sbin/modprobe ext4‘:
user => root,
group => root,
refresh => ‘/usr/sbin/modprobe -r ext4 && /usr/sbin/modprobe ext4‘,
timeout => 5,
tries => 2,
}
exec{‘/bin/echo mageedu > /tmp/hello.txt‘:
user => root,
group => root,
creates => ‘/tmp/hello.txt‘,
}
exec{‘/bin/echo mageedu > /tmp/hello2.txt‘:
user => root,
group => root,
unless => ‘/usr/bin/test -e /tmp/hello2.txt‘,
}
notify:
用于显示信息
核心属性:
message:要发送的消息的内容;NameVar
#vim test3.pp
notify:{"hello there":}
#puppet apply -v test3.pp #会显示信息
cron:
管理cron任务计划;
常用属性:
ensure:present, absent
command:要运行的job;
hour:
minute:
month:
monthday:
weekday:
name:
user:运行的用户
environment:运行时的环境变量;
#vim test4.pp
cron{"sync time":
command => ‘/usr/sbin/ntpdate 172.16.0.1 &> /dev/null‘,
minute => ‘*/10‘, #每10分钟运行一次
ensure => present, #默认为present
}
#crontab -l #查看生成了计划任务
#vim test5.pp
cron{"sync time":
command => ‘/usr/sbin/ntpdate 172.16.0.1 &> /dev/null‘,
minute => ‘*/10‘, #每10分钟运行一次
ensure => absent,
}
#crontab -l #查看计划任务已被删除
package:
管理程序包:安装,卸载,升级等功能
常用属性:
ensure: installed, latest, VERSION(2.3.1-2.el7),present, absent
name:程序包名称;
source:程序包来源;可以本地文件路径或URL;
provider:指明通过何种方式来安装程序包,如rpm还是yum。(默认是yum安装)
package{‘zsh‘:
ensure => latest,
}
package{‘jdk‘:
ensure => installed,
source => ‘/usr/local/src/jdk-8u25-linux-x64.rpm‘,
provider => rpm,
}
service:
管理运行的服务;
常用属性:
enable:是否开机自动启动,true|false;
特殊属性:Metaparameters
主要有两类:定义依赖关系和定义通知关系;Metaparameters使用4种元参数来确保资源之间的相关性(before,require,notify,subscribe);
这4个元参数都以另外的其它资源或资源数组作为其值,这也称作资源引用;资源引用要通过“Type[‘title‘]”的方式进行,如User[‘magedu‘],资源引用时,其类型名的首字母要大写。
定义依赖关系:
被依赖的资源中使用:before;
依赖其它资源的资源:require;
->:链式依赖
以下例子:创建suse用户时要确保附加组linux要事先存在,使用可以在group资源中引用user资源,表明要创建user资源group资源要事先存在。
被依赖的资源中使用:before:
依赖其它资源的资源:require:
依赖多个资源:
定义通知关系:
被依赖的资源中使用:notify
监听其它资源的资源:subscribe
~>:链式通知
1.被依赖的资源中使用:notify:
定义资源:
修改了file资源,将配置文件中监听的端口修改为808,file资源会通知service[nginx]资源做refresh操作。
2.监听其它资源的资源:subscribe
puppet变量及其作用域
变量名均以$开头,赋值符号为=; 任何非正则表达式类型的数据均可赋值给变量;
作用域:定义代码的生效范围,以实现代码间隔离;
仅能隔离:变量,资源的默认属性;
不能隔离:资源的名称,及引用;
每个变量两种引用路径:
相对路径
绝对路径:$::scope::scope::variable
变量的赋值符号:
=
+=:追加赋值
数据类型:
布尔型:ture, false
undef:未被声明的变量的值类型(也可手动为某变量赋予undef值,即直接使用不加引号的undef字符串)
字符型:可以不用引号,支持单引号(强引用),双引号(弱引用)
数值型:整数和浮点数;
数组:[item1, item2, ...],元素可为任意可用数据类型,包括数组和hash; 索引从0开始,还可以使用负数;
hash:{key => value, key => value,...}, 键为字符串,而值可以是任意数据类型;
正则表达式:
非标准数据类型,不能赋值给变量;
语法结构:
(?<ENABLED OPTION>:<SUBPATTERN>)
(?-<DISABLED OPTION>:<SUBPATTERN>)
OPTION:
i: 忽略字符大小写;
m:把.当换行符;
x:忽略模式中的空白和注释;
operatingsystem变量的值如果是ubuntu或debian,就把packages这个变量的值赋值为apache2
表达式:
比较操作符:==, !=, <, <=, >, >=, =~(能被右侧模式匹配), !~(不能被右侧模式匹配), in
逻辑操作符:and, or, !
算术操作符:+, -, *, /, %, >>(右移位), <<(左移位)
变量的例子:
定义一个全局的软件包名变量,根据安装的软件包不同,直接修改变量值即可:
puppet中变量的种类:
自定义变量
facter变量:可直接引用;(每一个agent都要报告系统的属性以及各种硬件设备等信息给服务器端,服务器端把对应模板中引用的变量名都替换成客户端的属性值)
查看puppet支持的各facts:
facter -p
内置变量:
客户端内置:
$clientcert
$clientversion:客户端puppet版本号
服务器端内置
$servername:服务器名称
$serverip:服务器IP地址
$serverversion:服务器程序文件版本号
$module_name:模块名称
条件判断
if, case, selector, unless
if语句:
单分支:
if CONDITION {
...
}
双分支:
if CONDITION {
...
}
else {
...
}
CONDITION的用法:
1、比较表达式
2、变量引用
3、有返回值函数调用
if语句例子1:
if $processorcount>1 {
notice("SMP Host.") #notice是内置函数,给什么就输出什么
} else {
notice("Poor Guy.")
}
if语句例子2:
case语句:
case CONTROL_EXPRESSION {
case1, case2: { statement }
case3, case4, case5: { statement }
...
default: { statment }
}
CONTROL_EXPRESSION:表达式、变量、函数(有返回值);
case:
字符串,变量,有返回值函数,模式,default
case例子:
selector语句:
类似于case,但分支的作用不在于执行代码片断,而是返回一个直接值;
CONTROL_VARIABLE ? {
case1 => value1,
case2 => value2,
...
default => valueN
}
CONTROL_VARIABLE: 变量、有返回值的函数;但不能是表达式;
case:直接值(需要带引号)、变量、有返回值的函数、正则表达式模式或default
以上是关于puppet定义资源,配置语言的主要内容,如果未能解决你的问题,请参考以下文章