将ansible任务与一个任务相结合,其中一个定义为“已更改”

时间:2018-05-25 13:34:07

标签: deployment compilation ansible

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

这将准确地描述情况,因为如果程序没有改变,那么通过运行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_when,而copy以及file会改变一些东西,尽管它们相互抵消。

如果ok没有改变,我可以将这个组合成一个报告/usr/local/bin/my_program的任务吗?如果是,那怎么样?如果不是,那么做这样的事情的“正确”方法是什么?

1 个答案:

答案 0 :(得分:1)

恕我直言,我建议像这样做Ansible。其他选项是生成脚本并通过command:调用它。然后用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