我正在创建一个Ansible角色来创建用户并安装rbenv来运行我的Rails应用程序。
作为rbenv安装的一部分,您需要修改PATH并添加一行初始化rbenv填充程序到.bash_profile
。我想让这个角色成为幂等的。因此,我想检查.bash_profile
中是否已存在PATH和rbenv shim初始值设定项。
我有以下内容:
- name: Clone rbenv repo
git: repo=https://github.com/rbenv/rbenv.git
dest=/home/{{ rails_app_user }}/.rbenv
force=yes
update=no
- name: Check if rbenv exists in PATH
shell: grep 'export PATH="$HOME/.rbenv/bin:$PATH"' /home/{{ rails_app_user }}/.bash_profile
register: rbenv_path_exists
- name: Add rbenv to PATH
shell: echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> /home/{{ rails_app_user }}/.bash_profile
when: rbenv_path_exists.stdout_lines.count == 0
- name: Check if rbenv shims are installed
shell: grep 'eval "$(rbenv init -)"' /home/{{ rails_app_user }}/.bash_profile
register: rbenv_shim_exists
- name: Install rbenv shims
shell: echo 'eval "$(rbenv init -)"' >> /home/{{ rails_app_user }}/.bash_profile
when: rbenv_shim_exists.stdout_lines.count == 0
但是,当找不到匹配项时,grep似乎返回1,导致Ansible认为发生了致命错误,终止了剧本。我尝试在PATH下面附加ignore_errors: yes
并进行垫片检查。但是,这似乎导致变量未正确注册,导致由于when
子句而跳过PATH和shim安装步骤。
使用ignore_errors: yes
时的输出:
TASK [rails : Check if rbenv exists in PATH] ***********************************
fatal: [172.16.171.133]: FAILED! => {"changed": true, "cmd": "grep 'export PATH=\"$HOME/.rbenv/bin:$PATH\"' /home/app/.bash_profile", "delta": "0:00:00.005480", "end": "2016-01-30 04:08:01.971000", "failed": true, "rc": 1, "start": "2016-01-30 04:08:01.965520", "stderr": "", "stdout": "", "stdout_lines": [], "warnings": []}
...ignoring
TASK [rails : Add rbenv to PATH] ***********************************************
skipping: [172.16.171.133]
实现这一目标的惯用方法是什么?
答案 0 :(得分:1)
一般来说,如果使用提供的模块无法实现某些功能,那么您应该真正解决问题。这些模块将有助于使事物自动具有幂等性,并愉快地处理向Ansible标记是否有任何更改或是否失败 - 这可以通过shell
模块完成,但需要大量工作changed_when
和{ {3}}
在您的情况下,您可以使用failed_when
模块实现此目的。粗略看看你的具体情况可能看起来像这样:
- name: Add rbenv to PATH
lineinfile:
dest: /home/{{ rails_app_user }}/.bash_profile
regexp: ^export .* rbenv/bin
line: export PATH="$HOME/.rbenv/bin:$PATH"
- name: Install rbenv shims
lineinfile:
dest: /home/{{ rails_app_user }}/.bash_profile
regexp: '^eval .* rbenv init'
line: 'eval "$(rbenv init -)"'