我想使用 Ansible 根据操作系统版本分发不同的配置文件。
我想通过 ansible 事实来区分操作系统版本ansible_distribution这样我就不必手动分配操作系统版本。
我遇到的问题是,我不知道在哪里指定要为特定操作系统版本使用哪个版本的配置文件。
我想在剧本中分配这个变量,而不是在某些其他变量文件中,因为它绝对只在这个剧本中使用。
我想我会喜欢这样的东西:
- ansible_distribution == "Debian"
- vars:
vimrc_file = "vimrc.DEBIAN"
- ansible_distribution == "Ubuntu"
- vars:
vimrc_file = "vimrc.UBUNTU"
但我不确定 Ansible 是否可以这样工作(或者如果你应该这样使用它它是否可以工作)
我目前使用以下内容明显地是糟糕的原因如下:
---
- hosts: servers,workstations
tasks:
- name: Ensure vim is installed
apt: name=vim state=latest
- shell: echo "vimrc.DEBIAN"
changed_when: false
register: vimrc
- name: "Copy Debian vimrc file"
copy: src=/ansible/files/{{ vimrc.stdout }} dest=/etc/vim/vimrc
when: ansible_distribution == "Debian"
with_items: vimrc.stdout
- shell: echo "vimrc.UBUNTU"
changed_when: false
register: vimrc
- name: "Copy Ubuntu vimrc file"
copy: src=/ansible/files/{{ vimrc.stdout }} dest=/etc/vim/vimrc
when: ansible_distribution == "Ubuntu"
with_items: vimrc.stdout
...
(我刚刚开始使用 Ansible,我还在试图弄清楚它是否是我想要做的事情的正确工具,所以请原谅我对 Ansible 的糟糕使用)
编辑:我刚刚意识到这是一个糟糕的例子,因为我可以使用
/ansible/files/vimrc.{{ ansible_distribution }}
对于文件源。
如果文件目标在不同的操作系统上不同,我该如何分配正确的变量?
答案1
带有字典列表的示例剧本:
---
- hosts: localhost
connection: local
vars:
distribution_settings:
- distribution: "MacOSX"
vimrc_file: "vimrc.MACOSX"
vimrc_location: "/destination/path/on/mac"
- distribution: "Debian"
vimrc_file: "vimrc.DEBIAN"
vimrc_location: "/destination/path/on/debian"
tasks:
- set_fact:
current_distribution_settings: "{{ distribution_settings | selectattr('distribution', 'equalto', ansible_distribution) | list }}"
- debug:
var: current_distribution_settings[0].vimrc_file
- debug:
var: current_distribution_settings[0].vimrc_location
根据你的喜好进行定制。