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

Fro*_*man 10 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"
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

小智 20

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

- name: find
  lineinfile: 
    dest: /etc/passwd
    line: "user"
  check_mode: yes
  register: presence
  failed_when: presence.changed
Run Code Online (Sandbox Code Playgroud)

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

根据您希望行为的内容,您可以使用多次迭代.lineinfile docs特别相关state,regexp应该允许你确定是否存在失败等,或者你可以做not presence.changed等等.



hil*_*lsy 11

我可能会注册并评估一个变量.

以下简单的剧本适合我:

- 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"
Run Code Online (Sandbox Code Playgroud)


Kon*_*rov 6

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

tasks:
  - shell: grep username /etc/passwd
    changed_when: false
Run Code Online (Sandbox Code Playgroud)

默认情况下,shell如果命令退出代码非零,则模块将失败.如果用户名在那里
会给你ok,否则就会失败.
changed_when: false用来防止changedgrepping时的状态.

  • 原始问题是_“但是如果用户不存在,我希望 Ansible 停止”_ – 我的答案就是这样:如果用户不存在,执行就会停止。 (3认同)