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

Ansible - Check if string exists in file

我是 Ansible 的新手

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

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

完成

但我希望 Ansible 在用户不在时停止。

我已经尝试使用 lineinfile,但似乎无法使用 return。

代码

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

如果用户不在,上面的代码会将用户添加到文件中。我只想检查一下。我不想以任何方式修改文件,这可能吗

谢谢。

我可能会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"

如果你想在没有用户的情况下失败:

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

默认情况下 shell 如果命令退出代码不为零,模块将失败。
因此,如果用户名存在,它会给你 ok,否则会失败。
我使用 changed_when: false 来防止 grepping 时出现 changed 状态。

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

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

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

您可以根据自己想要的行为使用多次迭代。 lineinfilestateregexp 相关的文档应该允许您确定存在或不存在是否失败等,或者您可以执行 not presence.changed


我正在使用以下方法,仅使用一个 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!