📜  什么是 Puppet 领域特定语言?

📅  最后修改于: 2021-10-19 06:00:17             🧑  作者: Mango

Puppet 是一个开源配置管理自动化工具。 Puppet 允许系统管理员将基础设施作为代码输入,使用 Puppet 描述语言而不是使用任何定制的和单独的脚本来这样做。这意味着万一系统管理员错误地更改了机器的状态,此时 puppet 可以支持更改并保证框架返回到所需的状态。传统方法将要求系统管理员登录到每台机器以执行框架组织分配,但这不能很好地扩展。

木偶建筑

Puppet 使用客户端/服务器模型。服务器被称为傀儡大师。 Puppet Master 为客户端存储配方或清单(包含资源和所需状态的代码)。客户端称为 Puppet 节点并运行 Puppet 代理软件。该节点运行一个 puppet 守护进程(代理)以连接到 puppet master。这些节点将从 puppet master 下载分配给节点的清单,并在需要时应用配置。

人偶是如何工作的?

Puppet 运行从节点而不是主节点开始。此运行使用 SSL 服务在节点和主节点之间来回传递数据包。节点运行 factor 命令来收集有关系统的信息。然后将这些事实发送给主人。

一旦 master 收到事实,它会编译一个目录,描述节点中每个资源的状态。主节点比较每个节点的主机名并将其与特定节点配置匹配,或者如果节点不匹配则使用默认配置。目录编译完成后,傀儡师将其发送到节点。 Puppet 将在节点上应用目录,确保系统处于所需状态。

木偶积木

  1. 资源 – Puppet 有许多内置资源,如文件、用户、包和服务。傀儡语言允许管理员独立管理系统资源,确保系统处于理想状态。资源的示例是包、服务、通知、用户、执行等等。 puppet resource_type命令列出了 Puppet 主机上的可用资源类型。 resource_type 的语法如下:
    resource_type { 'resource_title':
      attr1 => value1,
      attr2 => value2,
      attr3 => value3,
      ...
      attrN => valueN,
    }
    

    资源减速从声明资源的类型开始。 Puppet 有许多内置的资源类型,如文件、用户、包和服务。资源类型后跟大括号(大括号),其中包括资源标题和值/属性对列表。资源标题是用单引号括起来的刺。冒号分隔符用于分隔资源图块和属性/值对列表。

    每个资源都有其属性,也称为参数。例如,文件具有路径、所有者、组、确保和模式等属性。这些属性被定义为使用 => 运算符的值。例如,所有者的值可以是 root 或创建文件的用户帐户。此外,文件的模式可以是 750 或 777,具体取决于文件所需的权限类型。

    资源标题

    应极其谨慎地定义资源标题。标题通知 Puppet Compiler 有关要对其执行操作的资源。多个相似的“资源标题”可能具有相同的属性。在这种情况下,它们可以组合在一个资源定义中。一个类似的例子如下所示

    file { [ '/etc/firewalld',
             '/etc/firewalld/helpers',
             '/etc/firewalld/services',
             '/etc/firewalld/ipsets' ]:
      ensure => 'directory',
      owner  => 'root',
      group  => 'root',
      mode   => '750',
    }
    
    
    
    

    以下示例显示了 firewalld 服务的声明。

    service { 'httpd':
      ensure => 'running',
      enable => true,
    }
    

  2. Puppet Manifests—— Puppet Manifests 是用 Puppet DSL 编写的文本文档,用于描述主机系统的最终状态。它可以使用任何文本编辑器和它的扩展名 .pp 扩展名创建。下面的 noalice.pp 将确保 Puppet 从系统中删除一个名为 alice 的帐户。
    [root@master ~]# vim alice.pp
    [root@master ~]# cat noalice.pp
    user {'alice':
      ensure => 'absent',
    }
    
  3. Puppet Classes – Puppet Classes 有助于确保 Puppet 资源定义可以变得更加健壮和可重用,以便它们可以应用于多个主机。 Puppet 类通常用于定义实现服务或运行应用程序所需的所有资源。下面的例子演示了类的语法
    class class_name ($param = 'value') {
      resource definitions...
    }
    

    以下示例演示了一个名为 test 的类

    class test {
      user { 'master':
        ensure  => 'present',
        home    => '/home/master',
        shell   => '/bin/bash',
      }
    
      file { '/home/master':
        ensure  => 'directory',
        owner   => 'master',
        group   => 'master',
        mode    => '0770',
        require => User['master'],
      }
    
      package { 'httpd':
        ensure  => 'present',
      }
    
      service { 'httpd':
        ensure  => 'running',
        enable  => true,
        require => Package['httpd'],
      }
    
    }
    include test # include is a function that is used to call the class test in the manifest
    

    include命令在清单中用于使用类。它类似于在编程语言中调用先前定义的函数

  4. Puppet模块 – Puppet 模块是一种Puppet 清单和相关文件打包到单个文件中的方法。该模块是一个具有既定层次结构的 tar 存档。
    Puppet 模块为 Puppet 代码和它们包含的相关文件提供了一个标准的、可预测的目录结构。
    下面列出了模块层次结构中一些基本或最常用的目录:
    • Manifests 目录包含模块中定义的所有 puppet 清单。
    • 文件目录包含静态文件
    • lib/factory 目录包含自定义事实定义
    • 测试目录包含用于测试模块提供的功能的清单。

    Puppet DSL 简写

    如果资源定义块中的属性以分号而不是逗号结尾,则可以指定另一个标题后跟冒号和属性/值对列表。以下示例显示了如何实现。

    file {
      '/etc/vmrc':
        ensure => 'directory',
        owner  => 'root',
        group  => 'root',
        mode   => '755';
     
      '/etc/rc.d/init.d':
        ensure => 'directory',
        owner  => 'root',
        group  => 'root',
        mode   => '755';
    }
    
    

    人偶功能

    在 master 上的目录编译期间,会调用称为函数的插件。当人偶清单调用函数,它会返回一个值或进行一些修改目录的更改。

    函数的代码是用 Ruby 编写的,它执行许多操作以生成最终值。这些函数执行以下任务:

    • 评估模板
    • 进行数学计算
    • 修改目录

    Puppet 包含许多内置函数。自定义函数也可以在模块中组合和使用。

    用于内置自定义函数的语法如下:

    function ::() >>  {
      ... body of function ...
      final expression, which will be the returned value of the function
    }
    

    一些内置函数是模板、警报、包含、映射等等。

    语句函数

    语句函数是一组仅用于修改目录的内置函数。内置的语句函数是:

    • 目录语句,如包含、要求、包含和标记
    • 记录语句,如调试、信息、通知、警告、错误。
    • 失败语句,如失败。

    函数调用

    以下语法用于调用函数。

    function_name(argument, argument, ...) |$parameter, $parameter, ...| { code block }
    
    
    • 该函数名是函数的全名。
    • 用于包含参数列表的左括号。 (使用像 include 这样的语句函数时不需要括号)。在所有其他情况下,它需要。要了解什么是一个函数所需的参数,它可以是函数的文档中进行检查。在左括号的情况下,应该有一个右括号。
    • 代码块或 lambda,以防函数需要一个。

    在给定的示例中,模板、包含和每个都是函数。

    file {"/etc/smb.conf":
      ensure  => file,
      content => template("smb/smb.conf.erb"), # function call; resolves to a string
    
    }
    include test # function call; modifies catalog
    $binaries = [
      "facter",
      "hiera",
    ]
    
    # function call with lambda; runs block of code several times
    each($binaries) |$binary| {
      file {"/usr/bin/$binary":
        ensure => link,
        target => "/opt/puppetlabs/bin/$binary",
      }
    }