设为首页 收藏本站
查看: 3300|回复: 0

[经验分享] puppet(三)语法和命令参数

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-2-5 08:46:46 | 显示全部楼层 |阅读模式
1.puppet的命名规则
1.1资源
每个资源的定义都具有标题、类型、以及一系列属性
资源的标题可以是任意字符,但对英文大小写敏感,通常受限于底层操作系统
每个资源类型都有可支持的属性列表,一般包括几个关键的属性和其他可选属性
大部分都是默认值
在引用资源之前需要为它定义好名称,以便其他资源进行引用,因此资源标题的定义显得尤为重要
puppet对每个资源具有唯一性,因此每个资源的名称必须唯一
通常我们用资源的功能去命名资源的名称
使用puppet管理nginx服务的主配置文件-nginx.conf,这时需要定义一个文件资源,其类型为file,通常称为file资源,可以讲资源命名为nginx.conf,并使用单引号引用起来
file{'nginx.conf':
ensure => file,
mode => '0640',
owner => root,
group => root,
}
1.2属性
每定义一个资源,都要定义它的属性,否则定义的资源也将失去意义。
通过上面的资源“nginx.conf”定义了4个属性,分别为:类型ensure、权限mode、用户owner及用户组group,文件资源类型可以是文件file或目录,下面的例子将定义一个类型为service的资源,采用subscribe属性将两个资源关联起来,这两个资源之间的关系是service["nginx"]依赖File["nginx.conf"],同时service类型的资源定义了两个其他属性值-hasrestart与hasstatus,这两个属性都为true
service{'nginx':
hasrestart => true,
hasstatus => true,
subscribe => File["nginx.conf"],
}
1.3类
通常类以应用名或作用名命名,比如应用软件nginx,apache和squid都可以
作用名crcaterepo(yum仓库)也可以是类名,定义两个资源File["nginx.conf"]和server["nginx"]组织成一个类
class nginx{
file{'nginx.conf':
mode => 640,
owner => root,
group => root,
        }

service{'nginx':
hasrestart => true,
hasstatus => true,
subscribe => File["nginx.conf"],
        }
}
1.4模块
当类比较多的时候,需要把类规范起来,采用模块的方式进行管理,如果将上面的代码中的nginx类组织成nginx模块并进行简单的扩展,可以通过tree命令查看nginx模块目录组织结构关系
tree /etc/puppet/modules/nginx
-README        #说明文档
-file                #file文件目录
        -welcome.conf
-manifests        #配置文件,init.pp通过require
        -conf.pp        #nginx::conf加载此配置文档
        -init.pp        #模块配置文件,引用子类
-templates
        -vhost.conf.erb        #主机模版
1.5节点
节点就是一个客户端,通常以主机名命名,节点上的内容为客户端配置文件集
包括定义节点名,加载模块名称,变量等相关信息,通常将节点存放在/etc/puppet/manifests/nodes目录中,并在站点管理(site.pp)中进行节点定义,以test.dimain.com.pp节点为例,其配置文件如下
cat /etc/puppet/manifests/nodes/test.domain.com.pp
node 'test.domain.com'{
        include nginx
        $vhost = 'linuxtone.org'
}
cat /etc/puppet/manifests/site.pp
import "nodes/test.domain.com.pp"

2.主机、模块和类的命名
定义主机的目的主要是方便阅读,也能一目了然知道这台主机的功能角色,在进行节点管理是可以根据主机名进行正则匹配等规则定义,puppet对于主机名没有明文的规则要求,通常建议主机名为字母、数字、句点、下划线、连字符,并且符合以下正则
/\A[a-z,0-9._-]+\Z/
为了方便我们通常约定,Amazon Web Service(AWS)的主机命名
ec2-174-129-158-192.compute-1.amazonaws.com
不难看出AWS是由角色、IP地址、计算机名组成,以amazonaws.com域名定义的
role-isp-idc-ip.centos.domain.com
角色-运行商-机房-ip.系统.域名
web-cnc-bj-174.129.158.192.centos.linuxone.org
2.1模块的命名
模块的命名应与类的命名规则保持一致,即必须用小写字母开头,可以包括小写母、数字、下划线、且应符合以下正则表达式
\A[az][a-z0-9_]*\Z
2.2类的命名
类的命名相对较简单,以应用名来命名最为直观,类名必须以小写字母开头,可以包括小写字母、数字、下划线、连字符,类名应符合如下表达式
\A[az][a-z0-9_]*\Z
如果两个相同的类连接在一起时是使用冒号(:)分隔符,通常将这些关联的类也称为子类,类名符合如下正则表达式
\A([az][a-z0-9_]*)?(::[az][a-z0-9_]*)*\Z
定义同类型的类,可以采用Class["nginx::install"]的方法,Class["nginx"::install]与Class["nginx"]层级相同,但功能不同,从命名上看Class["nginx::install"]是Class["nginx"]子类
Class nginx
Class nginx::install
Class nginx::config
nginx需要引用其子类时采用require enginx::install

3.资源、变量、参数和标签的命名
3.1资源的命名
资源的命名受限于底层系统
package{'nginx':}
service{'nginx':}
file{'nginx.conf':}
3.2变量的命名
变量以$开头
\A\$[a-zA-Z0-9_]+\Z
定义变量content,使用赋值运算符"="对变量赋值
$content = "some content \n"
指明作用域内合法的变量以$开头包括类名、双冒号(::)及本地作用域的变量名,经过定义后该变量只能在本作用域下引用,合格的作用域范围内的变量名应符合以下正则
\A\$([az][a-z0-9_]*)?(::[az][a-z0-9_]*)*::[a-zA-Z0-9_]+\Z
3.3参数的命名
以$开头,且第一个字符是小写字母,同样可以包含小写字母、数字、下划线,参数名应符合如下正则
\A\$[az][a-z0-9_]*\Z
3.4标签的命名
标签即Tag,系统管理员的工作中使用Tag做标记,可方便快速查找或定位,puppet资源中存有Tag的属性,提供标签功能
\A[a-z0-9_][a-z0-9_:\.\-]*\Z

4.puppet语法风格
以括号"{}"分类,以冒号":"声明,以逗号","属性结束
package {'nginx':
        ensure => present,
}
4.1间距、缩进和空白字符
puppet针对间距,缩进,空白字符及对齐方式的约定
必须使用两个空格表示缩进
不得使用文字制表符
尾部不能有空格
宽度不能超过80字符
使用=>符号进行对齐
4.2注释
puppet允许采用多种注释类型,但多数使用Bash的井号"#",因为它最为直观
4.3变量的引用
不包含变量的字符串应该使用单引号('')括起来,需要引用变量时应该使用双引号
字符串中的所有变量应该使用花括号"{}"括起来
(1)包含变量的字符串引用
"/etc/${file}.conf"
"${::operatingsystem} is not supported by ${module_name}"
(2)对变量本身的引用
变量本身的引用不需要引号
mode => $my_mode
4.4资源
puppet针对资源的语法规范比较多,可以归纳为如下几个方面
资源名
对齐方式
属性顺序
合并写法
符号链接
文件权限
资源默认值
(1)资源名
资源名采用单引号('')引起来,采用冒号(:)结尾,需要注意的是puppet同样也接受资源名采用双引号("")引起来的写法
package {'openssh': ensure => present}
package {"openssh": ensure => present}
(2)对齐方式
为了使代码更容易阅读,通常以最长参数为标准对齐
exec {'blah':
    path => '/usr/bin',
    cwd  => '/tmp',
}
(3)属性的顺序
但声明一个资源时,应该首先制定它的ensure属性,此规范仅仅是方便阅读
file {'/tmp/readme.txt':
    ensure => file,
    owner  => root,
    group  => root,
    mode   => '0644',
}
(4)多资源合并写法
puppet支持采用合并的方式对多个同类型资源进行处理,例如有多个文件需要同时使用exec资源时可以采用这种方式
file{'/tmp/a':
    content => 'a',
}
exec {'change content of a':
    command => 'sed -i.bak s/a/A/g /tmp/a'
}
file{'/tmp/b':
    content => 'b',
}
exec {'change content of b':
    command => 'sed -i.bak s/b/B/g /tmp/b'
}
(5)符号链接
符号链接又称为软连接,在配置符号链接时用File资源名称指定源文件的目录,用ensure指定资源的属性为link,用target指定目标文件
file {'/var/log/syslog':
    ensure => link,
    target => '/var/log/messages',
}
(6)文件权限
设置一个文件权限,将权限用单引号引起来
file{'/var/log/syslong':
    ensure => present,
    mode   => '0644',
(7)资源默认值
通常要设置一些资源默认值,为一组资源指定一个默认的参数值,以指定同样的属性值,这样可以减少这组资源每次都需要重复定义,资源默认值类似于全局变量,设置默认值时应该将资源类型的第1个字母大写,我们最常见的用法是使用exec资源指定,避免在以后使用命令时候找不到操作系统环境变量
file{
    mode  => '0644',
    owner => 'root',
    group => 'root',
}
4.5条件语句
(1)保持资源的声明
$file_mode = $::operatingsystem ? {
    debian => '0007',
    redhat => '0776',
    redora => '0007',
file {'/tmp/readme.txt':
    content => "Hello World\n",
    mode    => $file_mode,
}
}
变量$file_mode先对操作系统进行判断,因为不同的操作系统对应的文件权限不一样
(2)case语句配置的默认值
我们不知道所有模块能否在所有平台正常运行,通常会选择case语句,以此在资源定义时配置默认属性
case $::operatingsystem {
    centos:{
        $version = '1.2.3'
}
    solaris:{
        $version = '3.2.1'
}
default:{
    fail("Module $(module_name) is not supported on $(::operatingsystem)")
}
}
4.6类
类的命名采用应用名的约定方式,语法规则也非常简单,
文件名
内部组织结构
关系声明
类的继承
变量命名与格式
参数的显示顺序
(1)文件名
一个模块定义一个类,,它还有子类,文件命名方式是子类名.pp
/etc/puppt/modules/apache/manifests
init.pp
class apache{}
class apache::ssl{}
virtual_host.pp
define apache::virtual_host(){}
类的命名必须严格遵守puppet正则表达式的语法规则
\A([az][a-z0-9_]*)?(::[az][a-z0-9_]*)*\Z
(2)内部组织结构
(3)关系声明
两个资源直接的关系
Package['httpd'] -> Service['httpd']
(4)类的继承
类的继承目的主要是减少代码,对于同一个类,在不同的子类中进行引用,只需要采用类的继承关系即可,puppet中的类不支持多继承方式,通常集成应用于子类继承父类
class ssh {...}
class ssh::client inherits ssh {...}                #client子类继承ssh类
class ssh::server ingerits ssh {...}                #server子类继承ssh类
class ssh::server::solaris ingerits ssh::server {...}                #server子类的solaris继承server子类
(5)变量名称与格式
变量命名需要使用双冒号标注"::",变量的使用及作用域
$::operatingsystem
$foo_bar123
(6)类参数的显示顺序
一个类中使用用了多个变量,而不是所有变量都有赋值,应该将没有赋值的变量放在最前排,也就是所谓的第一行
class nginx {
    $servers,
    $options = "liuyu",
    $multicast = false
}{}
5.检查命令的用法
5.1语法检查
(1)创建一个init.d测试文件,测试文件包含对类名与资源名与资源名的语法检查
vim init.pp
class nginx {
    package {'nginx': ensure => present}
}
(2)执行语法检查命令
puppet parser validate init.pp
(3)将init.pp修改,将类名加上单引号,取消资源名的单引号,取消资源名nginx后台的冒号
vim init.pp
class 'nginx' {
        package { nginx ensure => "present" }
}
(4)测试语法
puppet parser validate init.pp
5.2代码调试
代码调试的目的是查找代码中的相关问题,梳理整段的逻辑,puppet各个步骤的输出结果是什么,可将结果打印在标准输出上,puppet使用notify资源实现代码调试功能,这种做法类似bash shell中的-x参数,我们通过增加logoutput属性的方法使puppet输出更多错误提示,此属性在puppet2.7和3.0中已经默认集成,先看下logoutput在2.6下的配置方法,我们先创建test_outout.pp测试文件
vim test_output.pp
exec {'test_logoutput':
        command => "/bin/ls linuxtone.org",
}
以上代码通过执行一条command命令,来查看本地目录是否存在‘linuxtone.org’文件,下面通过执行puppet apply test_output.pp命令查看执行结果
6.puppet命令详解
puppet提供大量命令来帮助我们进行有效的管理,puppet中所有命令都可以使用puppet help命令查看

agent        客户端进程,负责从master获取数据
apply        运行本地manifests
ca        本地证书的管理
catalog        编译、保存、查看puppet代码或转换成catalogs
cert        证书颁发、用于签署证书
certificate        提供访问CA证书的管理
certificate_request                管理证书请求
certificate_revocation_list        管理撤销证书的列表
config                配置选项
describe        资源帮助
device                管理远程网络设备
doc        生成puppet文档       
facts        系统信息检查
file        在filebucket中检索和存储文件
filebucket        在filebucket中检索和存储文件
help        查看帮助
inspect        发生report报告
instrumentation_data        管理监听的数据
instrumentation_listener                管理监听状态
instrumentation_probe        管理监听侦测
key        创建、保存、删除证书密钥
kick        远程控制agent,远程触发puppet agent命令
man        查看手册
master                服务端进程
module                从puppet forge创建、安装、查询模块
node        管理节点
parser                解析器管理
plugin                插件管理
queue                队列进程
report                创建、查看报告
resource        查看资源帮助
resource_type                查看类、默认资源类型与节点信息
secret_agent                模拟agent
status                查看puppet状态
常用的命令不是很多,功能分几大类
常用命令
puppet master
puppet agent
puppet cert
puppet kick
puppet apply
帮助
puppet doc
puppet help
puppet resource
puppet describe
puppet status
模块和不常用命令
puppet module
puppet device
puppet insoect
puppet filebucket
puppet queue
6.1puppet常用命令
6.1.1puppet master
puppet master
命令参数
--daemonize        -D发送到后台守护进程,默认选项
--no-daemonize        不发送到后台守护进程
--debug        -d 启动完整的调试模式
--help                -h 查看帮助
--logdest        -l 日志送发方式,默认采用syslog配置
--verbose        -v 显示详细信息
--version        -V 打印puppet版本
--compile        以json的方式输出编译的catalog
6.1.2
puppet agent
以守护进程的方式运行,通常30分钟向master请求一次
puppet agent命令用法
--certname        指定客户端certname,通常以域名命名
--daemonize        发送到后台守护进程
--no-daemonize        不发送到后台守护进程
--debug        启用完整的调试模式
--detailed-exitcodes        提供详细的退出代码
--digest        指定证书指纹算法,默认为MD5算法
--disabke        禁用,禁止puppet agent在此节点执行
--enable        启用,重新允许执行puppet agent
--fingerprint                显示当前证书的指纹
--logdest        日志送发方式,采用syslog配置
--no-client        不要创建客户端配置文件,当listen=true时才有意义
--noop                使用‘noop’模式,puppet运行catelog,但不执行配置
--onetime        运行一次,配合--no-daemonize使用
--serve        启动另一类型的服务
--test                测试,常用选择
--verbose        显示详细信息
--version        打印puppet版本
--waitforcert                当master未签署此节点证书时,puppet agent将等待签署,并默认每2分钟重新连接master以确认是否完成签署
puppet agent最常见的用法是使用“--noop”参数,此方法可以用于检测puppet配置,运行catalog但不执行配置,相当于试运行模式
6.1.3
puppet apply
puppet apply是puppet运行命令,主要在检测manifests时或在没有网络连接的情况下使用,不同于puppet agent,puppet apply在运行时不会连接master
puppet apply命令参数详解
--debug        启用完整的调试模式
--detailed-exitcodes        提供详细的退出代码
--help                帮助
--loadclasses                加载任何已保存类
--logdest        日志送发方式,采用syslog配置
--noop                使用‘noop’模式,puppet运行catalog,但catalog并不生效
--execute        执行命令中知道的puppet代码
--verbose        显示详细信息
--catalog        运行puppet master采用--compile输出json代码
6.1.4
puppet cert
用于管理本地证书、查看未签名证书、签署证书、废除证书、清除证书
命令参数
clean        清除用于清除证书
fingerprint        打印证书指纹
generate        生成客户端证书
list        查看认证客户列表
print        打印主机证书的全文信息
revoke                废除已认证的主机
sign        签署认证
verify                验证本地指定的认证
puppet cert命令参数
--all        执行所以操作
--digest        设置证书指纹加密的方式
--debug        启用完整的调试模式
--help                查看帮助
--verbose        显示详细信息
--version        显示版本


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-42000-1-1.html 上篇帖子: linux下用puppet搭建lamp和lnmp 下篇帖子: CentOS6.6+Puppet3.7.4分布式部署Nagios监控系统
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表