私は同様の投稿を見ました here が、それは解決しません
意図は、エージェントノードにbashスクリプトをコピーして実行することです。
SLES11SP4-118:~ # cat /etc/puppet/manifests/site.pp
node default {
include base
}
node 'sles11sp4-170.dev.insiteone.com' {
class {'base':}
}
class base {
exec { "remove yum":
command => 'zypper removerepo 1',
logoutput => 'true',
path => '/usr/bin/'
}
exec { "add yum":
command => 'zypper addrepo -f http://10.156.14.121/repo/RPMS/QA/ QA',
logoutput => 'true',
path => '/usr/bin/'
}
file {
'my_expect_script':
ensure => 'present',
source => "puppet:///modules/raj/myexpect.sh",
path => '/tmp/',
owner => 'root',
group => 'root',
mode => '0744',
notify => Exec['run_my_script'],
}
exec {
'run_my_script':
command => '/tmp/myexpect.sh',
refreshonly => true,
}
}
/etc/puppet.conf内
SLES11SP4-118:~ # vim /etc/puppet/puppet.conf
[main]
dns_alt_names=puppet,puppet.dev.insiteone.com
server=puppet.dev.insiteone.com
modulepath=/etc/puppet/modules
ディレクトリがパペットサーバーに存在することを確認しました:
SLES11SP4-118:~ # puppet config print modulepath
/etc/puppet/modules:/usr/share/puppet/modules
SLES11SP4-118:~ # ls /etc/puppet/modules/raj/
myexpect.sh
SLES11SP4-118:~ # ls /usr/share/puppet/modules/raj/
myexpect.sh
エラー(puppet apply /etc/puppet/manifests/site.pp --debug):
err: /Stage[main]/Base/File[my_expect_script]: Could not evaluate: Could not retrieve information from environment production source(s) puppet:///modules/raj/myexpect.sh at /etc/puppet/manifests/site.pp:31
notice: /Stage[main]/Base/Exec[run_my_script]: Dependency File[my_expect_script] has failures: true
warning: /Stage[main]/Base/Exec[run_my_script]: Skipping because of failed dependencies
最初の2人のexecは正常に機能します(yumを削除して、yumを追加します)
Tim Stoop(コメントで指摘)に感謝します。そのため、ある場所にファイルを追加してソースを追加するときはいつでも、それらを「ファイル」ディレクトリ内に配置する必要があります。さらに重要なのは、ソースでファイルディレクトリに名前を付けないようにすることです。
私のソースのように:source => "puppet:///modules/raj/myexpect.sh"
なので、実際のファイルは/etc/puppet/modules/raj/files
にある必要があります
これはパペットのドキュメントで言及されています: https://docs.puppet.com/puppet/4.9/modules_fundamentals.html#files
(@Tim Stoopがコメントで上記を指摘するまで、私はそれを完全に見逃していた。
次に、files
モジュールのパスが正しくありませんでした。ファイル名を含むパス全体をそこに置く必要があります。パペットがensure => 'present'
を使用すると、ファイルが作成されていない場合でも、そこにファイルが存在することを確認できます。
したがって、path => /tmp/myexpect.sh
は正しいです。
正しいマニフェスト全体を以下に示します。
SLES11SP4-118:~ # cat /etc/puppet/manifests/site.pp
node default {
include base
}
node 'sles11sp4-170.dev.insiteone.com' {
class {'base':}
}
class base {
exec { "remove yum":
command => 'zypper removerepo 1',
logoutput => 'true',
path => '/usr/bin/'
}
exec { "add yum":
command => 'zypper addrepo -f http://10.156.14.121/repo/RPMS/QA/ QA',
logoutput => 'true',
path => '/usr/bin/'
}
file {
'my_expect_script':
ensure => 'present',
source => "puppet:///modules/raj/myexpect.sh", # Make sure file is in /etc/puppet/modules/raj/files
path => '/tmp/myexpect.sh',
owner => 'root',
group => 'root',
mode => '0744',
notify => Exec['run_my_script'],
}
exec {
'run_my_script':
command => '/tmp/myexpect.sh',
refreshonly => true,
}
}