如何确保在执行Exec资源的命令之前重新启动服务?

时间:2017-04-07 16:43:54

标签: puppet

(更新)我在原始问题中遗漏了一行重要的代码。

我正在写一个创建本地存储的木偶模块。这种非自动化的方式是。

  1. 编辑/etc/multipath.conf文件
  2. 重新启动multipathd守护程序
  3. 执行pvcreate $ device
  4. 执行vgcreate $ volume_name $ device
  5. 因此,在我的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']
    

1 个答案:

答案 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,如果资源刷新发生,它将在该资源同步后立即发生 - 或者如果需要同步则立即同步。