显示任务已更改,但任务具有条件(creates:)并且实际不执行的可能性很高



我的ansible剧本正在运行一些带有async标记的长时间运行的任务,并且还利用了"创建:";条件,因此它只在服务器上运行一次。当我昨天写剧本的时候,我很确定,当日志设置为";创建:";标签已存在。

不过,每次我运行它时,它都会显示更改。

我很困惑,因为我认为我没有更改任何内容,并且当条件为真时,我想将我的注册变量正确设置为未更改。

ansible播放的输出(调试部分显示任务已更改:true(:

    TASK [singleserver : Install Assure1 SingleServer role] *********************************************************************************************************************************
changed: [crassure1]
TASK [singleserver : Debug] *************************************************************************************************************************************************************
ok: [crassure1] => {
    "msg": {
        "ansible_job_id": "637594935242.28556",
        "changed": true,
        "failed": false,
        "finished": 0,
        "results_file": "/root/.ansible_async/637594935242.28556",
        "started": 1
    }
}

但是,如果我检查目标maschine上的实际结果文件,它正确地解决了条件,并且没有实际执行shell脚本,所以任务应该保持不变(显示消息,由于日志存在,任务被跳过(:

[root@crassure1 assure1]# cat "/root/.ansible_async/637594935242.28556"
{"invocation": {"module_args": {"warn": true, "executable": null, "_uses_shell": true, "strip_empty_ends": true, "_raw_params": "/opt/install/install_command.sh", "removes": null, "argv": null, "creates": "/opt/assure1/logs/SetupWizard.log", "chdir": null, "stdin_add_newline": true, "stdin": null}}, "cmd": "/opt/install/install_command.sh", "changed": false, "rc": 0, "stdout": "skipped, since /opt/assure1/logs/SetupWizard.log exists"}[root@crassure1 assure1]# Connection reset by 172.24.36.123 port 22

我的剧本部分如下:

- name: Install Assure1 SingleServer role
  shell:
    #cmd: "/opt/assure1/bin/SetupWizard -a --Depot /opt/install/:a1-local --First --WebFQDN crassure1.tspdata.local --Roles All"
    cmd: "/opt/install/install_command.sh"
  async: 7200
  poll: 0
  register: Assure1InstallWait
  args:
    creates: /opt/assure1/logs/SetupWizard.log
- name: Debug
  debug:
    msg: "{{ Assure1InstallWait }}"
- name: Check on Installation status every 15 minutes
  async_status:
    jid: "{{ Assure1InstallWait.ansible_job_id }}"
  register: job_result
  until: job_result.finished
  retries: 30
  delay: 900
  when: Assure1InstallWait is changed

是我遗漏了什么,还是某种虫子?

我受到配置的可信回购中可用的Ansible版本的限制,所以我使用的是Ansible 2.9.25

Q:">每次运行时,模块外壳都会显示更改">

A: 在异步模式下,不能立即跳过任务。首先,模块shell必须查明远程主机上是否存在文件/opt/assure1/logs/SetupWizard.log。然后,如果文件存在,模块将决定跳过命令的执行。但是,您可以异步运行任务。在这种情况下,Ansible启动模块并返回,而无需等待模块完成。这就是注册变量AssureInstallWait所说的内容。任务已开始,但尚未完成。

    "msg": {
        "ansible_job_id": "637594935242.28556",
        "changed": true,
        "failed": false,
        "finished": 0,
        "results_file": "/root/.ansible_async/637594935242.28556",
        "started": 1
    }

设置这样一个更改的任务的决定是正确的,我认为这是因为远程主机上的执行正在进行。

打印模块async的注册结果。您将看到,该命令被跳过是因为该文件存在(您已经在远程打印了异步文件(。这里的属性更改设置为false

  job_result:
    ...
    attempts: 1
    changed: false
    failed: false
    finished: 1
    msg: Did not run command since '/tmp/SetupWizard.log' exists
    rc: 0
    ...