我正在使用以下用户资源创build一个unix用户,然后为用户设置一个初始密码。 然后我用chage命令执行一个exec来强制用户在第一次login后更改他的密码。清单如下
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参数后,validation了
密码没有变成默认密码,也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'],
将password属性传递给user资源不是必需的。 如果你没有提供密码,我相信puppet会将其禁用,但是你需要testing。 我知道如果你不提供密码,那么木偶不会更改现有帐户的密码。
我没有一个环境来testing,但我相信你可以有你的用户资源,创build帐户没有密码,然后有一个通知,通知执行一些像usermod -p '$1$T7iMiuVY$bVjrtyWV4diXBKlCgcDKT0'或某事。
@Zama问:考虑到你的问题,我面对的问题与你在第3点中提到的改变用户资源中的任何属性完全相同,exec资源没有得到执行,应该按照我们的想法。 但是,问题是你和我把错误的东西放在exec资源中的“通知/订阅”键。 像这样想,如果在用户资源中有任何属性被改变,那么它应该“通知”exec资源来执行。 不是吗? 而不是相反。 看看我的清单如下:
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资源执行。
如果我们把“notify”放在exec资源中,不pipe你在用户资源中改变了什么,exec资源都不会执行。 这一切都取决于你在哪里指定“通知”。 提示:您希望改变的资源,在那里申请通知。 希望这个概念清楚。
关于你的第三个问题:看看我的清单。