【问题标题】:Ansible search for a substring in stdout outputAnsible 在标准输出输出中搜索子字符串
【发布时间】:2019-12-05 02:16:48
【问题描述】:

团队, 我正在尝试匹配一个版本,但当整个字符串不匹配时会失败。所以我只想匹配前两个八位字节。我尝试了几个组合,但没有运气。

      - name: "Validate k8s version"
        shell: "kubectl version --short"
        register: k8s_version_live
        failed_when: k8s_version_live.stdout_lines is not search("{{ k8s_server_version }}")
        #failed_when: "'{{ k8s_server_version }}' not in k8s_version_live.stdout_lines"
        ignore_errors: yes
      - debug:
          var: k8s_version_live.stdout_lines

输出:


[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: k8s_version_live.stdout_lines is not search("{{
k8s_server_version }}")

fatal: [localhost]: FAILED! => {"changed": true, "cmd": "kubectl version --short", "delta": "0:00:00.418128", "end": "2019-12-05 02:13:15.108997", "failed_when_result": true, "rc": 0, "start": "2019-12-05 02:13:14.690869", "stderr": "", "stderr_lines": [], "stdout": "Client Version: v1.13.3\nServer Version: v1.13.10", "stdout_lines": ["Client Version: v1.13.3", "Server Version: v1.13.10"]}
...ignoring

TASK [team-services-pre-install-checks : debug] *************************************************************************************************************************
Thursday 05 December 2019  02:13:15 +0000 (0:00:00.902)       0:00:01.039 *****
ok: [localhost] => {
    "k8s_version_live.stdout_lines": [
        "Client Version: v1.13.3",
        "Server Version: v1.13.10"
    ]
}```

【问题讨论】:

    标签: ansible ansible-2.x ansible-facts


    【解决方案1】:

    问:"匹配一个版本...匹配前两个八位字节"

    答:使用Version Comparison。例如,从注册的输出中创建变量 k8s_server_version

    - set_fact:
        k8s_server_version: "{{ k8s_version_live.stdout_lines.1.split(':').1[2:] }}"
    

    比较版本的前两个数字

    - debug:
        msg: "{{ k8s_server_version }} match 1.13"
      when:
        - k8s_server_version is version('1.13', '>=')
        - k8s_server_version is version('1.14', '<')
    

    给予

        }
        localhost | SUCCESS => {
            "msg": "1.13.10 match 1.13"
        }
    

    版本不匹配时失败

    - fail:
        msg: "{{ k8s_server_version }} does not match 1.12"
      when: not (k8s_server_version is version('1.12', '>=') and
                 k8s_server_version is version('1.13', '<'))
    

    给予

        localhost | FAILED! => {
            "changed": false, 
            "msg": "1.13.10 does not match 1.12"
        }
    

    【讨论】:

      【解决方案2】:

      正如错误所说:

      条件语句不应包含 jinja2 模板分隔符,例如 {{ }} 或 {% %}。

      在条件语句中,您已经在 J​​inja 模板上下文中。您可以只按名称引用变量:

      - name: "Validate k8s version"
        shell: "kubectl version --short"
        register: k8s_version_live
        failed_when: k8s_version_live.stdout_lines is not search(k8s_server_version)
        ignore_errors: yes
      

      虽然您可能想要k8s_version_live.stdout 而不是k8s_version_live.stdout_lines

      我可能会把任务写成:

      - name: "Validate k8s version"
        command: "kubectl version --short"
        register: k8s_version_live
        failed_when: k8s_server_version not in k8s_version_live.stdout
        ignore_errors: true
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-24
        • 2012-09-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多