代码之家  ›  专栏  ›  技术社区  ›  Steve E.

字符串不匹配时的可靠条件

  •  42
  • Steve E.  · 技术社区  · 10 年前

    我正在尝试编写一个Ansible剧本,如果Nginx还没有出现,并且在当前版本中,它只能编译Nginx。然而,它每次都编译,这是不可取的。

    这就是我所拥有的:

    - shell: /usr/local/nginx/sbin/nginx -v 2>&1
      register: nginxVersion
    - debug:
      var=nginxVersion
    
    - name: install nginx
      shell: /var/local/ansible/nginx/makenginx.sh
      when: "not nginxVersion == 'nginx version: nginx/1.8.0'"
      become: yes
    

    除了每次编译Nginx时都会运行shell脚本之外,该脚本都能正常工作。nginxVersion的调试输出为:

    ok: [server] => {
        "var": {
            "nginxVersion": {
                "changed": true,
                "cmd": "/usr/local/nginx/sbin/nginx -v 2>&1",
                "delta": "0:00:00.003752",
                "end": "2015-09-25 16:45:26.500409",
                "invocation": {
                    "module_args": "/usr/local/nginx/sbin/nginx -v 2>&1",
                    "module_name": "shell"
                },
                "rc": 0,
                "start": "2015-09-25 16:45:26.496657",
                "stderr": "",
                "stdout": "nginx version: nginx/1.8.0",
                "stdout_lines": [
                    "nginx version: nginx/1.8.0"
                ],
                "warnings": []
            }
        }
    }
    

    根据文档,我的思路正确,我错过了什么简单的技巧?

    2 回复  |  直到 10 年前
        1
  •  87
  •   Vor    10 年前

    尝试:

    when: nginxVersion.stdout != 'nginx version: nginx/1.8.0'
    

    when: '"nginx version: nginx/1.8.0" not in nginxVersion.stdout'
    
        2
  •  5
  •   Ahmad sibai    9 年前

    由于var是一个json字符串,您可以将其解析为json并访问其密钥。

    set_fact:
      var_json: "{{ var.stdout|from_json }}"
    

    然后访问json并获取所需的值。

    when: var_json.nginxVersion.stdout == 'nginx version: nginx/1.8.0'
    

    签出此链接: https://gist.github.com/justinhennessy/28e82c2ec05f9081786a