Ansible - 检查文件中是否存在字符串

时间:2016-07-19 14:51:15

标签: ansible ansible-2.x

我是Ansible的新手

是否可以使用Ansible检查文件中是否存在字符串。

我想检查用户是否有权访问服务器。 这可以使用cat /etc/passwd | grep username

在服务器上完成

但如果用户不在,我希望Ansible停止。

我曾尝试使用lineinfile,但似乎无法让它返回。

代码

 - name: find
   lineinfile: dest=/etc/passwd
               regexp=[user]
               state=present
               line="user"

如果他不在那里,上面的代码会将用户添加到文件中。我想做的就是检查。我不想以任何方式修改文件,这是否可能

感谢。

4 个答案:

答案 0 :(得分:14)

这是一个棘手的问题。 lineinfile模块专门用于修改文件的内容,但您也可以将其用于验证检查。

- name: find
  lineinfile: 
    dest: /etc/passwd
    line: "user"
  check_mode: yes
  register: presence
  failed_when: presence.changed

check_mode确保它永远不会更新文件。 如上所述register保存变量。 failed_when允许您设置失败条件,即添加用户,因为在文件中找不到该用户。

根据您希望行为的内容,您可以使用多次迭代。与stateregexp相关的lineinfile文档应该允许您确定是否存在失败等,或者您可以执行not presence.changed等。

答案 1 :(得分:7)

我可能register and evaluate a variable

以下简单的剧本适合我:

- hosts: localhost
  tasks:

  - name: read the passwd file
    shell: cat /etc/passwd
    register: user_accts

  - name: a task that only happens if the user exists
    when: user_accts.stdout.find('hillsy') != -1
    debug: msg="user hillsy exists"

答案 2 :(得分:6)

如果您想在没有用户时失败:

tasks:
  - shell: grep username /etc/passwd
    changed_when: false

如果命令退出代码非零,则默认情况下shell模块将失败 如果用户名在那里,它会给你ok,否则就会失败 我在grepping时使用changed_when: false来阻止changed状态。

答案 3 :(得分:-1)

我正在使用以下方法,仅使用grep -q和注册变量。

好处是简单,缺点是输出中有FAILED行。 YMMV。

- name: Check whether foobar is defined in /bar/baz
  command:
    cmd: 'grep -q foobar /bar/baz'
  register: foobar_in_barbaz
  changed_when: false
  ignore_errors: true


- when: not foobar_in_barbaz.failed
  name: Do something when foobar is in /bar/baz
    ....


- when: foobar_in_barbaz.failed
  pause:
    seconds: 1
    content: |
      You do not seem to have a foobar line in /bar/baz
      If you add it, then magic stuff will happen!