仅提供一些详细信息 - 在 AWS 上构建,使用 Puppet 处理 DSC,引导 Puppet 以便进行配置,并在新配置的节点上安装 Puppet。
我现在使用 Puppet 已经有一段时间了,我发现自己想编写一个仅在创建虚拟机时执行的模块。
我的具体用例是,我想通过 Puppet 自动将防病毒软件(特别是趋势科技深度安全防护系统)安装到新配置的节点上。
运行此脚本只需要下载、运行和一些 TMDS 特定命令来激活自身等。
如果我使用 Puppet,它会在每次运行时执行此操作(下载、尝试安装、尝试激活),这绝对不是我想要的。
但是,我不认为 Puppet “了解”趋势科技,或者如何获取它,或者 URL 等。所以我不能使用类似的东西:
service { "trend micro":
ensure => running,
ensure => present,
}
做了一些研究,并查看 blog posts ,我知道我的代码结构应该类似于(我知道这是不正确的):
exec {'function_name':
# the script that downloads/installs/activates etc.
command => '/path/to/script.sh',
onlyif => systemctl service_trendmicro,
# which system should return 0 or 1 for pass/fail - I only want it to exec on 0 ofc.
}
因此,我的问题是:如何将它们组合在一起?
最佳答案
您可以使用 Puppet 来运行脚本,就像您正在做的那样。但是,如果您在没有 Puppet 的情况下运行脚本,您最终会遇到同样的问题:很难使它们具有幂等性,维护起来很烦人,并且无法移植到其他平台。
似乎有Chef cookbooks和 Ansible Playbooks由公司提供安装代理。这些应该能让您大致了解如何使用 Puppet。
通过查看 Ansible 剧本,可以很容易地将其转换为等效的 Puppet 代码:
exec {'download Trend RPM':
command => '/bin/wget https://app.deepsecurity.trendmicro.com:443/software/agent/RedHat_EL7/x86_64/ O /tmp/agent.rpm --quiet',
creates => '/tmp/agent.rpm',
}
->
package {'ds_agent':
ensure => 'installed',
provider => 'rpm',
source => '/tmp/agent.rpm',
}
~>
service {'ds_agent':
ensure => running,
enable => true,
}
我刚刚快速检查了 CentOS 7 虚拟机,它似乎对我有用:
Notice: Compiled catalog for centos7.vm in environment production in 1.06 seconds
Notice: /Stage[main]/Main/Exec[download Trend RPM]/returns: executed successfully
Notice: /Stage[main]/Main/Package[ds_agent]/ensure: created
Notice: /Stage[main]/Main/Service[ds_agent]/enable: enable changed 'false' to 'true'
Notice: /Stage[main]/Main/Service[ds_agent]: Triggered 'refresh' from 1 events
Notice: Applied catalog in 8.45 seconds
我建议查看现有的 Ansible 剧本并了解如何更改其余的设置步骤:https://github.com/deep-security/ansible/blob/master/playbook/
关于exec - 如果满足条件,如何运行 puppet exec?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35485372/