如何使用Ansible检查文件中是否存在行?

时间:2016-01-30 09:16:07

标签: ruby-on-rails linux grep ansible ansible-playbook

我正在创建一个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]

实现这一目标的惯用方法是什么?

1 个答案:

答案 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 -)"'