puppet使用erb统一修改配置文件的功能疑问
本帖最后由 lklkxcxc 于 2014-12-05 10:36 编辑node1 puppet客户端的user配置文件如下:
test1:
admin = false
histsize = 5
histexpire = 13
minlen = 8
minalpha = 1
minother = 1
maxrepeats = 8
mindiff = 1
test2:
admin = false
histsize = 5
histexpire = 13
minlen = 8
minalpha = 1
minother = 1
maxrepeats = 8
mindiff = 1
node2 puppet客户端的user配置文件如下:
test1:
admin = false
histsize = 5
histexpire = 13
minlen = 8
minalpha = 1
minother = 1
maxrepeats = 8
mindiff = 1
造成user文件内容不一样,是因为node1系统上比node2上多建了一个test2用户,所以node1主机user配置文件多了一项test2用户的配置。这边有很多node puppet客户端节点而且每个节点上的用户不尽一样导致每个puppet客户端系统上的user配置文件内容也有差别。如果单独去为每个puppet客户端做个erb不现实也达不到自动配置的效率。现在想通过一个erb修改所有node节点主机的user配置文件。但是由于erb是统一模板,会导致所有主机的user配置文件一样,不知道我现在说明白没?
比如将user配置文件中所有用户的 minlen = 8修改为 minlen = 6,该怎么做,其它的参数不变,要求最终node1节点的user配置文件如下:
test1:
admin = false
histsize = 5
histexpire = 13
minlen = 6
minalpha = 1
minother = 1
maxrepeats = 8
mindiff = 1
test2:
admin = false
histsize = 5
histexpire = 13
minlen = 6
minalpha = 1
minother = 1
maxrepeats = 8
mindiff = 1
node2的user配置文件如下:
test1:
admin = false
histsize = 5
histexpire = 13
minlen = 6
minalpha = 1
minother = 1
maxrepeats = 8
mindiff = 1
其实这个用shell可以进行全文替换,不知道puppet有没有类似的功能 本帖最后由 rdcwayx 于 2014-12-05 17:06 编辑
/etc/puppet/modules/users 模块格式:$ tree
.
├── manifests
│ └── params.pp
├── templates
│ └── user.erb
└── test
└── init.pp三个文件的内容:$ cat manifests/params.pp
class users::params {
file { '/tmp/user.conf':
ensure => file,
content => template('users/user.erb')
}
}
$ cat templates/user.erb
<% @users.each do |user| -%>
<%= user%>:
admin = false
histsize = 5
histexpire = 13
minlen = 8
minalpha = 1
minother = 1
maxrepeats = 8
mindiff = 1
<% end -%>
$ cat test/init.pp
node 'server1' {
$users = ['user1','user2','user3']
include users::params
}
node 'server2' {
$users = ['user1']
include users::params
}
node default {
$users = ['user1','user2']
include users::params
}你可以用下面的命令直接测试:cd /etc/puppet
puppet apply --modulepath modules modules/users/test/init.pp你会看到有个/tmp/user.conf 的文件,里面就有你需要的内容。
如果你要修改参数,直接改 user.erb 文件即可。 本帖最后由 rdcwayx 于 2014-12-05 17:09 编辑
模块文件已经上传,但是为啥看不见呢?
其文件代码是:663913 本帖最后由 lklkxcxc 于 2014-12-08 10:00 编辑
rdcwayx看到了谢谢!想了解的是puppet有没有内部函数可以直接获取user列表 回复 7# lklkxcxc
用puppet 就不要偷懒了,毕竟自动化上已经省很多时间了。 写代码还是要会写一些的。
本帖最后由 lklkxcxc 于 2014-12-12 13:19 编辑
回复 8# rdcwayx
node 'mon.test.cn'{
$users = exec { "cat /etc/passwd|awk -F : 'BEGIN{ORS=","}{print $1}'":
path => ["/usr/bin", "/usr/sbin"],
logoutput => true }
include security::params
}
打算通过上述命令获取users列表,语法上一直报错:
puppet parser validate site.pp
Error: Could not parse for environment production: Syntax error at '}{print '; expected '}' at /etc/puppet/manifests/site.pp:4 回复 9# lklkxcxc
明白你的意思了。将 erb改成:<% File.open("/etc/passwd","r").each_line do |line| -%>
<% vars=line.split(":")%>
<%= "#{vars}" %>:
admin = false
histsize = 5
histexpire = 13
minlen = 8
minalpha = 1
minother = 1
maxrepeats = 8
mindiff = 1
<% end -%>
node 的 manifest文件改成 (也就是不需要手工给user賦值了,erb文件会自动去/etc/password里找的。node 'mon.test.cn'{
include security::params
} 回复 10# rdcwayx
我可不可以理解puppet当中要插入ruby代码就用<% %>引用起来执行就可以了
回复 11# lklkxcxc
差不多, puppet 有个inline_template() 的功能就可以实现这个。 但是通常我喜欢指向一个单独的erb文件
页:
[1]