如何让 changed_when 在 Ansible 中工作?

Posted

技术标签:

【中文标题】如何让 changed_when 在 Ansible 中工作?【英文标题】:How to make changed_when work in Ansible? 【发布时间】:2017-02-07 14:28:36 【问题描述】:

我正在尝试使用 Jenkins 服务器上的命令模块运行脚本。该脚本的编写方式是,如果不进行任何配置更改并且不应更改 Ansible 任务,它应该返回 0。

代码如下:

  - name: Script to run
    command: java -jar /var/cache/jenkins/war/WEB-INF/jenkins-cli.jar -s http://localhost:8080 groovy " jenkins_home /userContent/script.groovy"
    register: return_code
    changed_when: return_code.stdout != 0

但上述代码的行为总是显示为已更改。

Ansible 输出:

TASK [jenkins : 运行脚本] ************************************

更改:[测试] => “更改”:true,“cmd”:[“java”,“-jar”,“/var/cache/jenkins/war/WEB-INF/jenkins-cli.jar ", "-s", "http://localhost:8080", "groovy", "/var/lib/jenkins/userContent/script.groovy"], "delta": "0:00:01.547098", "end": " 2017-02-06 15:31:05.989134", "rc": 0, "start": "2017-02-06 15:31:04.442036", "stderr": "[WARN] 无法使用您的 SSH 密钥进行身份验证. 匿名处理", "stdout": "0", "stdout_lines": ["0"], "warnings": []

【问题讨论】:

return 0”你的意思是它打印0或者返回码是0? 试试 return_code.rc != 0. 我已经尝试过了,但它不起作用。 @techraf by return 0 意味着我在脚本中有实现,如果没有任何变化返回 0; 试试 return_code.stdout != '0' 【参考方案1】:

您需要将stdout 值与字符串而不是整数进行比较:

- name: Script to run
  command: java -jar /var/cache/jenkins/war/WEB-INF/jenkins-cli.jar -s http://localhost:8080 groovy " jenkins_home /userContent/script.groovy"
  register: script_call
  changed_when: script_call.stdout != "0"

【讨论】:

您能否详细说明为什么我需要将 0 放在引号中。这将是一个很大的帮助。 答案第一句已经写好了。哪个词你不清楚? 我理解你的回答我不清楚的是这个概念,因为它应该基于退出代码,即 0 而不是“0” 但是我特别问你你的意图是什么,你添加了一个清楚地显示"stdout": "0" 的日志,这不是退出代码,而是标准输出。如果你想检查返回码,你应该使用script_call.rc != 0

以上是关于如何让 changed_when 在 Ansible 中工作?的主要内容,如果未能解决你的问题,请参考以下文章

ansible自动化部署之路笔记

网络自动化之Ansible模块的构建-1

Ansible 文档译文Playbooks 变量

运维自动化之ansible的安装与使用(包括模块与playbook使用)

在詹金斯调用Ansible剧本

Ansible