如何在一个或另一个任务中注册var

时间:2016-12-26 19:39:06

标签: ansible ansible-playbook

此任务集合并不像我希望的那样工作:

- 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,那么第二个任务会使其再次未定义(或至少为空),即使任务被跳过(因为没有)系统可以同时使用yumapt,至少不是我的。)

当然,我可以为每个yumapt检查注册不同的变量,但是在我的when:子句中我需要更多的逻辑,这是我想要避免的。

关于这个的任何好主意?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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,你也不在乎,因为你已经使用过了。

在由when: ansible_pkg_mgr == ...保护的块中为两个pkg管理器中的每一个放置查找/配置对将是另一种方式,并且将使订单/分组更重要。

相关问题