Deployment 将可执行任务合并为一个任务,并定义“已更改”

Deployment 将可执行任务合并为一个任务,并定义“已更改”,deployment,compilation,ansible,Deployment,Compilation,Ansible,作为部署的一部分,我想在主机上进行一些编译。这包括移动源文件、编译程序和删除源文件。我希望它能以这样一种方式工作,即如果程序没有改变,结果只是ok,而不是改变 这将准确地描述这种情况,因为如果程序没有改变,那么通过运行playbook,将创建一个假定不存在的目录,一个命令运行将产生一些文件,然后将其移动到相同副本所在的位置,然后源文件被删除,创建的目录再次不存在 具体而言,任务将类似于: - copy: src: src/ dest: /tmp/my_program_src/ -

作为部署的一部分,我想在主机上进行一些编译。这包括移动源文件、编译程序和删除源文件。我希望它能以这样一种方式工作,即如果程序没有改变,结果只是ok,而不是改变

这将准确地描述这种情况,因为如果程序没有改变,那么通过运行playbook,将创建一个假定不存在的目录,一个命令运行将产生一些文件,然后将其移动到相同副本所在的位置,然后源文件被删除,创建的目录再次不存在

具体而言,任务将类似于:

- copy:
    src: src/
    dest: /tmp/my_program_src/
- shell: my_compiler -o /usr/local/bin/my_program /tmp/my_program_src/main.file
  become: true
- file:
    path: /tmp/my_program_src/
    state: absent
当然,实际发生的是这三份报告都发生了变化;因为对于shell,我必须在自己修改时定义changed_,并复制和文件修改某些内容,尽管它们相互抵消


如果/usr/local/bin/my_程序没有更改,我是否可以将其组合成一个报告ok的任务?如果是的话,怎么办?如果没有,那么做这样的事情的“正确”方式是什么?

我建议你这样做。另一个选项是生成脚本并通过命令调用它:。然后用Ansible检查sha1,但我不喜欢这个选项

---
- name: Example
  hosts: localhost
  gather_facts: False
  connection: local

  tasks:

    - name: Get cksum of my program
      stat:
        path : "/usr/local/bin/my_program"
      register: myprogram1

    - name: Current SHA1
      set_fact:
        mp1sha1: "{{ myprogram1.stat.checksum }}"

    - name: Copy File
      copy:
        src: src/
        dest: /tmp/my_program_src/
      changed_when: False

    - name: Compile
      shell: my_compiler -o /usr/local/bin/my_program /tmp/my_program_src/main.file
      become: true
      changed_when: False

    - name: Remove src
      file:
        path: /tmp/my_program_src/
        state: absent
      changed_when: False

    - name: Get cksum of my program
      stat:
        path : "/usr/local/bin/my_program"
      register: myprogram2

    - name: Current SHA1
      set_fact:
        mp2sha1: "{{ myprogram2.stat.checksum }}"

    - name: Compilation Changed
      debug:
        msg: "Check Compilation"
      changed_when:  mp2sha1 == mp1sha1

不了解如何从3个分组任务中获得1个返回值。这是为了装饰吗?我想在主机上做一些编译ー 不要在主机上编译。问题消失了。@techraf但做了什么?将编译委托给localhost,然后复制结果,是否仍在ansible中?或者根本不用ansible编译?我这样做的原因之一是,在我的特殊情况下,raco要编译racket,使用不同版本的软件进行编译是相当困难的,而不是您用来运行程序的版本。@ilias sp我主要是在寻找“正确”的方法来做事情。我认为这三个步骤在涉及到幂等性与否时,没有彼此是没有意义的。但我想知道正确的方法,不管这是否意味着要对任务进行分组。