SaltStack:文件来源的逆向工程
SaltStack: Reverse engineering where a file comes from
如果您查看设置为 SaltStack 的主机,那么有时就像使用 vi 查看二进制文件一样。
您不知道 config/file 是如何创建的。
这使得解决错误变得困难。对文件的来源进行逆向工程需要太多时间。
我的目标:使从查看 minion 上的 unix 配置文件(由 salt 创建)到此配置的来源变得容易。就像svn和cvs中的$Id$
我和一个朋友的一个想法:
状态 file.managed 应该(可选)添加文件的来源。
示例:
我的 sls 文件包含这个:
file_foo_bar:
file.managed:
- source:
- salt://foo/bar
那么创建的文件应该包含这个注释。
# Source: salt://foo/bar
当然这并不简单,因为有不同的方法可以将注释放入配置文件。
这可行吗?或者有没有更好的解决方案来实现我的目标。
更新
通常我知道我做错了什么并且很容易找到根源。如果几个人在状态树上工作,就会出现问题。
这是一个起点,当它由 Salt 使用 Salt Pillar 管理时,您可以在此处获取修改文件的日期和时间。
让我们调用我们的变量salt_managed
。创建一个如下所示的支柱文件:
{% set managed_text = 'Salt managed: File modified on ' + salt.cmd.run('date "+%Y-%m-%d %H:%M:%S"') %}
salt_managed: {{ managed_text | yaml_dquote }}
然后在minion上调用pillar会得到如下结果:
$ salt-call pillar.get salt_managed
local:
Salt managed: File modified on 2016-10-18 11:12:40
您可以通过将其添加到配置文件的顶部来使用它,例如:
{{ pillar.get('salt_managed') }}
更新:
我找到了可能对某人有用的解决方法。假设我们有多个状态可以修改同一个文件。我们如何知道 X 国负责修改该文件?通过执行以下步骤:
1- 我创建了一个这样的状态:
Create a File:
file.managed:
- name: /path/to/foofile
- source: salt://statedir/barfile
Add file header:
file.prepend:
- name: /path/to/foofile
- text: "This file was managed by using this salt state {{ sls }}"
barfile 的内容是:
This is a new file
2- 从 minion 调用状态,这将是结果:
$ salt-call state.sls statedir.test
local:
----------
ID: Create a File
Function: file.managed
Name: /path/to/foofile
Result: True
Comment: File /path/to/foofile updated
Started: 07:50:45.254994
Duration: 1034.585 ms
Changes:
----------
diff:
New file
mode:
0644
----------
ID: Add file header
Function: file.prepend
Name: /path/to/foofile
Result: True
Comment: Prepended 1 lines
Started: 07:50:46.289766
Duration: 3.69 ms
Changes:
----------
diff:
---
+++
@@ -1,1 +1,2 @@
+This file was managed by using this salt state statedir.test
This is a new file
Summary for local
------------
Succeeded: 2 (changed=2)
Failed: 0
------------
Total states run: 2
目前foofile
的内容是:
This file was managed by using this salt state statedir.test
This is a new file
如果您查看设置为 SaltStack 的主机,那么有时就像使用 vi 查看二进制文件一样。
您不知道 config/file 是如何创建的。
这使得解决错误变得困难。对文件的来源进行逆向工程需要太多时间。
我的目标:使从查看 minion 上的 unix 配置文件(由 salt 创建)到此配置的来源变得容易。就像svn和cvs中的$Id$
我和一个朋友的一个想法:
状态 file.managed 应该(可选)添加文件的来源。
示例:
我的 sls 文件包含这个:
file_foo_bar:
file.managed:
- source:
- salt://foo/bar
那么创建的文件应该包含这个注释。
# Source: salt://foo/bar
当然这并不简单,因为有不同的方法可以将注释放入配置文件。
这可行吗?或者有没有更好的解决方案来实现我的目标。
更新
通常我知道我做错了什么并且很容易找到根源。如果几个人在状态树上工作,就会出现问题。
这是一个起点,当它由 Salt 使用 Salt Pillar 管理时,您可以在此处获取修改文件的日期和时间。
让我们调用我们的变量salt_managed
。创建一个如下所示的支柱文件:
{% set managed_text = 'Salt managed: File modified on ' + salt.cmd.run('date "+%Y-%m-%d %H:%M:%S"') %}
salt_managed: {{ managed_text | yaml_dquote }}
然后在minion上调用pillar会得到如下结果:
$ salt-call pillar.get salt_managed
local:
Salt managed: File modified on 2016-10-18 11:12:40
您可以通过将其添加到配置文件的顶部来使用它,例如:
{{ pillar.get('salt_managed') }}
更新:
我找到了可能对某人有用的解决方法。假设我们有多个状态可以修改同一个文件。我们如何知道 X 国负责修改该文件?通过执行以下步骤:
1- 我创建了一个这样的状态:
Create a File:
file.managed:
- name: /path/to/foofile
- source: salt://statedir/barfile
Add file header:
file.prepend:
- name: /path/to/foofile
- text: "This file was managed by using this salt state {{ sls }}"
barfile 的内容是:
This is a new file
2- 从 minion 调用状态,这将是结果:
$ salt-call state.sls statedir.test
local:
----------
ID: Create a File
Function: file.managed
Name: /path/to/foofile
Result: True
Comment: File /path/to/foofile updated
Started: 07:50:45.254994
Duration: 1034.585 ms
Changes:
----------
diff:
New file
mode:
0644
----------
ID: Add file header
Function: file.prepend
Name: /path/to/foofile
Result: True
Comment: Prepended 1 lines
Started: 07:50:46.289766
Duration: 3.69 ms
Changes:
----------
diff:
---
+++
@@ -1,1 +1,2 @@
+This file was managed by using this salt state statedir.test
This is a new file
Summary for local
------------
Succeeded: 2 (changed=2)
Failed: 0
------------
Total states run: 2
目前foofile
的内容是:
This file was managed by using this salt state statedir.test
This is a new file