如何在Ansible中基于OS类型运行剧本任务?

时间:2019-02-07 12:06:54

标签: linux macos shell ansible

我用ansible编写了剧本任务。我可以在linux端上运行剧本。

- name: Set paths for go
      blockinfile:
        path: $HOME/.profile
        backup: yes
        state: present
        block: |
          export PATH=$PATH:/usr/local/go/bin
          export GOPATH=$HOME/go
          export FABRIC_CFG_PATH=$HOME/.fabdep/config

    - name: Load Env variables
      shell: source $HOME/.profile
      args:
        executable: /bin/bash
      register: source_result
      become: yes

就像在Linux中一样,主目录中有.profile,但是在Mac中,macOS中没有.profile.bash_profile

因此,我想检查os是否为Mac,则路径应为$HOME/.bash_profile,如果os是基于linux的路径,则应查找$HOME/.profile

我尝试添加

when: ansible_distribution == 'Ubuntu' and ansible_distribution_release == 'precise'

但是它首先不起作用,而且它是长度过程。我想在变量中获取基于os的路径并使用它。

谢谢

3 个答案:

答案 0 :(得分:2)

我以此方式找到了解决方案。我在yaml文件顶部添加了gather_facts:true,它开始起作用。我开始将变量用作ansible_distribution

谢谢

答案 1 :(得分:0)

一个选项是从文件中 include_vars 。参见下面的示例

- name: "OS specific vars (will overwrite /vars/main.yml)"
  include_vars: "{{ item }}"
  with_first_found:
    - files:
        - "{{ ansible_distribution }}-{{ ansible_distribution_release }}.yml"
        - "{{ ansible_distribution }}.yml"
        - "{{ ansible_os_family }}.yml"
        - "default.yml"
      paths: "{{ playbook_dir }}/vars"
      skip: true

- name: Set paths for go
  blockinfile:
    path: "$HOME/{{ my_profile_file }}"
[...]

在playbooks目录中,创建目录 vars 并创建文件

# cat var/Ubuntu.yml
my_profile_file: ".profile"

# cat var/macOS.yml
my_profile_file: ".bash_profile"

答案 2 :(得分:0)

如果您托管的主机具有不同的操作系统,请按清单中的操作系统对主机进行分组:

Router.push