我使用以下用户资源创建unix
用户,然后为用户设置初始密码。然后我执行了 exec with chage 命令,强制用户在首次登录后更改密码。清单如下
node 'node2.example.com','node3.example.com'{
user {
'askar':
ensure => 'present',
managehome => 'true',
comment => 'Laskar Home',
home => '/home/askar',
shell => '/bin/bash',
expiry => '2016-04-22',
password => '$1$T7iMiuVY$bVjrtyWV4diXBKlCgcDKT0',
password_min_age => '20',
password_max_age => '60',
}
exec {
'chage':
path => '/usr/bin/',
command => 'chage -d 0 askar',
}
}
上述清单的问题是,每次代理拉取清单时,密码都会再次设置为默认密码,然后迫使用户更改密码。
因此,为了避免这种情况,我添加了refreshonly
如下参数
exec {
'chage':
path => '/usr/bin/',
command => 'chage -d 0 askar',
subscribe => File['askar'],
refreshonly => true,
}
}
然后我验证了应用该refreshonly
参数后,
密码不会更改为默认密码,也chage
不会exec
被执行。但我对 refreshonly 参数的工作方式有一些疑问,我不确定它是否适合我。
1) 由于refreshonly
是exec
参数,因此在内部使用它exec
不会导致chage -d 0 askar
执行,除非资源清单发生变化user
。我说得对吗?这是否也意味着user
资源也不会exec
因为refreshonly
参数而执行,这意味着用户密码不会设置为user
资源中定义的默认值?
2) 我现在尝试更改,password_min_age => '20' to password_min_age => '30',
因为这是清单中的更改user
,我预计exec
资源将通过命令执行chage
,并且用户将被迫更改密码。但我没有看到此更改。我的理解错了吗?
3) 或者我定义参数的方式refreshonly
本身是错误的。语法应该 subscribe => User['askar'],
是subscribe => File['askar'],
答案1
@Zama Ques:考虑到您的问题,我遇到了与您在第 3 点中提出的完全相同的问题,即更改用户资源中的任何属性,执行资源都不会得到执行,而根据我们的想法,它应该得到执行。但是,问题是您和我在执行资源中放置“通知/订阅”键时做错了。这样想,如果用户资源中的任何属性发生变化,那么它应该“通知”执行资源以执行。不是吗?而不是相反。看看下面的清单:
user { "john" :
ensure => 'present',
uid => '502',
password => '$1$3uCLHGag$TVHLvE9T14XVSYoKA4YlH1' ,
managehome => 'true',
notify => EXEC['password change']
}
exec { 'password change' :
command => 'chage -d 0 john' ,
path => '/usr/bin',
refreshonly => 'true'
}
~ ~ 当我将密码更改为时"$1$QmJsatk6$4B.7Ksj5D608SHb/qVscM0"
,它会通知 exec 资源执行。
如果我们将“通知”放在 exec 资源中,则无论你在用户资源中更改什么,exec 资源都不会执行。这完全取决于你在哪里指定“通知”。提示:你希望更改的资源,请在那里应用通知。希望这能让你清楚概念。
对于您的第三个问题:请查看我的清单。
答案2
无需将属性传递password
给资源。如果您不提供密码,我相信 puppet 会将其禁用,但您需要进行测试。我知道如果您不提供密码,那么 puppet 不会更改现有帐户的密码。user
我没有可以测试的环境,但我相信您可以拥有一个无需密码即可创建帐户的用户资源,然后发出通知,通知执行人员执行类似操作usermod -p '$1$T7iMiuVY$bVjrtyWV4diXBKlCgcDKT0'
或其他操作。