Ansible:从剧本打印警告

Mvo*_*sek 13 ansible

我可以像 Ansible 那样打印来自 Ansible 的警告,用于内部警告,例如:

 [WARNING]: Ignoring invalid attribute: xx
Run Code Online (Sandbox Code Playgroud)

目标用途是警告,不是错误,因此它们不应结束剧本执行,但它们应该清晰可见(以标准 Ansible 紫色)。

用法示例:

  1. 我有一些最新版本的硬编码 URL。
  2. 该剧本下载最新的可用 URL。
  3. 如果 URL 不同,则打印警告。
  4. 由于来源不可信,所以下载的 URL 只能用于比较,不能直接使用。

Dan*_*ton 16

这是一个简单的过滤器插件,它将发出警告消息:

from ansible.utils.display import Display


class FilterModule(object):
    def filters(self): return {'warn_me': self.warn_filter}

    def warn_filter(self, message, **kwargs):
        Display().warning(message)
        return message
Run Code Online (Sandbox Code Playgroud)

将上述内容放入一个文件中,例如,[playbook_dir]/filter_plugins/warn_me.py.

调用此过滤器的人为示例剧本可能如下所示:

---
- name: Demonstrate warn_me filter plugin
  gather_facts: no
  hosts: all

  tasks:
    - meta: end_play 
      when: ('file XYZ cannot be processed' | warn_me())
      delegate_to: localhost
      run_once: yes
Run Code Online (Sandbox Code Playgroud)

运行这个剧本可能会产生这样的输出:

$ ansible-playbook test_warnme.yml -l forwards
 __________________________________________ 
< PLAY [Demonstrate warn_me filter plugin] >
 ------------------------------------------ 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

 [WARNING]: file XYZ cannot be processed

 ____________ 
< PLAY RECAP >
 ------------ 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


Run Code Online (Sandbox Code Playgroud)


Ben*_*ing 14

fail:警告可以通过使用+ when:+来组合ignore_errors:

例如

- name: Check hostname matches entry in ansible/hosts
  fail:
    msg: "Warning: Expected hostname to be '{{ inventory_hostname }}' but was '{{ ansible_facts.fqdn}}'"
  when: ansible_facts.fqdn != inventory_hostname
  ignore_errors: True
Run Code Online (Sandbox Code Playgroud)

警告显示为致命错误,后跟,以及出现在as...skipping中的数量计数。PLAY RECAPignored=N

例如

TASK [mytask: Check hostname matches entry in ansible/hosts] ***************
fatal: [myhost]: FAILED! => {"changed": false, "msg": "Warning: Expected hostname to be 'myhost' but was 'myhost.my.example.com'"}
...ignoring

PLAY RECAP *************************************************************************************
myhost   ok=0    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    **ignored=1**
Run Code Online (Sandbox Code Playgroud)

信用: https://medium.com/opsops/how-to-print-warning-from-a-task-3286ebb39f40


Rob*_*b H 7

根据您的问题,如果您不信任提供的 URL,但要回答有关生成的问题,您似乎可能希望使剧本失败

[WARNING]: <supplied text>

我所知道的唯一方法是通过您自己的 ansible 模块或插件。

您的模块或插件将进行您描述的 URL 比较并发出适当的消息。

在 ansible 模块中module,您创建的对象具有warn您调用的函数,例如: module.warn('your text')

在一个插件,你的代码会生成一个Display对象,该对象将有一个warning函数调用,如: display.warning('your text')

如果您的目标只是获得一条可靠的紫色警告消息,而不是您可以通过debug模块生成的消息,那么这似乎需要做很多工作。