Ansible“命令”任务缺少“nginx”配置验证的“stdout”

Ansible“命令”任务缺少“nginx”配置验证的“stdout”

部署 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所有输出

根据为什么要写nginx版本呢stderr

Java 或 Python 等其他软件包正在向stderr也。

若要nginx.conf使用 Ansible 在部署过程中进行验证,您还可以查看


2>&1我尝试在末尾添加command,但引发了错误nginx: invalid option: "2>&1"

这也是预期的行为command模块 – 在目标上执行命令

命令不会通过 shell 处理,因此诸如、、、和之类的变量$HOSTNAME和操作将不起作用。使用*<>|;&ansible.builtin.shell如果您需要这些功能,请尝试使用模块。

相关内容