Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.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_Jinja2_Ansible 2.x_Ansible Template - Fatal编程技术网

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
    }
    
    
  • 可以使用或过滤器根据测试筛选列表元素

    在您的例子中,我们可以使用reject从初始列表中筛选出所有元素,这些元素实际上在给定的命令结果字符串中找到。如果找到所有元素,则结果列表应为空

    -名称:如果找不到所有服务器,演示任务将失败
    变量:
    未找到:{{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了。