我想让 puppet 在执行任何类型的更改之前运行特定的命令。我知道prerun_command主 puppet.conf中的选项,但这不是我要找的。我希望命令仅在某些事情即将发生变化时运行,而不是在每次木偶运行时运行。
这是场景。假设我在负载均衡器后面有一堆 Web 服务器。然后我希望 puppet 更新网站文件。但是为了防止出现某些文件已更新而其他文件未更新以及混合版本导致问题的问题,我想将服务器从负载平衡器池中取出。
我可以编写一个脚本,运行时会告诉负载平衡器从池中删除该框。然后人偶可以进行更改,并postrun_command在完成后用于将盒子放回池中。但是我需要一种方法来运行该脚本以从池中删除服务器。
我能想到的唯一解决方案是在盒子上保留 2 个文件副本。一个临时副本,当 puppet 更新它时,使用通知操作触发删除脚本,然后从临时位置复制到实时位置。但我希望有一些更通用的东西可以处理正在执行的任何更改(升级包,重新启动服务,创建用户,任何事情)。
当尝试使用复制到 Puppet 模块目录中的模块时,我的 Puppet 客户端返回“无法从远程服务器检索目录:服务器上的错误 400:连接到 Puppet 主服务器时无法在字符串中转换 nil”错误。
[root@puppetmaster modules]# rpm -qa *puppet*
puppet-2.7.18-1.el6.noarch
puppet-server-2.7.18-1.el6.noarch
[root@puppetmaster modules]# uname -sr
Linux 2.6.32-279.el6.x86_64
Run Code Online (Sandbox Code Playgroud)
代码全部签出且有效。SELinux 已开启。
我想使用 puppet(例如 my.cnf)向节点服务器提供“默认示例”配置文件,但我希望允许服务器管理员根据需要更新它。(基本上,我向 IT 研究人员提供“基础”虚拟机,他们自己进行调整)
我尝试使用 puppet 函数“文件”,但是当我尝试更改它时它注意到了......
有解决办法吗?
如何访问人偶清单中数组的元素,即创建 for/while 循环?假设我在我的 nodes.pp 中有
Name [ 'testserver', 'floor1', 'floor3' ],
Run Code Online (Sandbox Code Playgroud)
如何迭代它,以便在定义文件资源时可以迭代每个并确保每个元素都存在正确的文件资源?
谢谢丹
在当前版本的 Puppet 和 Facter 中,我得到了相同的信息lsbdistid和operatingsystem事实——我不看,osfamily因为在 Gentoo Linux 上它报告一个通用的“Linux”字符串。
在 Puppet 模块中使用该信息时(例如,用于选择要安装的软件包名称)是否有任何技术原因或已建立的共识来使用lsbdistid或operatingsystem?
我正在尝试在公司防火墙外的某些服务器上运行 puppet,而 puppetmaster 则在防火墙内。说服公司 IT 为我打开端口 8140 将是极其困难的——如果不是不可能的话——那么我有什么选择来让它工作?
我有一套用于我们的服务器的通用木偶配方。木偶管理的文件之一是/etc/crontab包含原始cron.daily,cron.weekly和cron.monthly条目。
/etc/crontab这里的公共文件的问题是所有的 cronjobs 在我们所有的服务器中都在完全相同的时间运行。例如,每日备份消耗了我们所有的备份服务器资源,因为所有服务器都在同时提供它。
在服务器之间随机化每天/每周/每月运行的确切分钟数的首选方法是什么,同时仍然保持所有服务器之间的木偶配方通用?
我一直在考虑几种不同的选择:
sleep与$RANDOM实际工作之前。这样,crontab每个主机中的时间都会相似,但运行每日/每周作业的确切时间会有所不同。即使在同一服务器内部也会有变化(例如,每天的运行间隔可能在 23-25 小时之间变化)。at+“基于主机名的整数”分钟运行所有作业。有点hacky,但可能会工作......我们要做的是为 iptables 生成防火墙规则(puppetlabs/firewall)。我们的节点在概念上是这样分组的:
-- site1
---- shared1
------ specific1
------ specific2
---- shared2
------ specific3
------ specific4
Run Code Online (Sandbox Code Playgroud)
节点“specific4”将始终需要访问“shared2”上的端口 8080 和“site1”上的端口 10000。“specific1”同样需要访问“shared1”上的8080。每个节点的规则总是相同的,但它们将取决于它们属于哪个组。
我正在努力寻找一种方法来在 hiera 中不重复地表示这一点。是否可以从完全独立的节点获取事实?
我想我希望能够做这样的事情(简化):
--
hosts:
host specific4:
rules:
rule:
port: 8080
ip: get_ip(get_my_shared())
Run Code Online (Sandbox Code Playgroud)
但显然,您不能从yaml文件中调用函数。最好的方法是使用自定义事实吗?我还没有真正使用过 hiera - 所以我不确定最佳实践和什么不是。任何朝着正确方向的温和推动将不胜感激。
编辑:
这是我采用的解决方案,但如果我可以使用导出的资源,我可以消除对 puppetdb-query 的依赖。
# helper for creating rules from an array
define firewall_rules($port, $service_type) {
$source = $name
firewall { "$port $service_type $source":
proto => 'tcp',
dport => $port,
state => 'NEW',
source => "$source",
action => 'accept' …Run Code Online (Sandbox Code Playgroud) 我在同一台机器上安装了 puppet master 和 agent。当客户端启动时,我收到以下错误消息。
puppet agent --server=agent.com --no-daemonize --debug
err: Could not retrieve catalog from remote server: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed. This is often because the time is out of sync on the server or client
Run Code Online (Sandbox Code Playgroud) puppet ×10
linux ×5
puppetmaster ×2
cron ×1
facter ×1
hiera ×1
open-source ×1
selinux ×1
ubuntu-12.04 ×1