puppet語法和命令詳解

puppet-intro

puppet命令詳解

使用puppet help 來查看命令幫助

puppet語法

Usage : puppet <subcommand> [options] <action> [optins]

子目錄的查看幫助語法是
'puppet help <subcommand> <action>' for help on a specific subcommand action
'puppet help <subcommand>'for help on a specific subcommand

查看所有可用的資源類型
puppet describe --list

manifest

puppet的程序文件叫做manifest,以.pp作爲文件後綴名

  • puppet語言核心是’資源定義’ , 定義一個資源核心就在於描述目標狀態
  • manifest實現了常見的程序邏輯,如條件語句,資源集合等
  • manifest定義resource

“puppet apply”子命令能將一個manifest中描述的目標狀態強制實現

資源定義

syntax

every resource has a type , a title , and a set of attributes

type {'title':
    attribute => value,
}

示例

user {'puppet':
    ensure  =>present,
    gid     =>'666',
    uid     =>'666',
    shell   =>'/bin/bash',
    home    =>'/home/puppet',
    managehome  =>true,
}

注意:

  • 在定義資源類型時必須使用小寫字符,

  • 資源名稱僅是一個字符串,但是要求在同一個類型中必須唯一

    比如,可以用名字叫nginx的service資源和package資源,但是在package類型的資源中只能有一個名叫nginx

  • puppet resource 命令可以交互式查找和修改puppet資源

資源類型

group

​ manage group

​ 使用puppet describe group 命令來獲取幫助

attribute:

​ name:組名,可以不寫,不寫的話就默認title是組名

​ gid:GID

​ system:是否是系統組

​ ensure:目標狀態 present/absent

​ members:成員用戶

user

​ manage users

​ 使用puppet describe user 命令來獲取幫助

attribute:

​ name:用戶名,不寫則title默認就是用戶名

​ ensure:present/absent

​ uid

​ gid

​ groups:附加組,不能包含基本組

​ comment:註釋

​ expiry:過期時間

​ home:家目錄

package

​ manage packages

attribute:

​ ensure:installed , present , latest , absent

​ name:包名

​ source:程序包來源,一般是已經自己搞好的rpm或者dpkg

service

​ manage running services

attribute:

​ ensure:stopped(also called ‘false’) , running(also called ‘true’)

​ enable:true/false/manual

​ name:

​ path:

​ restart

file

manages files,including their content , ownership , and permissions

attribute:

​ ensure:present , absent , file , directory , link

​ file:普通文件,內容由content屬性生成或者複製source屬性文件路徑來創建

​ link:符號鏈接文件,必須由target屬性指明鏈接的目標文件

​ directory:目錄 , 同通過source指向的路徑複製生成,recurse屬性指明是否遞歸複製

​ path:路徑

​ source:源文件

​ content:文件內容

​ target:符號鏈接的目標文件

​ owner:屬主

​ group:屬組

​ mode:權限

​ atime/ctime/mtime:時間戳

示例:

file{'test.txt';
    path        =>'/tmp/test.txt',
    ensure      =>file,
    content     =>"hello world",
    owner       =>'nginx',
    mode        =>0664
    source      =>'/etc/fstab',
}
file{'test.symlink';
    path        =>'/tmp/test.symlink',
    ensure      =>link,
    target      =>'/tmp/test.txt',
    require     =>File['test.txt'],
}

exec

user/group:運行命令的用戶身份

path

onlyif:指定一個命令,此命令執行成功,當前命令才能運行

unless:指定一個命令,此命令運行失敗,當前命令纔會運行

refresh:重新執行當前command的替代命令

refreshonly:僅接收到訂閱的資源的通知纔會運行

cron

command:要執行的任務

ensure:present/absent

hour:

minute:

monthday

month

weekday:

user

target:添加爲哪個用戶的任務

name:cron job的名稱

notify

attribute:

​ message:信息內容

​ name:信息名稱

特殊資源命令

Name/Namevar

  • most types have an attribute whith identifies a resource on the target system
  • this is referred to as the ‘namevar’ , and is often simply called ‘name’
  • namevar values must be unique per resource type , with only rare exceotions(such as exec)

ensure

  • ensure =>file 存在且爲一個普通文件
  • ensure =>directory 存在且爲一個目錄
  • ensure =>present 存在,可通用於上述描述情況
  • ensure=>absent 不存在

資源間的次序

puppet提供了before,require,notify,subscribe來定義資源間的相關性

資源的引用通過”Type[‘title’]”的方式進行,如User[‘nginx’]

比如

user{'redis':
    ensure      =>present,
    gid         =>800,
    uid         =>800,
    system      =>true,
}

group{'redis';
    ensure      =>present,
    gid         =>800,
    system      =>true,
    before      =>User['redis'],
}

puppet variable

$variable_name=value

  • puppet的變量名稱必須以$開頭,賦值操作符爲=

  • 任何正常數據類型的值都可以賦值給puppet中的變量

  • puppet的每個變量都有兩個名稱:簡短名稱和長格式完全限定名稱(FQN),完全限定名稱的格式爲”$scope::variable”

    scope是一個特定代碼區域,用於同程序中的其他代碼隔離開來

    在puppet中scope可用於限定變量和資源默認屬性的作用範圍,但是不能用於限定資源名稱和資源引用的生效範圍

    如果要訪問非當前scope中的變量,則需要通過完全限制名稱進行,如vhostdir= apache::params::vhostdir

    top scope的名稱爲空,因此如果要引用其變量,則需要使用類似”$::osfamily”的方式進行

數據類型

  • 字符型:引號可有可無,單引號是強引用,雙引號是弱引用
  • 數值型:默認均識別爲字符串,僅在數值上下文才以數值對待
  • 數組:[]中以逗號分隔元素列表
  • 布爾型值:true false,不加引號
  • hash:{}中以逗號分隔k/v數據列表,鍵爲字符型,值爲任意puppet支持的類型,鍵值之間以”=>”分隔
  • undef:未賦值型

正則表達式

(?:)

(?-:)

​ OPTIONS

​ i:忽略字符大小寫

​ m:把.當作換行符

​ x:忽略中的空白字符

operators

comparison operators

  • ==(equality)
  • !=(non-equality)
  • <(less than)
  • >(greater than)
  • <=(less than or equal to)
  • >=(greater than or equal to)
  • =~(regex match)
  • !~(regex non-match)
  • in

boolean operators

  • and
  • or
  • !(not)

arithmetic operators

  • +(addition)
  • -(subtraction)
  • /(division)
  • *(multiplication)
  • >> (right shift)
  • <<(left shift)

if語句

if CONDITIONS{

​ statement,

​ ….

}

condition的給定方式

  • 變量
  • 比較表達式
  • 有返回值的函數

比如

if $osfamily=~/(?-mx:debian)/{
    $webserver='apache2'
}else{
    $webserver='httpd'
}

case語句

case CONTROL_EXPRESSION{

​ case1:{….}

​ case2:{….}

​ ….

​ default:{….}

}

control_expression

  • 變量
  • 表達式
  • 有返回值的函數

各case的給定方式

  • 直接字符串
  • 變量
  • 有返回值的函數
  • 正則表達式模式
  • default

比如

case $osfamily{
    "RedHat":{$webserver='httpd'}
    /(?i-mx:debian)/:{$webserver='apache2'}
    default:{$webserver='httpd'}
}

selector語句

CONTROL_VARIABLE?{

​ case1 =>value1,

​ case2 =>value2,

​ …

​ default =>valueN,

}

control_variable的給定方法

  • 變量
  • 有返回值的函數

各case的給定方法

  • 直接字串
  • 變量
  • 有返回值的函數
  • 正則表達式模式
  • default

比如

$pkgname=$opratingsystem?{
    /(?i-mx:(ubuntu|debian))/   =>'apache2',
    /(?i-mx:(redhat|fedora|centos))/  =>'httpd',
    default                     =>'httpd',
}

puppet中的類

類:puppet中命名的代碼模塊,常用於定義一組通用的目標資源,可在puppet全局調用

類可以被繼承,也可以包含子類

語法格式

class NAME{
    ...puppet code...
}

class NAME(parameter1,parameter2){
    ....puppet code....
}

類代碼只有聲明之後纔會執行,調用方式

  • include CLASS_NAME1,CLASS_NAME2,…

  • class{‘CLASS_NAME’:

    ​ attribute =>value,

    }

示例

class apache2{
    $pkgname=$opratingsystem?{
    /(?i-mx:(ubuntu|debian))/   =>'apache2',
    /(?i-mx:(redhat|fedora|centos))/  =>'httpd',
    default                     =>'httpd',
}

    package{"$webpkg":
        ensure =>installed,
    }

    file{'/etc/httpd/conf/httpd.conf':
        ensure      =>file,
        owner       =>root,
        group       =>root,
        source      =>'/tmp/httpd.conf',
        require     =>Package["$webpkg"],
        notify      =>Service['httpd'],
    }

    service{'httpd':
        ensure      =>running,
        enable      =>true,
    }
}

include apache2

示例2

class web($webserver='httpd'){
    package{"$webserver":
        ensure      =>installed,
        before      =>[File['httpd.conf'],Service['httpd']],
    }

    file{'httpd.conf':
        path        =>'/etc/httpd/conf/httpd.conf',
        source      =>'root/manifests/httpd.conf',
        ensure      =>file,
    }

    service{'httpd':
        ensure      =>running,
        enable      =>true,
        restart     =>'systemctl restart httpd.service',
        subscribe   =>File['httpd.conf'],
    }
}

class{'web':
    webserver   =>'apache2',
}

類繼承的方式

class SUB_CLASS_NAME inherits PARENT_CLASS_NAME{
    .....puppet code...
}

在子類中爲父類的資源新增屬性或者覆蓋指定的屬性的值

Type['title']{:
    attribute       =>value,
    ...
}

比如
class nginx::proxy inherits nginx {
    Service['nginx']{
        subscribe       =>File['nginx-proxy.conf'],
    }

puppet模板

erb 模板語言 embedded ruby

puppet的erb語法

https://docs.puppet.com/puppet/latest/reference/lang_template_erb.html

文本文件中內嵌變量替換機制

<%= @VARIABLE_NAME %>

file{'title':
    ensure      =>file,
    content     =>template('/PATH/TO/ERB_FILE'),
}

示例
file{'nginx.conf':
    path        =>'/etc/nginx/nginx.conf',
    ensure      =>file,
    content     =>template('/root/manifests/nginx.conf.erb'),
    require     =>Package['nginx'],
}

模塊就是按照一個約定的預定義的結構存放了多個文件或子目錄的目錄,目錄裏的這些文件或者子目錄必須遵照一定的格式命名規範

puppet會在配置的路徑下查找所需要的模塊

MODULES_NAME:

​ manifests/

​ init.pp

​ files/

​ templates/

​ lib/

​ spec/

​ tests/

模塊名只能以小寫字母開頭,可以包含小寫字母,數字和下劃線,但是不能使用”main”和”settings”

manifests/

​ init.pp:必須一個類定義,類名稱必須與模塊名稱相同

files/:靜態文件

​ puppet URL

​ puppet:///modules/MODULE_NAME/FILE_NAME

templates/

​ template(‘MOD_NAME/TEMPLATE_FILE_NAM’)

lib/:插件目錄,常用於存儲自定義的facts以及自定義類型

spec/ 類似於tests目錄,存儲lib/目錄下插件的使用幫助和範例

tests/ 當前模塊的使用幫助或使用範例文件

puppet config命令

​ 獲取或設定puppet配置參數

​ puppet config print [argument]

​ puppet查找模塊文件的路徑:modulepath

puppet config print modulepath ,

可以指定自己要的路徑,比如:

puppet apply --modulepath=/root/dev/modules -e "include::server"

模塊更多的語法可以用puppet help module

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章