(更新)我在原始问题中遗漏了一行重要的代码。
我正在写一个创建本地存储的木偶模块。这种非自动化的方式是。
因此,在我的puppet模块中,如果/etc/multipath.conf文件发生更改,我想确保multipathd守护程序重新启动。所以我用这种方式写了我的木偶清单。
Service['multipathd'] -> Anchor['create_storage_volume::begin']
...
file { '/etc/multipath.conf':
ensure => file,
content => template( 'local_storage::hadoop/multipath.conf.erb' ),
owner => 'root',
mode => '0600',
notify => Service['multipathd'],
} ->
service { 'multipathd':
enable => true,
ensure => running,
}
anchor { 'create_storage_volume::begin': } ->
exec { "pvcreate ${device}":
path => ['/usr/sbin', '/bin'],
unless => "pvs | grep ${"volume_name},
} ->
exec { "vgcreate ${volume_name} ${device}":
path => ['/usr/sbin', '/bin'],
unless => "pvs | grep ${"volume_name},
} -> # -> do nova config stuff
anchor { 'create_storage_volume::end': }
...
我的问题是,"以上代码是否保证在执行pvcreate和vgcreate命令之前多路径守护进程重新启动"?我是否需要添加更多资源订单,例如......
Service['multipathd'] -> Anchor['local_storage::begin']
答案 0 :(得分:3)
我的问题是,"以上代码是否保证在执行pvcreate和vgcreate命令之前多路径守护进程重新启动"?
没有。 Service['multipathd']
和Exec["pvcreate ${device}"]
都将在File['/etc/multipath.conf']
之后应用,但您所提供的服务和执行的相关应用顺序中没有任何内容。
我可能会这样写,而不是:
file { '/etc/multipath.conf':
ensure => file,
content => template( 'local_storage::hadoop/multipath.conf.erb' ),
owner => 'root',
mode => '0600',
} ~>
Service['multipathd'] ->
exec { "pvcreate ${device}":
path => ['/usr/sbin', '/bin'],
unless => "pvs | grep ${"volume_name},
} ->
# ...
注意使用the notifying chain operator;这是Puppet语言中较少使用的功能。
关于问题的更新,在应用Service
之前刷新Exec
的关键要求是两者之间存在排序关系,无论是直接关系还是传递关系。在修改过的问题中,所涉及的资源已经存在这种关系。
原始答案确实掩盖了这里的一个优点,我在评论中提到了这一点:当资源刷新相对于其他任何事情发生时,Puppet实际上没有明确记录。记录的语义对此有一些影响,但没有给出确定的规则。在实践中,通过Puppet 4,如果资源刷新发生,它将在该资源同步后立即发生 - 或者如果需要同步则立即同步。