此任务集合并不像我希望的那样工作:
- 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
检查注册不同的变量,但是在我的when:子句中我需要更多的逻辑,这是我想要避免的。
关于这个的任何好主意?
答案 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管理器中的每一个放置查找/配置对将是另一种方式,并且将使订单/分组更重要。