• ansible 调试 debug 一介凡人


    一、debug模块

    1、debug模块是Ansible Playbook中最常用的调试模块,可以在Playbook执行过程打印调试信息,特别是跟when条件语句一起使用时,可以调试特定条件下的执行过程。

    比如:当变量 a 定义时,将 a 的值打印出来,当任务成功后,打印执行结果等。

    msg:调试输出的消息

    var:将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出 verbosity:debug的级别(默认是0级,全部显示)

    参数 默认值 解释
    msg(string) null 输出自定义信息,如果不指定或不写msg的话,默认也会输出“null”
    var(string)   指定要打印的变量名,与msg参数互斥,二者只能有一个。注意:var参数中的变量不需要使用{{}}表达式,而msg中需要。
    verbosity(integer) 默认:0 debug的调试级别,默认0是全部显示,级别调整到3是忽略内容不显示,如果verbosity参数设置为3还想像是debug内容的话,需要在命令后面加入 -vvv参数

    2、register注册变量,debug 用vat参数引用register 变量result。

    ---
    - name: Print debug infomation eg1 
      hosts: web 
      gather_facts: F 
      vars: 
        user: jingyong 
      tasks: 
      - name: Command run line 
        shell: date 
        register: result 
      - name: Show debug info 
        debug: var=result verbosity=0

    3、mgs:输出自定义信息,如果不指定或不写msg的话,默认会输出“null”

    ---
    - name: Print debug infomation eg1 
      hosts: web 
      gather_facts: F 
      vars: 
        user: jingyong 
      tasks: 
      - name: Command run line 
        shell: date 
        register: result 
      - name: Show debug info 
        debug: 
          msg: 这是一个msg自定义输出测试
    

    4、debug模块,msg表示打印自定义消息,获取变量{{}},x.stdout输出具体的值。

    ---
      - hosts: web
        tasks:
          - name: show hostname
            command: hostname
            register: name
          - name: print hostname
            debug: msg={{name.stdout}}
    

    5、debug与when连用

    ---
     - hosts: web
       tasks:
         - name: show debug msg
           debug:
             msg: System {{inventory_hostname}} has uuid {{ansible_product_uuid}}
         - name: print gateway when it is defined
           debug:
             msg: System {{inventory_hostname}} has gateway {{ansible_default_ipv4.gateway}}
           when: ansible_default_ipv4.gateway is defined  
         - name: show uptime
           shell: /usr/bin/uptime
           register: result
         - name: show uptime result
           debug:
             var: result
             verbosity: 2
         - name: display all vars of  a host
           debug:
             var: hostvars[inventory_hostname]
             verbosity: 3
         - name: print two lines of messages
           debug:
             msg:
                - "first line msg"
                - "second line msg"
    

    结果:两个skipping,是因为debug的调试级别不是0

    如果遇到报错: 手敲一遍。

    yaml文件格式要对其,同一级别的对象要放在同一列,几个空格不重要,不用有tab

    二、assert模块

    assert模块是用来断言 playbook中 给定的表达式。当表达式成功或失败时输出一些信息,帮助进行调试。

    assert模块可用作单元测试,每次修改playbook后,都通过 assert 断言判断有没有改变执行结果。

    assert模块有四个参数,分别是:

    fail_msg:当断言失败时输出的消息。
    
    success_msg:当断言成功时输出的消息。
    
    quite:当为yes时,如果成功就不输出任何消息,为no时,断言成功会输出消息。
    
    that:需要判断的表达式列表。

    例子:

    ---
    - hosts: web
      vars:
        command_result: 'the result is success'
        number_of_the_count: 5
        param: 90
      tasks:
      - name: assert param scope  断言参数范围
        assert:
          that:
            - param <= 100
            - param >= 0
          fail_msg: "'param' must be between 0 and 100"
          success_msg: "'param' is between 0 and 100"
      - name: use quiet to avoid verbose output
        assert:
          that:
            - param <= 100
            - param >= 0
          quiet: yes
      - name: print origin fail msg
        assert:
          that:
            - "'success' in command_result"
            - number_of_the_count == 4 
    

    三、fail模块

    fail模块是让当前所执行的任务失败,并输出信息。等与when一起使用时,可以在特定条件下让任务失败,以调试程序。

    比如:当status与期望值不符时,任务失败并输出变量的值。

    fail模块只有一个参数:

    msg:当任务失败时,输出特定的消息。如果没有指定,输出默认消息“Failed as requested from task”。
    

    例子:

    ---
     - hosts: web
       vars:
         number_of_the_count: 5
       tasks:
         - name: use fail module with when
           ignore_errors: yes
           fail:
             msg: "test  test test"
           when: number_of_the_count == 5 
         - name: use fail module
           fail:
    

    注意:不带参数,输出默认消息

    四、--start-at-task参数

    其中有个任务经常失败,需要不停的重试。如果在这个任务之前还有很多其他成功的任务,如果每次都从头执行,那么每次都需要执行那些已经成功的任务,效率就很低,这时可以通过--start-at-

    task参数指定这个特定的任务。

    ansible-playbook  assert.yml    --start-at-task="print origin fail msg"

    五、--step参数

    -step参数与--start-at-task参数不同,--start-at-task参数是从某个特定的任务开始,而--step是以交互的模式一步一步的执行。

    六、debugger调试工具

    开启方法:使用debugger关键字、使用配置文件或环境变量(二者默认都是task级别的)

    debugger关键的值有下面几个

    always:无论如何都会调用debugger。
    never:无论如何都不会调用debugger。
    on_failed:只有当任务失败的时候再调用debugger。
    on_unreachable:只有当主机不可达时再调用debugger。
    on_skipped:只有当任务skipped再调用debugger。
    

    Debugger中可用的命令

    在使用debugger进行调试时,是进入到一个交互模式窗口下,使用debugger提供的命令进行调试,有下面几种命令:

    1、打印这些模块的值。

    p task:打印出任务的名称
    p task_vars:打印任务的变量
    p task_args:打印任务的参数
    p host:打印当前主机
    p result:打印任务执行结果

    2、修改模块参数的值。

    task.args[key]=value

    3、修改模块变量的值

    task.vars[key]=value

    4、根据更新后的变量或参数值从新创建该task

    u(update_task)

    5、重新执行该task

    r(redo)

    6、继续执行后续的tasks

    c(continue)

    7、从debugger会话中退出。

    q(quit)
    

    实例

    ---
    - hosts: web
      debugger: on_failed
      gather_facts: no
      vars:
        info: debug this playbook
      tasks:
        - name: print the wrong variable
          ping:  data={{wrong_info}}
    

    通过p task.args命令查看当前的参数列表,通过task.args['data'] = '{{info}}'设置参数名,然后通过  命令重新执行该任务,再次执行时执行成功

    在ansible.cfg文件中:

    [defaults]
    enable_task_debugger = True
  • 相关阅读:
    sql优化
    多字段in
    最大值对应的行数据
    spring boot admin
    git + idea 操作
    css 多行溢出显示省略号失效
    Android输入系统(7)——Linux input子系统代码分析与调试 Hello
    Java中的正则表达式 Hello
    mybatis 中文路径报错处理
    React 18 之 useTransition
  • 原文地址:https://www.cnblogs.com/zjz20/p/15683546.html
Copyright © 2020-2023  润新知