ansible: 파일이 존재하지 않거나 소스가 최신인 경우 명령 실행

ansible: 파일이 존재하지 않거나 소스가 최신인 경우 명령 실행

의사 Makefile에는 다음 요구 사항이 있습니다.

/etc/postfix/sasl_passwd.db: /etc/postfix/sasl_passwd
  postmap /etc/postfix/sasl_passwd

즉, postmap <...>이 실행 중에 /etc/postfix/sasl_passwd.db존재하지 않거나 변경된 경우에만 실행하고 싶습니다 /etc/postfix/sasl_passwd.

나는 다음과 같은 작업을 생각해 냈습니다.

- name: /etc/potfix/sasl_passwd
  become: yes
  template:
    src: templates/sasl_passwd.j2
    dest: /etc/postfix/sasl_passwd
    mode: 0600
  register: sasl_passwd
- name: /etc/postfix/sasl_passwd.db exists?
  shell: test -f /etc/postfix/sasl_passdb.db
  failed_when: False
  register: sasl_passwd_exists
- name: postmap /etc/postfix/sasl_passwd
  become: yes
  shell: postmap /etc/postfix/sasl_passwd
  args:
    creates: /etc/postfix/sasl_passwd.db
  when: sasl_passwd.changed or sasl_passwd_exists.rc != 0
  1. 이것은 해킹처럼 보입니다.
  2. 항상 "/etc/postfix/sasl_passwd.db가 있습니까?"라고 표시됩니다. 단계가 변경되었습니다(예: 프롬프트에서 노란색).

when전제 조건을 무시하기 때문에 자르지 않습니다 sasl_passwd. 즉, 모든 종류의 파일이 sasl_passwd.db디스크에 저장되면 절대 실행되지 않습니다.

postup변경 후에 명령을 실행 하려면 어떻게 해야 합니까 sasl_passwd?

답변1

묻다:"항상 "/etc/postfix/sasl_passwd.db가 존재합니까?"라고 표시됩니다. `단계가 변경되었습니다(프롬프트에서 노란색). "

- name: /etc/postfix/sasl_passwd.db exists?
  shell: test -f /etc/postfix/sasl_passwd.db
  failed_when: False
  register: sasl_passwd_exists

답: 모듈shell속성 없음creates멱등성이 아닙니다. 모듈 사용통계자료대신에

- name: /etc/postfix/sasl_passwd.db exists?
  stat:
    path: /etc/postfix/sasl_passwd.db
  register: sasl_passwd_exists

결과 보기"sasl_passwd_exists". 이 조건을 사용하세요

  when: not sasl_passwd_exists.stat.exists

묻다:"어떤 유형의 sasl_passwd.db가 디스크에 있으면 절대 실행되지 않습니다."

- name: postmap /etc/postfix/sasl_passwd
  become: yes
  shell: postmap /etc/postfix/sasl_passwd
  args:
    creates: /etc/postfix/sasl_passwd.db
  when: sasl_passwd.changed or sasl_passwd_exists.rc != 0

A: 속성 삭제creates. 파일이 존재하면 작업이 실행되지 않습니다./etc/postfix/sasl_passwd.db존재하다. 당신이 원하는 것이 아닌가요? 다음에서 명령을 실행하고 싶습니다."sasl_passwd.changed"(또는 존재하지 않을 때).

- name: postmap /etc/postfix/sasl_passwd
  become: yes
  shell: postmap /etc/postfix/sasl_passwd
  when: sasl_passwd.changed or
        (not sasl_passwd_exists.stat.exists)

노트

쉘을 통해 명령을 실행하려면(<, >, | 등을 사용한다고 가정) 실제로 쉘 모듈이 필요합니다. 잘못 인용된 경우 쉘 메타 문자를 구문 분석하면 예상치 못한 명령이 실행될 수 있으므로 더 안전합니다.가능할 때마다 명령 모듈을 사용하십시오..

  • 사용매니저. 이것이 Ansible 방식입니다"변경 사항에 대한 조치". 예를 들어
tasks:
  - name: Notify handler when db does not exist.
    stat:
      path: /etc/postfix/sasl_passwd.db
    register: sasl_passwd_exists
    changed_when: not sasl_passwd_exists.stat.exists
    notify: run postmap
  - name: Create sasl_passwd and notify the handler when changed.
    become: yes
    template:
      src: templates/sasl_passwd.j2
      dest: /etc/postfix/sasl_passwd
      mode: 0600
    notify: run postmap

handlers:
  - name: run postmap
    become: true
    command: postmap /etc/postfix/sasl_passwd

(검증되지 않은)


  • 핸들러는 한 번만 실행됩니다. 인용하다매니저:

이러한 "알림" 작업은 게임의 각 퀘스트 블록이 끝날 때 트리거되며 여러 다른 퀘스트에서 알림을 받더라도 한 번만 트리거됩니다.

관련 정보