Ansible 如何检查包含列表中所有值的字符串?
我试图通过将Ansible 如何检查包含列表中所有值的字符串?,ansible,jinja2,ansible-2.x,ansible-template,Ansible,Jinja2,Ansible 2.x,Ansible Template,我试图通过将cluster\u status命令输出作为一个变量,然后查看输出是否包含该组的所有主机,来验证rabbitmq集群状态。如果有主机丢失,请退出 如何检查一个字符串(命令\u输出)是否包含列表(组\u主机)中的所有值 我的代码: -名称:检查群集状态 命令:rabbitmqctl cluster_status 寄存器:群集状态 更改时间:false 输出: “stdout”:“节点的群集状态”rabbit@ip-127.0.0.1…\n[{节点,[{磁盘,['rabbit@ip-1
cluster\u status
命令输出作为一个变量,然后查看输出是否包含该组的所有主机,来验证rabbitmq集群状态。如果有主机丢失,请退出
如何检查一个字符串(命令\u输出)是否包含列表(组\u主机)中的所有值
我的代码:
-名称:检查群集状态
命令:rabbitmqctl cluster_status
寄存器:群集状态
更改时间:false
输出:
“stdout”:“节点的群集状态”rabbit@ip-127.0.0.1…\n[{节点,[{磁盘,['rabbit@ip-127.0.0.1','rabbit@ip-127.0.0.2']}]},\n{正在运行_节点,['rabbit@ip-127.0.0.2','rabbit@ip-127.0.0.1']}、\n{cluster\u name、}、\n{partitions、[]}、\n{alarms、[{'rabbit@ip-127.0.0.2',[]},{'rabbit@ip-127.0.0.1',[]}]}]",
“标准线”:[
“节点的群集状态”rabbit@ip-127.0.0.1 ...",
“[{节点,[{磁盘,['rabbit@ip-127.0.0.1','rabbit@ip-127.0.0.2']}]},",
{正在运行_节点,['rabbit@ip-127.0.0.2','rabbit@ip-127.0.0.1']},",
“{cluster_name,},”,
“{partitions,[]},”,
“{警报,[{”rabbit@ip-127.0.0.2',[]},{'rabbit@ip-127.0.0.1',[]}]}]"
]
列表变量:
group_hosts=[ip-127.0.0.1,ip-127.0.0.2]
如何从stdout获取变量的以下行
running_nodes,['rabbit@ip-127.0.0.2','rabbit@ip-127.0.0.1']
“{{'a_string'在'另一个字符串中某处包含一个_string'}}”
一行演示:
$ ansible localhost -m debug -a "msg={{ 'a_string' in 'an other string containing a_string somewhere' }}"
localhost | SUCCESS => {
"msg": true
}
$ ansible localhost -m debug -a "msg={{ 'a_string' in 'it won''t be find in here' }}"
localhost | SUCCESS => {
"msg": false
}
-名称:如果找不到所有服务器,演示任务将失败
变量:
未找到:{{group_hosts}拒绝('in',cluster_status.stdout)}列表}”
断言:
即:unfound | length==0
成功消息:找到的所有服务器
fail_msg:“缺少一个或多个服务器:{{unfound | join(',')}”
我可以通过
--formatterjson
标记到rabbitmq命令来实现这一点
- name: Get cluster status
shell: rabbitmqctl cluster_status --formatter json
register: cluster_status
failed_when: cluster_status.rc > 0
- name: demo task which fails if all servers are not found
vars:
group_hosts: "{{ groups['rmq_servers'] | map('extract', hostvars, 'ansible_hostname') | list }}"
running_nodes: "{{ cluster_status.stdout| from_json| json_query('running_nodes') }}"
assert:
that: group_hosts|length == running_nodes|length
success_msg: All Nodes joined cluster
fail_msg: "All Nodes are not part of cluster: {{ group_hosts|length - running_nodes|length }} missing"
感谢@Zeitounator和@Vladimir Botka。这两个答案都有助于向兔子索要JSON”--格式化程序JSON“。第二种方法出现错误<代码>错误是一个原始消息:没有名为“in”的测试}。如何创建“测试”。@SNR可能是时候在安装中升级ansible/jinja2了。