AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 57164
In Process
niXar
niXar
Asked: 2009-08-22 06:32:26 +0800 CST2009-08-22 06:32:26 +0800 CST 2009-08-22 06:32:26 +0800 CST

Puppet:在班级之间共享信息

  • 772

我认为在 Puppet 中(还)没有正确的方法来执行以下操作,但这让我觉得很可取。

我希望我的类能够影响另一个类的模板文件的内容,这样我们既可以避免重复信息,又可以将信息放在它所属的位置。

例如,我们有一个“iptables”类和各种服务类,例如“postfix”、“webappfoo”等。

class webappfoo {
     $myfwrules +> [ "-A INPUT -p tcp --state NEW -m tcp --dport 80 -j ACCEPT" ]
     include apache
}

node webappserver {
     include webappfoo
     include iptables
}

但这不起作用;$myfwrules 数组只包含 webappfoo 中的那一行。

请注意,一个类可以读入另一个类;例如这里 iptables 可以只读取 $iptables::myfwrules; 但我不希望 iptables 必须了解 webappfoo。

puppet configuration-management
  • 4 4 个回答
  • 1766 Views

4 个回答

  • Voted
  1. markdrayton
    2009-08-22T13:26:55+08:002009-08-22T13:26:55+08:00

    这是一个范围界定问题。从语言教程:

    类、组件和节点引入了一个新的范围。Puppet 目前是动态作用域的,这意味着作用域层次结构是根据代码的评估位置而不是代码的定义位置创建的。

    所以$myfwrules被限定在它定义的类中。在你的情况下,你将它限定在 classwebappfoo中,它不知道任何先前定义的$myfwrules。您可以避开这一点,但更好的方法可能是使用定义。像这样的东西(未经测试,YMMV等):

    class iptables {
      define rule($rule) {
        # $title is the 'name' of the resource, like ntpd in service { "ntpd": }
        exec { "rule-$title":
          command => "/sbin/iptables $rule"
        }
      }
    }
    
    class webappfoo {
      include iptables
      iptables::rule { "webappfoo":
        rule => "-A INPUT -p tcp --state NEW -m tcp --dport 80 -j ACCEPT"
      }
    }
    
    class postfix {
      include iptables
      iptables::rule { "postfix":
        rule => "-A INPUT -p tcp --state NEW -m tcp --dport 25 -j ACCEPT"
      }
    }
    
    node foo {
      include webappfoo
      include postfix
    }
    

    这样,您就有了一种可重用的方式来将规则添加到您的类中,而无需定义变量和担心范围。你最终会得到一堆代表 node规则集的Exec资源 ( Exec["rule-webappfoo"], )。Exec["rule-postfix"]foo

    另请参阅现成的 iptables 模块。

    编辑:这只是演示如何使用定义的示例。这并不意味着是没有问题的解决方案。首先,可能应用规则的顺序(可能使用before/ after)以及/sbin/iptables每次调用的效率存在一些问题。

    • 3
  2. robbyt
    2009-09-09T22:20:06+08:002009-09-09T22:20:06+08:00

    我决定使用模板和多重连接来构建 iptables 规则。例如

    define iptables::rules {
      file { "$local_rules_file":
        ensure  => "file",
        content => template($iptables_start, "iptables/iptables.$name.erb", $iptables_stop)
      }
    }
    

    它并不漂亮,它需要为每台计算机提供一个专用的 iptables.hostname.erb 文件。但这很简单。

    还阅读了 Puppet 的存储配置和多个文件连接。

    • 1
  3. Jmarki
    2009-08-22T10:10:51+08:002009-08-22T10:10:51+08:00

    我有一段时间没有接触 puppet,所以我的语法可能有点生疏。“+>”应该是“+=”吗?无论如何,你试过这个吗?

    类 webappfoo {
        包括阿帕奇
    }
    类 webappfoo::myfwrules {
        $webappfoo_myfwrules = [“-A INPUT -p tcp --state NEW -m tcp --dport 80 -j ACCEPT”]
    }
    节点 webappserver {
        包括iptables
    
        $webapplist = ["webappfoo", "webappbar"]
        $webappserver_myfwrules => $iptables::iptables_myfwrules
    
        $webappserver_myfwrules += $webapplist ?{
             webappfoo => $webappfoo::myfwrules::webappfoo_myfwrules,
             webappbar => $webappbar::myfwrules::webappfoo_myfwrules,
        }
    }
    
    • 0
  4. niXar
    2009-08-22T14:52:56+08:002009-08-22T14:52:56+08:00

    这个 iptables 模块似乎是做我想做的唯一方法;它基本上是一个脚本,它获取 iptables.d/ 目录中的文件并从中构建 /etc/sysconfig/iptables 。这可能是我要使用的;但我觉得这种模式在Puppet本身应该是可以实现的。

    • 0

相关问题

  • 如何修复 Puppet 完全限定的参数路径错误?

  • puppet:修改配置文件后强制重启服务

  • 木偶模块资源

  • puppetrun 不报告客户端错误

  • 傀儡主机名问题

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve