ansible 调试 debug、-vvv
一、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 参数 |
-vvv 参数报错很直观
ap deploy/start_monitor.yml -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自定义输出测试
var:打印变量值不需要{{ }},多个变量通过 “var1,var2,var3”
--- - hosts: 192.168.40.133 remote_user: root tasks: - name: test vars set_fact: _consul_data: '{{ consul.local_dir | default("/root/zjz" ~ "/consul") }}/data' _consul_config: '{{ consul.local_dir | default("/root/test" ~ "/consul") }}/config' - name: print vars debug: var: "_consul_data, _consul_config"
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}}'
设置参数名,然后通过 r
命令重新执行该任务,再次执行时执行成功
在ansible.cfg文件中:
[defaults] enable_task_debugger = True