首页 > 解决方案 > Puppet 独立错误 - 未知资源类型:'testme_service::install'

问题描述

我对 puppet 很陌生,我正在测试 puppet 角色和配置文件策略(在 puppet 独立模式下),但我遇到了一个错误。

我构建了一个最小的可重现示例来说明这个问题。此示例的目的只是确认 /tmp 中的文件。

我开始测试:


但是,当我运行该命令时,我不断收到一条错误消息:
Error: Evaluation Error: Error while evaluating a Resource Statement, 
Unknown resource type: 'testme_service::install' (file: 
/opt/puppetlabs/puppet/modules/profile/manifests/init.pp,
line: 3, column: 5)`

好消息是我正在执行角色代码,它引用回配置文件定义。

但是,我不明白那个Unknown resource错误,因为我已经testme_service::installtestme_service模块中定义了。

这可能是一个 PEBKAC 问题,但我不明白如何修复该错误(puppet 的目录对我来说仍然有点神奇)。

问题

我在 Ubuntu 18 上运行 puppet5.5 ......有人可以给我一些关于如何解决问题的指示,并解释如果我错误地构建了这个角色和配置文件测试我应该做什么?

概述:目录结构

ubuntu@test-04:/opt/puppetlabs/puppet/modules$ pwd
/opt/puppetlabs/puppet/modules

ubuntu@test-04:/opt/puppetlabs/puppet/modules$
ubuntu@test-04:/opt/puppetlabs/puppet/modules$ tree
.
├── profile
│   ├── data
│   ├── files
│   ├── manifests
│   │   ├── init.pp
│   │   └── site.pp
│   └── templates
├── README.md
├── role
│   ├── data
│   ├── files
│   ├── manifests
│   │   └── init.pp
│   └── templates
└── testme_service
    ├── data
    ├── files
    ├── manifests
    │   └── init.pp
    └── templates

15 directories, 5 files
ubuntu@test-04:/opt/puppetlabs/puppet/modules$

文件内容:

profile/manifests/init.pp

class profile::testme_service {

    testme_service::install { "install the testme_service config in /tmp":
      version => '0.0.1-foo-the-bar',
    }

}

profile/manifests/site.pp

node /^test-04/ {
    include profile::testme_service
}

node default {
  fail("Hit the default node in profile... could not find the correct per-node profile")
}

role/manifests/init.pp

class role::testme_service {

  include profile::testme_service

}

testme_service/manifests/init.pp

# implement testme_service::install
class testme_service::install (
  String $version = '__broken_default__',
) {

  file { '/tmp/testme.conf':
    ensure  => file,
    owner   => 'root',
    content => "version: $version",
  }

}

标签: puppet

解决方案


解决方案 A:调用testme_service::install不同的方式profile

  • profile/manifests/init.pp
class profile::testme_service {
    class { "testme_service::install":
      version => '0.0.1-foo-the-bar',
    }
}

解决方案 B:有效,但同事不鼓励这种解决方案......

  • 使用define ...代替class ...intestme_service/manifests/init.pp也解决了问题......
# implement testme_service::install
define testme_service::install (
  String $version = '__broken_default__',
) {

  file { '/tmp/testme.conf':
    ensure  => file,
    owner   => 'root',
    content => "version: $version",
  }

}

推荐阅读