2016-12-26 7 views
0

Эта коллекция задача не работает, как я надеялся, что это:Как зарегистрировать вар либо одной или другой задачи

- name: Find out whether syslog-ng is installed (yum) 
    tags: syslog_forwarding 
    command: yum -q list installed syslog-ng 
    register: syslog_ng_check 
    failed_when: False 
    changed_when: False 
    when: ansible_pkg_mgr == 'yum' 

- name: Find out whether syslog-ng is installed (apt) 
    tags: syslog_forwarding 
    command: dpkg -s syslog-ng 
    register: syslog_ng_check 
    failed_when: False 
    changed_when: False 
    when: ansible_pkg_mgr == 'apt' 

- name: Configure syslog-ng to forward all logs to syslog servers (apt) 
    tags: syslog_forwarding 
    template: 
    src: syslog_ng_forward_all.conf.j2 
    dest: /etc/syslog-ng/conf.d/syslog_forward.conf 
    notify: restart syslog_ng 
    when: syslog_ng_check is defined and syslog_ng_check.rc == 0 

- name: Configure syslog-ng to forward all logs to syslog servers (yum) 
    tags: syslog_forwarding 
    template: 
    src: syslog_ng_forward_all.conf.j2 
    dest: /etc/syslog-ng/conf.d/syslog_forward.conf 
    notify: restart syslog_ng 
    when: syslog_ng_check is defined and syslog_ng_check.rc == 0 

Я хотел сначала выяснить, была ли установлена ​​на системе syslog-ng (система может быть либо CentOS, либо Debian/Ubuntu), а затем действовать соответствующим образом (поместите файл конфигурации), когда это так, и сохраните задачу для размещения независимого дистрибутива файла конфигурации. Я обнаружил, что если первая задача фактически возвращает 0 и устанавливает syslog-ng-check.rc в 0, то вторая задача делает ее еще раз неопределенной (или, по крайней мере, пустой), хотя задача пропускается (поскольку никакая система не может быть используя yum и apt в то же время, по крайней мере, не мои).

Конечно, я мог бы регистрировать разные переменные для каждого yum и apt чеков, но тогда мне понадобилось бы больше логики в моем, когда: предложение, которое я хотел избежать.

Любые хорошие идеи по этому вопросу?

ответ

1

Есть только обходные пути. Пропущенные задачи всегда будут перезаписывать зарегистрированную переменную.

Один из возможных способов:

- name: Find out whether syslog-ng is installed (yum) 
    tags: syslog_forwarding 
    command: yum -q list installed syslog-ng 
    register: syslog_ng_check 
    failed_when: False 
    changed_when: False 
    when: ansible_pkg_mgr == 'yum' 

- set_fact: 
    syslog_ng_flag: True 
    when: syslog_ng_check.rc == 0 

- name: Find out whether syslog-ng is installed (apt) 
    tags: syslog_forwarding 
    command: dpkg -s syslog-ng 
    register: syslog_ng_check 
    failed_when: False 
    changed_when: False 
    when: ansible_pkg_mgr == 'apt' 

- set_fact: 
    syslog_ng_flag: True 
    when: syslog_ng_check.rc == 0 

- name: Configure syslog-ng to forward all logs to syslog servers (apt) 
    tags: syslog_forwarding 
    template: 
    src: syslog_ng_forward_all.conf.j2 
    dest: /etc/syslog-ng/conf.d/syslog_forward.conf 
    notify: restart syslog_ng 
    when: syslog_ng_flag | default(false) 
0

Почему не только слегка изменить порядок задач, чтобы сделать вашу задача «настроить» сразу за тестом («узнать ..») в пару, то есть:

- name: Find out whether syslog-ng is installed (yum) 
- name: Configure syslog-ng to forward all logs to syslog servers (yum) 
- name: Find out whether syslog-ng is installed (yum) 
- name: Configure syslog-ng to forward all logs to syslog servers (apt) 

Таким образом, даже если другой тест сбрасывает syslog_ng_check, вам все равно, потому что вы его уже использовали.

Помещение пары find/configure для каждого из двух менеджеров pkg в блоке, защищенном when: ansible_pkg_mgr == ..., будет другим способом и сделает более очевидным, что упорядочение/группировка важны.