我是Ansible的新手
是否可以使用Ansible检查文件中是否存在字符串。
我想检查用户是否有权访问服务器。
这可以使用cat /etc/passwd | grep username
但如果用户不在,我希望Ansible停止。
我曾尝试使用lineinfile
,但似乎无法让它返回。
代码
- name: find
lineinfile: dest=/etc/passwd
regexp=[user]
state=present
line="user"
如果他不在那里,上面的代码会将用户添加到文件中。我想做的就是检查。我不想以任何方式修改文件,这是否可能
感谢。
答案 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
允许您设置失败条件,即添加用户,因为在文件中找不到该用户。
根据您希望行为的内容,您可以使用多次迭代。与state
和regexp
相关的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!