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
允许您设置失败条件,即添加用户,因为在文件中找不到它。
您可以根据自己想要的行为使用多次迭代。 lineinfile 与 state
和 regexp
相关的文档应该允许您确定存在或不存在是否失败等,或者您可以执行 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!
我是 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
允许您设置失败条件,即添加用户,因为在文件中找不到它。
您可以根据自己想要的行为使用多次迭代。 lineinfile 与 state
和 regexp
相关的文档应该允许您确定存在或不存在是否失败等,或者您可以执行 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!