1. 程式人生 > >Puppet 之 模板和模塊

Puppet 之 模板和模塊

puppet 模塊 模板

1 概述


模板文件是在puppet模塊下面templates目錄中以”.erb”結尾的文件,puppet模板主要用於文件,例如各種服務的配置文件,相同的服務,不同的配置就可以考慮使用模板文件。

模塊是Puppet自包含的代碼和數據集合。絕大多數的清單都可以放到模塊中,唯一的例外是manifests下的主清單site.pp,包含站點級和節點級的代碼。

本文將結合例子介紹如何使用模板和模塊


2 模板


2.1 概念介紹


puppet模板是采用erb模板語言,embedded ruby來創建

puppet兼容的erb語法鏈接:https://docs.puppet.com/puppet/latest/reference/lang_template_erb.html

定義模板文件放置的路徑

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

#註意,content要根據template來處理

文本文件/PATH/TO/ERB_FILE中內嵌變量替換機制:這個格式要註意,如下:

<%= @VARIABLE_NAME %>

2.2 例子


例1 配置nginx模板

準備nginx配置模板,修改nginx配置的work_processes為變量

vim  nginx.conf.erb
worker_processes <%= @processorcount %>;

定義類

vim nginx.pp
class nginx {
    package{'nginx':
        ensure => latest;
    } ->
    file{'/etc/nginx/nginx.conf':
        ensure => file,
        content => template('/root/nginx.conf.erb'),
    } ~>
    service{'nginx':
        ensure => running,
    }   
}
include nginx

執行腳本

puppet apply nginx.pp

例2 配置redis從節點

修改從的redis配置文件為模板文件,註意,用class來傳遞變量,調用類

vim redis_slave.pp
class redis {
    package{'redis':
        ensure => latest,
    }   
    service{'redis':
        ensure => running,
        enable => true,
        hasrestart => true,
        restart => 'service redis restart',
        require => Package['redis'],
    }   
}
class redis::slave($masterip,$masterport='6379') inherits redis {
    file{'/etc/redis.conf':
        ensure => file,
        content => template('/root/puppet/redis.module/redis-slave.conf.erb'),
        owner => redis,
        group => root,
        require => Package['redis'],
    }   
    Service['redis'] {
        restart => 'systemctl restart redis.service',
        subscribe => File['/etc/redis.conf'],
    }   
}
class{'redis::slave':
        masterip => '172.18.50.73';
}

修改配置文件為模板

vim redis-slave.conf.erb
slaveof <%= @masterip %> <%= @masterport %>

執行該腳本

puppet apply redis_slave.pp

3 模塊


3.1 概念介紹


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

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/:

tempate('MOD_NAME/TEMPLATE_FILE_NAME')

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

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

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

註意:

1、puppet 3.8及以後的版本中,資源清單文件的文件名要與文件子類名保持一致,例如某子類名為“base_class::child_class”,其文件名應該為child_class.pp;

2、無需在資源清單文件中使用import語句;

3、manifests目錄下可存在多個清單文件,每個清單文件包含一個類,其文件名同類名;

puppet config命令:

獲取或設定puppet配置參數;

puppet config print [argument]

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

puppet config print modulepath

set更改參數的值,以下命令更改後直接保存在配置文件裏

例子

puppet config set server master.sunny.com

查看配置文件/etc/puppet/puppet.conf ,[main]段多了如下一行

server = master.sunny.com

模塊放置路徑:/etc/puppet/modules

要共享自己編寫的模塊,可以放到puppet forge上,這個網站:https://forgeapi.puppetlabs.com是用來存放模塊

如在Puppet Forge中搜索redis模塊

puppet module search redis


3.2 例子 開發redis模塊


參加模塊相關目錄,註意路徑結構

mkdir -pv /etc/puppet/modules/redis/{manifests,files,templates,lib,spec,tests}

建議先在其他路徑下,如/root下創建一個modules模塊,等模板都編輯完成後在拷貝到/etc/puppet/modules下。

mkdir -pv /root/modules/redis/{manifests,files,templates,lib,spec,tests}

把靜態文件放到files裏,模板文件(erb格式)放到templates裏

cp /root/puppet/redis.module/redis-master.conf /root/modules/redis/files/

cp /root/puppet/redis.module/redis-slave.conf.erb /root/modules/redis/templates/

在manifests下定義和模塊名同名的類,在init.pp裏,同時定義master.pp和slave.pp的子類,模塊方式註意文件的路徑的定義有簡化的

格式 和絕對路徑兩種,因為在模塊下,文件放置的路徑是固定的,所以,用相對路徑就可以查找到配置文件模板的路徑

source 定義模板的路徑

source => 'puppet:///modules/MOD_NAME/FILE_NAME',

例子

source => 'puppet:///modules/redis/redis-master.conf',

等價於寫絕對路徑

source => '/etc/puppet/modules/redis/files/redis-master.conf',

content定義模板的路徑

格式 content => template('MOD_NAME/ERB_FILE')

例子

content => template('redis/redis-slave.conf.erb'),

等價於寫絕對路徑

content => template('/etc/puppet/modules/redis/templates/redis-slave.conf.erb'),
vim /root/modules/redis/manifests/init.pp
class redis {
    package{'redis':
        ensure => latest,
    }   
    service {'redis':
        ensure => running,
        enable => true,
        hasrestart => true,
        restart => 'service redis restart',
        require => Package['redis'],
    }   
}
vim /root/modules/redis/manifests/master.pp
class redis::master inherits redis {
    file{'/etc/redis.conf':
        ensure => file,
        source => '/etc/puppet/modules/redis/files/redis-master.conf',
        owner => redis,
        group => root,
        require => Package['redis'],
    }   
    Service['redis']{
        restart => 'systemctl restart redis',
        subscribe => File['/etc/redis.conf'],
    }   
}

#slave配置文件,這裏利用變量來傳遞參數

vim /root/modules/redis/manifests/slave.pp
class redis::slave($masterip,$masterport='6379') inherits redis {
    file{'/etc/redis.conf':
        ensure => file,
        content => template('/etc/puppet/modules/redis/templates/redis-slave.conf.erb'),
        owner => redis,
        group => root,
        require => Package['redis'],
    }   
    Service['redis']{
        restart => 'systemctl restart redis',
        subscribe => File['/etc/redis.conf'],
    }   
}

#註意修改配置文件如下

vim  /root/modules/redis/templates/redis-slave.conf.erb
slaveof <%= @masterip %> <%= @masterport %>

#目前目錄結構如下

[root@CentOS7C modules]#tree

.

└── redis

├── files

│ └── redis-master.conf

├── lib

├── manifests

│ ├── init.pp

│ ├── master.pp

│ └── slave.pp

├── spec

├── templates

│ └── redis-slave.conf.erb

└── tests


文件都準備完成後,把redis整個模塊放到對應的軟件指定的目錄/etc/puppet/modules/下

cp -r /root/modules/redis/ /etc/puppet/modules/

測試

查看模塊

[root@CentOS7C ~]#puppet module list
/etc/puppet/modules
└── redis (???)
/usr/share/puppet/modules (no modules installed)

redis模塊後面顯示為???,為redis的相關元數據信息,用來描述模塊的,但是顯示異常,忽略該情況

聲明類

為哪個主機調用這個類,這裏演示為當前主機調用,沒有跨主機

註意,調用是指明類名,而不是指明模塊

測試調用基類

puppet apply -v --noop -d --test -e "include redis"

測試調用子類,註意slave子類有變量,需要傳遞值

puppet apply -v --noop -d --test -e "include redis::master"
puppet apply -v --noop -d --test -e "class {'redis::slave': masterip => '172.18.50.73', masterport => '6379',}"

執行

puppet apply  -e "include redis::master"
puppet apply  -e "class {'redis::slave': masterip => '172.18.50.73', masterport => '6379',}"


Puppet 之 模板和模塊