【问题标题】:How to view the Ansible When Conditional Evaluation如何在条件评估时查看 Ansible
【发布时间】:2019-08-08 20:55:22
【问题描述】:

我正在尝试使用 Ansible 升级 Cisco 路由器,并在我实际重新启动之前使用 cli_config 模块检查启动标记是否设置正确。

我正在尝试使用 when 子句来防止 playbook 应用更改,除非配置看起来正确

我想确保变量“文件名”——这是管理员传递给剧本的图像的名称——包含在检查启动文件的命令的输出中——它已注册到一个变量称为“boot_sys_marker_running_config”

我已经试过了:

when: filename in boot_sys_marker_running_config.stdout

我也试过了

when: filename == "boot_sys_marker_running_config.stdout"

我尝试在运行 playbook 时使用 -vvvv 选项调试这些,并且在 playbook 中设置了 debugger: always,但没有洞察力

我似乎总是知道条件不成功 - 但我看不到条件认为我希望它评估什么 - 有谁知道如何“调查”条件以便我可以适当地修改它?

剧本选项:

-e "filename=csr1000v-universalk9azn.16.11.01b.SPA.bin"

我在其中注册变量并尝试使用条件的部分剧本

- name: check to see that the correct boot system marker has been configured   
  cli_command:
    command: "show run | i boot system"   
  register: boot_sys_marker_running_config   ignore_errors: yes
- name: copy running config to startup when boot marker is correct   
  cli_command:
    command: "copy running-config startup-config"   
  register: writing_config_to_startup
  ignore_errors: yes
  when: filename in boot_sys_marker_running_config.stdout

我有一个调试任务来显示 boot_sys_marker_running_config 的内容:

TASK [debug] ************************************************************************************************************************************************
ok: [r3-cvpn1.corp.ncsc.gov.uk] => {
    "msg": {
        "changed": false,
        "failed": false,
        "stdout": "boot system bootflash:csr1000v-universalk9azn.16.11.01b.SPA/packages.conf",
        "stdout_lines": [
            "boot system bootflash:csr1000v-universalk9azn.16.11.01b.SPA/packages.conf"
        ]
    }
}

【问题讨论】:

  • 你能粘贴剧本、输出或变量的值吗?
  • 第一个任务输出也请。
  • 它只显示“ok” - 所以粘贴了调试输出
  • 你能检查一下是不是条件对齐的问题。什么时候应该用名字。
  • 抱歉 - 粘贴时缩进不正常 - 已更正

标签: ansible jinja2


【解决方案1】:

文件名中删除待处理的.bin。字符串stdout中缺少此扩展名

-e "filename=csr1000v-universalk9azn.16.11.01b.SPA.bin"

正确

-e "filename=csr1000v-universalk9azn.16.11.01b.SPA"

正确的条件应该是

when: boot_sys_marker_running_config.stdout is search(filename)

下面的测试按预期工作。

- hosts: localhost
  vars:
    filename: 'csr1000v-universalk9azn.16.11.01b.SPA'
    stdout: 'boot system bootflash:csr1000v-universalk9azn.16.11.01b.SPA/packages.conf'
  tasks:
    - debug:
        msg: filename found
      when: stdout is search(filename)

【讨论】:

【解决方案2】:

首先,请注意您的示例文件名 csr1000v-universalk9azn.16.11.01b.SPA.bin 不在输出中的任何位置。

话虽如此,当您使用以下形式的条件时:

a_string in a_list

您正在检查a_list 是否包含完全 a_string 的元素。

这不应与

混淆
a_substring in a_string

检查a_substring 是否匹配a_string 的一部分。

这可以在您的示例中使用stdout_lines,但您必须检查列表中的每个元素。

在您的情况下,最简单的方法是直接使用stdout,其中所有行都连接在一个字符串中:

when: filename in stdout

您仍然需要修改文件名并删除 .bin 扩展名才能处理您的简单数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 2021-04-10
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多