使用案例:将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
答案 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控制主机上的本地文件,因此无法工作。