puppet使用ENC (external node classifier)

1780阅读 0评论2016-08-27 expert1
分类:系统运维

   最近体验了一把puppet 4.6,变化蛮大,也更加的合理了,初略看了下,

  1.  除了最早被deprecate的import, 现在node的inherits也没了。  2. auth.conf也要换位置,可以从/var/log/puppetlabs/ 的日志看到。
  3. 新目录结构为:etc/puppetlabs/puppet/ puppet 和/etc/puppetlabs/code,
  4.  而且environment设置从puppet.conf去掉了,当然你不在puppet.conf配置的话。现在在/etc/puppetlabs/code/environments/production/environment.conf,
  5. puppet.conf只有4个section,main/master/agent/user。6,现在用的是jruby,所以优化的话JVM的HEAP的设置就比较重要了。

  以上都是题外话,现在来说ENC, 一般来说,某个node需要安装那些module, 都在site.pp来指定,比如:

  1. #ste.pp
  2. node 'web01.xxx.com' {
  3.  include web
  4. }
    当然node还可以用正则表达式regexp来匹配,比如 /^web\d+\.xxx.com/ 匹配web01, web02...等。看起来也蛮合理,ENC也没存在的必要啊。当然你机器不多,而且FQDN命名很规则的确可以。 但机器多了,一个个在site.pp写,的确费时费力,而且机器下线了或者另作他用,site.pp维护起来就很麻烦了。ENC就是取代site.pp而生。

如何配置? 在puppet.conf上添加
[master]
node_terminus = exec
external_nodes = /etc/puppetlabs/enc.rb   #enc.rb是我的脚本名字

脚本可以任选,只要返回标准的yaml含有classes/environment/parameters3个即可,注意传入参数是agent的FQDN, 而site.pp可以分别从 , 和www来匹配(strict_hostname_checking=true 则只让site.pp接受FQDN)。当然你可以用ldap/和mysql等,把信息存到db,然后脚本查询,这样可以跟cmdb结合起来了。

  1. #!/usr/bin/env ruby

  2. require 'yaml'
  3. node = ARGV[0]

  4. # agent's FQDN : ${app}.${env}.${Location || IDC}.xxx.com, e.g web01.prod.bjcnc.xxx.com

  5. if node =~ /(^[a-zA-Z]+)(\d+)\.(\S+)\.(\S+)\.(\S+)\.(\S+)$/

  6.     hostname = $1
  7.     env = $3
  8.     config = YAML.load_file('/etc/puppetlabs/defaults.yaml')[env]
  9.     print YAML.dump(config.fetch(hostname))
  10.     exit 0

  11. else

  12.     config = YAML.load_file('defaults.yaml')
  13.     print YAML.dump(config.fetch('base'))
  14.     exit 0

  15. end
# defaults.yaml, 定义了environment/classes, 其中classes可以带参数,用于parameterized class, 不知道这个是啥,得自己看看资料了。

  1. ---
  2. base:
  3.   classes:
  4.     vim:
  5.     telnet:
  6.   environment: production
  7.   parameters:


  8. production:
  9.   web:
  10.     classes:
  11.       nginx:
  12.       puppetdb::master::config:
  13.         password: fake
  14.         users:
  15.           alex:
  16.             home: /home/alex
  17.             uid: 502
  18.           jane:
  19.             home: /home/jane
  20.             uid: 201
  21.     environment: production
  22.     parameters:
  23.       location: beijing
  24.   
  25.   
  26.   db:
  27.     classes:
  28.       puppetdb:
  29.       puppetdb::master::config:
  30.     environment: production
  31.     parameters:
 ./enc.rb web01.production.bjcnc
---
classes:
  nginx:
  puppetdb::master::config:
    password: fake
    users:
      alex:
        home: /home/alex
        uid: 502
      jane:
        home: /home/jane
        uid: 201
environment: production
parameters:
  location: beijing

注意,classes下参数的是node scope, 而parameter是top scope, 跟facter一样,所以建议少用parameter,本来其值也是可选的。

上一篇:terraform 创建AWS EC2/puppet/zabbix的repo
下一篇:puppet:define + ENC + Hiera实现apache的Vhost