首页 > 解决方案 > 简单条件变量的问题

问题描述

我不能让这个简单的条件起作用。

pause在角色中使用用户确认并将输入注册到变量。
我在接下来的 2 个任务中使用这个变量:

  1. 一个在输入时运行y
  2. 另一个是什么时候n

但是我无法根据用户输入使条件起作用。

下面是任务/main.yml


# tasks file for Update-AdvFirewall-to-V1.6
 - name: Get Note
   routeros_command:
     commands: /system note print
   register: output
      
 - name: Get AdvFirewall Version
   set_fact:
     installed: "{{ item | replace('- AdvFirewall=V', '') | trim }}"
   when: "'AdvFirewall=V' in item"
   loop: "{{ output.stdout_lines[0] }}"

 - name: Confirm if not Installed
   pause:
     prompt: "AdvFirewall is not installed. Do you want to install (y/n)"
   when: installed is undefined
   register: confirm_new_install

 - name: Install AdvFirewall if not installed
   routeros_command:
     commands:
       - system note set note="Installed ADVfirewall"
   when: confirm_new_install == "y"
  
 - meta: end_play
   when: confirm_new_install is defined or installed is undefined

 - name: Upgrade AdvFirewall if needed
   routeros_command:
     commands:
       - system note set note="Time to upgrade"
   when: installed == "1.5"

 - name: Send Email if AdvFirewall is older than required
   routeros_command:
     commands:
       - "/tool e-mail send to=\"abc@abc.com\" subject=\"AdvFirewall Upgrade | Installed Version doesn`t meet requirements for upgrade on $[/system identity get name]\" body=\"$[/system identity get name] has AdvFirewall V{{ installed }}. Required Version is V{{ required }}\""
   when: installed < "1.5"

编辑:毕竟它适用于我在你的帮助下发现的一些变化。

- name: Install AdvFirewall if not installed
    routeros_command:
      commands:
        - system note set note="Installed ADVfirewall"
      when: "confirm_new_install.user_input | default('X') == 'y'"
      
- meta: end_play
   when: "confirm_new_install.user_input | default('X') != 'X'"

非常感谢!

标签: ansible

解决方案


pause模块,因为大多数 Ansible 模块都注册了一个字典,其中用户输入位于user_inputkey下。

而且,由于您的pause任务可以跳过,您必须测试它是否已定义,或者添加一个default.

因此,您必须将条件更改为:

  • 任何一个
    when: "confirm_new_install.user_input | default('n') == 'y'"
    
  • 或者
    when: 
      - confirm_new_install.user_input is defined
      - confirm_new_install.user_input == "y"
    

请记住,您始终可以debug使用 Ansible 的任何输出来识别此类问题。

使用:

- debug:
    var: confirm_new_install

会向你展示类似的东西:

{
    "confirm_new_install": {
        "changed": false,
        "delta": 2,
        "echo": true,
        "failed": false,
        "rc": 0,
        "start": "2021-02-01 19:55:09.835787",
        "stderr": "",
        "stdout": "Paused for 0.04 minutes",
        "stop": "2021-02-01 19:55:12.448872",
        "user_input": "y"
    }
}

推荐阅读