web-dev-qa-db-ja.com

puppetでファイルを追加し、実行後に削除します

Puppetの実行中にのみ存在するはずのpuppetを含むファイルを追加したいと思います。

Puppetの実行中にaptがサービスを開始する(失敗する)のを防ぐために、ファイルがそこにある必要があります。

これは、同じファイルの宣言が重複しているために機能しない、これまでのクラスです。

# Opensips package install
class opensips::package {
  case $::osfamily {
    'Debian' : {
      file { 'opensips-enable-apt-policy':
        ensure  => 'present',
        path    => '/usr/sbin/policy-rc.d',
        mode    => '0755',
        content => "#!/bin/sh
echo \"All runlevel operations denied by puppet module ${module_name}\" >&2
exit 101
",
      } ->
      package { $opensips::opensips_debs: ensure => $opensips::package_ensure, } ->
      file { 'opensips-disable-apt-policy':
        ensure => 'absent',
        path   => '/usr/sbin/policy-rc.d',
      }

    }
    default  : {
      fail("Unsupported OS: ${::osfamily}")
    }
  }
}

これにより、目的の最終状態がわかりますが、要約すると次のようになります。

  • ファイルを作成します/usr/sbin/policy-rc.d上記の内容で
  • パッケージインストールを実行します
  • ファイルを削除します

これを最善/最も簡単な方法で行うにはどうすればよいですか?

エージェントはDebianJessieで、puppetバージョン3.8.1を実行します

ファイル宣言の成功にaliasメタパラメータを設定しようとしました。

1

残念ながら、これはPuppetが機能するように設計されている方法ではありません。Puppetは、インタラクティブに実行されるスクリプトではなく、既知のシステム状態を強制します。

必要なことを行う1つの方法は、execリソースを使用してファイルを追加/削除し、ローカルにデプロイされた「ソース」を使用することです。

例(完全ではない、機能しない可能性があります):

class opensips::package {
  file { '/path/to/tmp/file.ext':
    ensure  => 'present',
    mode    => '0755',
    source  => 'puppet:///modules/opensips/myfile',
  }

  exec { 'deploy_opensips-enable-apt-policy':
      command => '/bin/cp /path/to/tmp/file.ext /path/to/real/file.ext',
      creates => '/path/to/real/file.ext',
      before  => Package[$opensips::opensips_debs],
      require => File['opensips-enable-apt-policy'],
  }

  package { $opensips::opensips_debs:
    ensure => $opensips::package_ensure,
    notify => Exec['remove_opensips-enable-apt-policy'],
  }

  exec { 'remove_opensips-enable-apt-policy':
      command     => '/bin/rm /path/to/real/file.ext',
      refreshonly => true,
  }
}
1
Craig Watson