将 shell 脚本从 Puppet Master 复制到 Puppet Agent 并在 Puppet Agent 上执行

copy shell script from puppet master to puppet agent and execute it on puppet agent

我正在尝试将 shell 脚本从 Puppet Master 复制到 Puppet 客户端。

这是我的 shell 人偶大师脚本:

cat /etc/puppetlabs/code/environments/production/modules/mymodule/mybash.sh
echo hi hello

我也在 /home/myserver/mybash.sh 中复制了相同的 shell 脚本。

这是我在人偶大师上的 site.pp 文件:

cat /etc/puppetlabs/code/environments/production/manifests/site.pp

notify{"Message : I am a message from puppet master": }

class myfile {
  file { '/home/myserver/mybash.sh':
    mode   => '0755',
    owner  => 'root',
    source => 'puppet:///modules/mymodule/mybash.sh',
    notify => Exec['run_my_script'],
  }
  exec { 'run_my_script':
    command => '/home/npatel/mybash.sh',
  }
}
notify{"Message : new msg test": }

这是人偶代理的输出:

myclient:~$ sudo /opt/puppetlabs/bin/puppet agent --test
Info: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for myclient.test.com
Info: Applying configuration version '1483393652'
Notice: Message : I am a message from puppet master
Notice: /Stage[main]/Main/Notify[Message : I am a message from puppet master]/message: defined 'message' as 'Message : I am a message from puppet master'
Notice: Message : new msg test
Notice: /Stage[main]/Main/Notify[Message : new msg test]/message: defined 'message' as 'Message : new msg test'
Notice: Applied catalog in 0.20 seconds

看起来只有带有 notify{"Message : 的行在 Puppet 代理上执行,而不是它们之间的行。

我没有看到 mybash.sh 在文件部分提到的 /home/my-client 路径中被复制,并且也没有日志来确保文件是否被复制。

我是否遗漏了源值中的任何内容?

在 Puppet 中,定义 class 不会自动将其包含在配置中,它只是使其可用于声明。定义 class 类似于用 Ruby、Python 或 C 等语言定义函数。该函数仅在调用时有效。同样,Puppet class 定义在我们声明它们之前没有任何效果。

如果你想实际使用class,你可以使用include函数声明它。这告诉 Puppet 评估 class 并管理其中声明的所有资源。

除了include函数外,还可以使用resource-like class {'myfile':}语法。

所以在你的代码中,如果你想声明 class,你必须这样做:

/etc/puppetlabs/code/environments/production/manifests/site.pp

notify{"Message : I am a message from puppet master": }

class myfile {
  file { "/home/myserver/mybash.sh":
    mode   => '0755',
    owner  => 'root',
    source => 'puppet:///modules/mymodule/mybash.sh',
    notify => Exec['run_my_script'],
  }
  exec { 'run_my_script':
    command => '/home/npatel/mybash.sh',
  }
}

include myfile
notify{"Message : new msg test": }

我还建议将您的 class 代码直接放入模块清单中,然后将 class 包含在您的 site.pp 文件中:

/etc/puppetlabs/code/environments/production/modules/mymodule/init.pp

class myfile {
  file { "/home/myserver/mybash.sh":
    mode   => '0755',
    owner  => 'root',
    source => 'puppet:///modules/mymodule/mybash.sh',
    notify => Exec['run_my_script'],
  }
  exec { 'run_my_script':
    command => '/home/npatel/mybash.sh',
  }
}

然后在 site.pp 中声明 class:

node default {
  include myclass
}