Puppet:依赖链没有按顺序执行

Puppet: Dependency chain not getting executed in order

我有一个问题,我试图设置外部事实,然后复制一个模板文件,该文件填充了来自 hiera yaml 文件的值。模板文件依赖于由外部事实文件设置的某些事实(例如模板文件的所有者和组)。下面是傀儡代码。

    file {['/etc/facter/','/etc/facter/facts.d']:
            ensure => directory,
            owner => 'root',
            group => 'root',
            mode => '0755',
    }

    file {"/etc/facter/facts.d/domain_facts.sh":
            ensure => present,
            owner => 'root',
            group => 'root',
            mode => '0755',
            source => $::hostname?{
                    'hostname1' => 'puppet:///modules/vfecare/hostname1.sh',
                    },
            require => File['/etc/facter/','/etc/facter/facts.d'],
    }

    file {"/tmp/testing123":
            ensure => present,
            owner => "${::remoteuser}",
            group => "${::remotegroup}",
            content => template("vfecare/testscript.erb"),
            require => File["/etc/facter/facts.d/domain_facts.sh"]
    }

但是在执行过程中,我看到模板首先被复制到 puppet 代理机器上,并且由于模板有一些它需要从外部事实文件中获取的值,它找不到并抛出错误 "Invalid owner and group value".

以下是外部事实文件的内容

#!/bin/bash

echo "remoteuser=tempuser"
echo "remotegroup=tempuser"

为什么 puppet 似乎忽略了这里的依赖循环?

在执行包含您的文件资源的目录之前,代理会在 Puppet 运行 开始时收集事实。无法在 运行 期间部署外部事实并像这样使用它,因为事实将丢失。

相反,您需要依赖 Puppet 的 "pluginsync" 机制,该机制在收集事实之前将外部事实从 master 复制到代理。

将模块中的vfecare/files/hostname1.sh事实文件移动到vfecare/facts.d/hostname1.sh,移除你拥有的/etc/facter文件资源并复制外部事实,然后重新运行中介。它应该首先下载 hostname1.sh 事实文件,然后使用 remoteuser/group 值正确评估 /tmp/testing123 文件资源。

有关详细信息,请参阅 Auto-download of agent-side plugins 上的文档。