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文件
如果愿意,您甚至可以通过传递组和变量列表来扩展这个最新的解决方案,以便从模板任务中动态写出这些变量。这太棒了。谢谢,太好了。非常感谢。