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定义资源,配置语言的主要内容,如果未能解决你的问题,请参考以下文章

Puppet自动化管理

自动化运维---puppet入门

PUPPET基础

Puppet之基础篇

puppet

puppet