从puppet master到puppet agent复制shell脚本并在puppet agent上执行它

时间:2017-01-02 21:58:22

标签: puppet

我正在尝试将一个shell脚本从puppet master复制到puppet客户端。

这是我在puppet master上的shell脚本:

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

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

这是我在puppet master上的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 :的行在木偶代理上执行,而不是在它们之间的行。

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

我错过了源代码中的任何内容吗?

1 个答案:

答案 0 :(得分:2)

在Puppet中,定义一个类并不会自动将它包含在一个配置中,它只是使它可以被声明。定义类类似于在Ruby,Python或C等语言中定义函数。该函数仅在调用时才起作用。同样,Puppet类定义在我们声明它们之前不会产生任何影响。

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

include函数外,还可以使用类似资源的 class {'myfile':}语法。

因此,在您的代码中,如果您要声明该类,则必须执行以下操作:

/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": }

我还建议您直接将类代码放入模块清单中,然后在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

中声明该课程
node default {
  include myclass
}