现象
部署TiDB之前,希望先通过添加--check
参数来检查环境是否满足部署条件,比如在滚动升级TiDB之前,通过如下命令做部署前检查
ansible-playbook rolling_update.yml --tags=tidb --check
但是当运行至NTP
服务检查时,报错了。
Ansible FAILED! => playbook: rolling_update.yml; TASK: check_config_dynamic : Preflight check - NTP service; message: {"msg": "The conditional check 'ntp_st.stdout|int != 1' failed. The error was: error while evaluating conditional (ntp_st.stdout|int != 1): 'dict object' has no attribute 'stdout'\n\nThe error appears to have been in '/tidb-ansible/roles/check_config_dynamic/tasks/main.yml': line 19, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: Preflight check - NTP service\n ^ here\n"}_
这里实际是通过SSH在目的主机运行shell命令并根据输出结果来判断是否通过的,但上面错误信息可以看出shell命令没有得到执行。
分析
需要搞清楚ntp_st
的输出到底是什么,ansible中可以通过如下方式添加调试信息。
tidb-ansible/roles/check_config_dynamic/tasks/main.yml
- name: Preflight check - Set NTP service status
shell: ntpstat | grep -w synchronised | wc -l
register: ntp_st
changed_when: false
when: enable_ntpd
- debug: msg=" value is {{ ntp_st }} "
输出结果为
ok: [10.x.x.x] => {
"msg": " value is {u'msg': u'remote module (command) does not support check mode', 'failed': False, u'skipped': True, 'changed': False} "
}
可以看出在check mode下,远程命令并不能执行。。
解决
ansible 2.2之后可以通过修改配置的方式来强制check mode执行shell命令
- name: Preflight check - Set NTP service status
shell: ntpstat | grep -w synchronised | wc -l
register: ntp_st
changed_when: false
when: enable_ntpd
check_mode: no
添加check_mode: no
之后,就可以顺利继续执行了。