找到哪个文件声明了bash环境

时间:2016-03-15 20:51:33

标签: macos bash ansible

使用案例:将bash-completion添加到开发环境手册。

在OSX中,我需要通过Ansible写入.profile.bash_profile。我需要在其中一个文件中添加一些配置行,并希望对存在的任何一个文件执行此操作。我需要将这些行添加到自OSX looks for .bash_profile, .bash_login, then .profile and stops looking when it finds one of them以来存在的第一个文件中。

是否有可用于确定用于加载bash配置的文件的环境变量?

有没有办法在Ansible中创建一个变量,告诉Ansible要写入哪些文件,具体取决于列表中的第一个(.bash_profile.bash_login.profile那存在吗?

我在现有的playbook.yml中试过这个,它不会覆盖我最初声明的“bash_config”var:

    - hosts: localhost
      connection: local
      vars:
        bash_config: "{{ ansible_user_dir }}/.profile"

      tasks:
        - stat: path="{{ ansible_user_dir }}/.profile"
          register: bash_config
          when: bash_config.exists = true
        - stat: path="{{ ansible_user_dir }}/.bash_login"
          register: bash_config
          when: bash_config.exists = true
        - stat: path="{{ ansible_user_dir }}/.bash_profile"
          register: bash_config
          when: bash_config.exists = true

2 个答案:

答案 0 :(得分:1)

你几乎拥有它。以下是一些应该让它发挥作用的变化。

(我正在运行ansible版本2.0.0.1)。

如有疑问,应始终尝试使用调试模块。此外,当您尝试初始化变量bash_config时,您将其初始化为字符串。 stat模块返回字典的位置。统计模块http://docs.ansible.com/ansible/stat_module.html

的文档
- hosts: localhost
  connection: local

  tasks:
  - stat: path="{{ ansible_user_dir }}/.profile"
    register: profile_config
  - debug: var=profile_config

  - stat: path="{{ ansible_user_dir }}/.bash_login"
    register: profile_config
    when: profile_config.stat['exists'] != true
  - debug: var=profile_config

  - stat: path="{{ ansible_user_dir }}/.bash_profile"
    register: profile_config
    when: profile_config.stat['exists'] != true
  - debug: var=profile_config

答案 1 :(得分:1)

您可以使用with_first_found

- blockinfile:
    dest: "{{ item }}"
    block: |
      if [ -f `brew --prefix`/etc/bash_completion ]; then
        . `brew --prefix`/etc/bash_completion
      fi
  with_first_found:
    - files:
        - .bash_profile
        - .bash_login
        - .profile
      paths:
        - "{{ ansible_user_dir }}/"

未经过测试,只是想知道如何使用blockinfile模块归档您的目标。如果您不使用Ansible 2,则需要先从Galaxy下载blockinfile。

请注意,这只适用于您在localhost上播放。在远程主机上,由于with_first_found正在检查Ansible控制主机上的本地文件,因此无法工作。