部署 Nginx 的新配置后,我想在应用 Nginx 重新加载处理程序之前验证配置。这是命令行的输出:
nginx -t && echo $?
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
0
根据上面的输出,我配置了 Ansiblecommand
任务如下:
- name: Verify Nginx config
become: yes
command: nginx -t
register: nginx_verify_config
check_mode: no
changed_when: "'syntax is ok' not in nginx_verify_config.stdout"
- debug:
msg: "{{nginx_verify_config.stdout}}"
changed_when
仅当命令输出缺失时才应显示某些更改syntax is ok
。这不起作用,我发现,消息如下nginx_verify_config
所示:
ok: [DevNgx] => {
"msg": {
"changed": true,
"cmd": [
"nginx",
"-t"
],
"delta": "0:00:00.018083",
"end": "2023-04-14 14:44:16.656261",
"failed": false,
"msg": "",
"rc": 0,
"start": "2023-04-14 14:44:16.638178",
"stderr": "nginx: the configuration file /etc/nginx/nginx.conf syntax is ok\nnginx: configuration file /etc/nginx/nginx.conf test is successful",
"stderr_lines": [
"nginx: the configuration file /etc/nginx/nginx.conf syntax is ok",
"nginx: configuration file /etc/nginx/nginx.conf test is successful"
],
"stdout": "",
"stdout_lines": []
}
}
为什么消息存储在stderr
部分下msg
并且stdout
是空的?
2>&1
我尝试在命令末尾添加,但引发了错误nginx: invalid option: "2>&1"
。
答案1
您可以检查返回代码本身,而不必依赖字符串输出(如果配置无效,nginx 将返回非零 rc):
- name: check nginx configuration
become: yes
command: "nginx -t"
register: nginx_verify_config
check_mode: no
changed_when: "nginx_verify_config.rc != 0"
您还应该考虑检查配置文件部署前nginx -t -c /path/to/conf-file
,在你的验证器中运行前您部署配置,否则您的状态变化不一致,并且您必须处理回滚可能导致一大堆其他问题的更改。
答案2
为什么消息存储在
stderr
部分下msg
并且stdout
是空的?
因为
自推出以来,它就是这样工作的 -
nginx
始终如一地用于stderr
所有输出
Java 或 Python 等其他软件包正在向stderr
也。
若要nginx.conf
使用 Ansible 在部署过程中进行验证,您还可以查看
2>&1
我尝试在末尾添加command
,但引发了错误nginx: invalid option: "2>&1"
。
这也是预期的行为command
模块 – 在目标上执行命令
命令不会通过 shell 处理,因此诸如、、、和之类的变量
$HOSTNAME
和操作将不起作用。使用*
<
>
|
;
&
ansible.builtin.shell如果您需要这些功能,请尝试使用模块。