Chef infra Chef中收敛性与幂等性的区别

Chef infra Chef中收敛性与幂等性的区别,chef-infra,theory,configuration-management,Chef Infra,Theory,Configuration Management,Chef中收敛和幂等的基本区别是什么?收敛和幂等不是Chef特有的。它们通常被归因于配置管理理论,但在其他领域也有应用,尤其是数学 让我们从更基本的幂等开始。我们将忽略幂等元在数学上的用法,而是关注配置管理人员在谈论它时的含义。也就是说:“相同操作的多个应用程序不会对系统状态产生副作用。”幂等运算的一个简单示例是mkdir-p: mkdir -p /var/lib/statedir/myapp 无论我们运行该命令多少次,它都会导致创建该树。关于幂等运算的另一种说法是,“反复运行该工具不会在第一

Chef中收敛和幂等的基本区别是什么?

收敛和幂等不是Chef特有的。它们通常被归因于配置管理理论,但在其他领域也有应用,尤其是数学

让我们从更基本的幂等开始。我们将忽略幂等元在数学上的用法,而是关注配置管理人员在谈论它时的含义。也就是说:“相同操作的多个应用程序不会对系统状态产生副作用。”幂等运算的一个简单示例是
mkdir-p

mkdir -p /var/lib/statedir/myapp
无论我们运行该命令多少次,它都会导致创建该树。关于幂等运算的另一种说法是,“反复运行该工具不会在第一次之后改变系统。”

现在将其与趋同进行对比。一般来说,趋同意味着把(人或)事物聚集在一起。在配置管理中,融合意味着使系统状态符合定义的策略。也就是说,只有在需要时才对系统进行更改。收敛操作的一个简单示例是:

if [ ! -d /var/lib/statedir/myapp ]; then
  mkdir -p /var/lib/statedir/myapp
fi
这是收敛的,因为我们只在所需目录不存在时执行mkdir命令。我们也称之为“测试和维修”操作。也就是说,我们测试我们正在管理的特定事物的当前状态,然后使用特定命令或操作修复它(如果它不处于该状态)。这就是Chef在幕后利用以下资源所做的工作:

directory '/var/lib/statedir/myapp' do
  recursive true
end
exec { '/usr/bin/curl http: //server.net/packages/package.tar.gz -o /tmp/package.tar.gz ': }

-> exec { 'tar -xf /tmp/package.tar.gz -C /tmp/package': }

-> exec { '/tmp/package/installer.sh': }

file { '/tmp/package':
    ensure  => absent,
    force   => true,
    require => Exec[ '/tmp/package/installer.sh'],
}

file { '/tmp/package.tar.gz':
    ensure  => absent,
    force   => true,
    require => Exec[ '/tmp/package/installer.sh'],
}
我们(Chef)讨论这个问题的方式是,Chef采取幂等操作将系统收敛到各种资源声明的状态。Chef中的每个资源都是声明性的,并对资源的当前状态执行测试,然后修复系统以匹配该状态


为了深入了解Chef是如何工作的,它在Chef运行中有一个“编译”阶段和一个“聚合”阶段。在“编译”阶段,它评估节点上的Ruby配方,并查找添加到“资源集合”中的资源对象。评估完所有配方后,它进入“聚合”阶段,在该阶段迭代资源集合,采取适当的操作将资源置于所需状态,创建用户、编写文件、安装软件包等等。

@Mark Amery要求提供一个更令人满意的例子,说明两者之间的区别,因此我将尽力提供这一点

如果在步骤成功结束时,系统已进入已知状态,则步骤是收敛的

如果在系统上多次执行步骤(其基本状态未更改),结果与步骤执行一次相同,则步骤是幂等的

无幂等收敛

收敛但不是幂等的步骤是:

rm -rf /var/log/myapp
mkdir -p /var/log/myapp
在步骤成功结束时,我们知道
/var/log/myapp
是一个存在的空目录

它不是幂等的,因为每次它都会吹走
/var/log/myapp
目录。幂等性是可取的,因为它减少了系统上不必要的搅动。显然,任何写入
/var/log/myapp
目录的应用程序都不会对上述步骤感到满意

不收敛的幂等性

幂等但不收敛的步骤是:

test "$(ls -A /home/foo 2>/dev/null)" || tempfile -d /home/foo
只有在
/home/foo
中没有文件时,该脚本才会在
/home/foo
中创建一个随机名称的文件。这是幂等的,在第一次运行之后,目录将不会为空,因此将来的运行将不会执行任何操作

然而,它不是收敛的。您不能说这一步将系统置于任何已知状态,因为创建的文件将具有随机名称

需要收敛,因为它有助于产生处于相同状态的系统,从而更有可能表现出可预测的行为

警告一句

这些术语就像抽象概念,它们并不精确,而且可能会泄露。例如,您可以声明操作不是幂等的,因为它会占用CPU周期。您可以声明,一个执行昂贵测试的幂等测试和修复操作比另一个执行廉价测试的操作“更少幂等”,即使“更少幂等”不是事实

您可以尝试声明安装MySQL版本X的步骤不是收敛的,因为在不同的机器上运行时,它会在文件上留下不同的时间戳。或者,您可以说我上面发布的步骤是收敛的,因为它使系统处于状态“/home/foo exists,并且只包含一个文件”

这就是当数学从黑板上消失时会发生的情况。

免责声明:我是配置管理社区的局外人,我花了数小时的阅读时间才弄清楚接下来会发生什么。我在这个回答中批评了配置管理社区,所以你应该知道他们的世界不是我的世界,我在目前的工作中甚至没有使用任何配置管理工具,我只是根据我在谷歌上能找到的东西来判断他们

定义 说一个操作是收敛的,大致上意味着它将其管理的系统的任何部分置于指定的状态

当配置管理人员说某个操作是幂等的时,他们通常的意思是,如果在运行一次之后再次运行该操作,则第二次运行将立即终止,而不会执行任何冗余工作

特别是当资源在Chef上下文中被描述为幂等时,这意味着在资源已被置于所需状态之后运行的后续Chef在x/y资源中不将其视为“已更新”
exec { '/usr/bin/curl http: //server.net/packages/package.tar.gz -o /tmp/package.tar.gz ': }

-> exec { 'tar -xf /tmp/package.tar.gz -C /tmp/package': }

-> exec { '/tmp/package/installer.sh': }

file { '/tmp/package':
    ensure  => absent,
    force   => true,
    require => Exec[ '/tmp/package/installer.sh'],
}

file { '/tmp/package.tar.gz':
    ensure  => absent,
    force   => true,
    require => Exec[ '/tmp/package/installer.sh'],
}