Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ansible 在控制节点上合并文件中的数据点_Ansible - Fatal编程技术网

Ansible 在控制节点上合并文件中的数据点

Ansible 在控制节点上合并文件中的数据点,ansible,Ansible,我有一个场景,我需要在一个相当大的集群中检查安装、版本等,收集这些详细信息并写入控制节点上的文件。例如java\u版本,elasticsearch\u版本等 我有用于剧本的动态清单(ec2.py)。到目前为止,我已经使用了blockinfle。对于最后执行的唯一一个节点,它似乎工作得很好(我使用serial:1一次执行一个节点)。你们怎么解决这个问题?可能需要使用所有的目录\u主机名创建某种字典,并分配这些数据点 这是一本类似的剧本(概念上..语法可能有问题,因为这只是提供更多上下文的示例代码)

我有一个场景,我需要在一个相当大的集群中检查安装、版本等,收集这些详细信息并写入控制节点上的文件。例如
java\u版本
elasticsearch\u版本

我有用于剧本的动态清单(
ec2.py
)。到目前为止,我已经使用了
blockinfle
。对于最后执行的唯一一个节点,它似乎工作得很好(我使用
serial:1
一次执行一个节点)。你们怎么解决这个问题?可能需要使用所有的
目录\u主机名创建某种
字典
,并分配这些数据点

这是一本类似的剧本(概念上..语法可能有问题,因为这只是提供更多上下文的示例代码)

假设我有3个节点,应该是这样的

details for machine node1
1. Elasticsearch version 7.12.0
2. Java version 1.8.0_181

details for machine node2
1. Elasticsearch version 7.12.0
2. Java version 1.8.0_181

details for machine node3
1. Elasticsearch version 7.12.0
2. Java version 1.8.0_181
但我只看到

details for machine node3
1. Elasticsearch version 7.12.0
2. Java version 1.8.0_181

这是可以理解的。如何获得所需的结果(所有3个节点的信息,而不是最后一个节点)?

您对
blockinfle
重复使用相同的默认值,因此它在每次运行时都会被覆盖,只留下最新的一个

只需使用特定于每个节点的内容更改标记。由于您的文件似乎不遵循任何特定的格式,您甚至可以使用它来摆脱您的第一个介绍性块行,例如

-name:在控制节点上写入这些数据点
区块填充:
路径:/path/to/myfile
标记:“{mark}计算机{{inventory\u hostname}的详细信息”
区块:|
1.Elasticsearch版本{es_版本}
2.Java版本{Java_版本}
委托给:localhost
结果应该是:

BEGIN details for machine node1
1. Elasticsearch version 7.12.0
2. Java version 1.8.0_181
END details for machine node1
BEGIN details for machine node2
1. Elasticsearch version 7.12.0
2. Java version 1.8.0_181
END details for machine node2
BEGIN details for machine node3
1. Elasticsearch version 7.12.0
2. Java version 1.8.0_181
END details for machine node3

同时,在这种情况下,更干净的方法可能是使用模板。您不需要构造任何dict,您已经有了一个可用的dict

模板
templates/host\u data\u points.txt.j2

{% for host in group['tag_all_nodes'] %}
details for machine {{ hostvars[host].inventory_hostname }}
1. Elasticsearch version {{ hostvars[host].es_version }}
2. Java version {{ hostvars[host].java_version }}

{% endfor %}
然后删除上述重头戏中的最后一个任务,再添加一个重头戏:

#
#(您的第一个游戏如上所述,没有最后一个任务,请点击此处)+
#
-名称:将数据点写入文件
主机:本地主机
收集事实:错误
任务:
-名称:将数据复制到文件的模板
模板:
src:host_data_points.txt.j2
dest:/path/to/my\u文件

如果愿意,您甚至可以通过传递组和变量列表来扩展此最新解决方案,以便从模板任务中动态写出。

您正在为
blockinfle
重用相同的默认值,因此它在每次运行时都会被覆盖,只留下最新的一个

只需使用特定于每个节点的内容更改标记。由于您的文件似乎不遵循任何特定的格式,您甚至可以使用它来摆脱您的第一个介绍性块行,例如

-name:在控制节点上写入这些数据点
区块填充:
路径:/path/to/myfile
标记:“{mark}计算机{{inventory\u hostname}的详细信息”
区块:|
1.Elasticsearch版本{es_版本}
2.Java版本{Java_版本}
委托给:localhost
结果应该是:

BEGIN details for machine node1
1. Elasticsearch version 7.12.0
2. Java version 1.8.0_181
END details for machine node1
BEGIN details for machine node2
1. Elasticsearch version 7.12.0
2. Java version 1.8.0_181
END details for machine node2
BEGIN details for machine node3
1. Elasticsearch version 7.12.0
2. Java version 1.8.0_181
END details for machine node3

同时,在这种情况下,更干净的方法可能是使用模板。您不需要构造任何dict,您已经有了一个可用的dict

模板
templates/host\u data\u points.txt.j2

{% for host in group['tag_all_nodes'] %}
details for machine {{ hostvars[host].inventory_hostname }}
1. Elasticsearch version {{ hostvars[host].es_version }}
2. Java version {{ hostvars[host].java_version }}

{% endfor %}
然后删除上述重头戏中的最后一个任务,再添加一个重头戏:

#
#(您的第一个游戏如上所述,没有最后一个任务,请点击此处)+
#
-名称:将数据点写入文件
主机:本地主机
收集事实:错误
任务:
-名称:将数据复制到文件的模板
模板:
src:host_data_points.txt.j2
dest:/path/to/my\u文件

如果愿意,您甚至可以通过传递组和变量列表来扩展这个最新的解决方案,以便从模板任务中动态写出这些变量。

这太棒了。谢谢,太好了。非常感谢。