基于事实的参数化的可靠命令,怎么做?

我正在更新我的一些可靠的手册,以运行最新版本的Fedora,现在默认使用dnf

由于我的大多数剧本都应该在CentOS上运行, 所以我希望我的脚本在运行CentOS机器时运行ansible yum命令,并且在运行Fedora时运行dnf命令(在Ansible 1.9中是新的)的作用是。

换句话说,我想编写一个能够智能地select右命令的操作(类似于):

 - name: Install zsh sudo: yes yum|dnf: name=zsh state=latest 

…而不是复制粘贴相同的命令两次,用dnfreplaceyum中的一个,然后实现一些逻辑,说明两个不同的angular色之一运行:

 - name: Install zsh (yum version) sudo: yes yum: name=zsh state=latest - name: Install zsh (dnf version) sudo: yes dnf: name=zsh state=latest 

在有人匆匆忙忙之前: 我知道在最新的Fedora中有一个dnf的别名,而且我可以直接离开剧本 …我的问题不是关于编写与CentOS / Fedora兼容的剧本,我的问题是关于根据目标环境select相同参数的不同命令

Ansible 2现在有一个通用的包pipe理器:

http://docs.ansible.com/ansible/package_module.html

对于旧版本,您可以通过事实来关联软件包pipe理器

 - name: Install packages with_items: package_list action: "{{ ansible_pkg_mgr }} state=installed name={{ item }}" 

现在,您只需要一些逻辑,将ansible_pkg_mgr设置为aptyum等等, when逻辑消失的时候。

看起来Ansible 也正在努力在未来的模块中做你想做的事情 。

据我所知,这是Ansible的一个更加混乱的部分。 我一直认为它应该有一个方法来弄清楚什么软件包pipe理器正在使用,而不需要我指定它。

与此同时,我有很多angular色,看起来像这样的任务:

 - name: Update OpenSSH on CentOS yum: name=openssh state=latest enablerepo=cr when: ansible_distribution == 'CentOS' and ansible_distribution_major_version|int == 7 notify: restart sshd - name: Update OpenSSH on RHEL yum: name=openssh state=latest when: ansible_distribution == 'RedHat' and ansible_distribution_major_version|int == 7 notify: restart sshd - name: Update OpenSSH on Fedora yum: name=openssh state=latest when: ansible_distribution == 'Fedora' andansible_distribution_major_version|int <= 21 notify: restart sshd - name: Update OpenSSH on Fedora dnf: name=openssh state=latest when: ansible_distribution == 'Fedora' andansible_distribution_major_version|int >= 22 notify: restart sshd - name: Update OpenSSH on Debian/Ubuntu apt: name=openssh-server state=latest when: ansible_os_family == 'Debian' notify: restart ssh 

这变得有点笨拙。 但是,它有其优点。 如果仔细检查,你会注意到CentOS版本是不同的; 它会在安装软件包时启用存储库。

当然这样做是有原因的。 在不同的系统上,你甚至可能会有不同的软件包名称 ,所以你最终可能不得不为他们完成不同的任务。 但是这是你可以在特定于操作系统的variables中推动,然后执行如下操作:

 - include_vars: common_os_{{ansible_distribution}}_{{ansible_distribution_major_version}}.yml - name: Install minimum system administration packages yum: name={{item}} state=present with_items: common_packages_admin when: ansible_os_family == 'RedHat' - name: Install minimum system administration packages apt: name={{item}} state=present with_items: common_packages_admin when: ansible_os_family == 'Debian' 

但是要扩大这个dnf将需要一堆额外的when:逻辑,这是很多工作绝对零增益,因为DNF的YUM兼容性将照顾它。 这是一个假设的“自动计算出使用哪个软件包pipe理器”模块的地方。

但即使你有一个,你仍然有时需要使用个别包pipe理器,因为其中一些有…特质。

 - name: Install salt-minion yum: name=salt-minion state=latest when: ansible_os_family == 'RedHat' - name: Install salt-minion apt: name=salt-minion state=latest update_cache=yes when: ansible_os_family == 'Debian' 

所以,我可以给你的最好的build议是:等到Ansible有一个更好的方式来处理包pipe理器。 或写一个…