可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I'm very new to Ansible
Is it possible to check if a string exists in a file using Ansible.
I want to check is a user has access to a server. this can be done on the server using cat /etc/passwd | grep username
but I want Ansible to stop if the user is not there.
I have tried to use the lineinfile
but can't seem to get it to return.
code
- name: find lineinfile: dest=/etc/passwd regexp=[user] state=present line="user"
The code above adds user to the file if he is not there. All i want to do is check. I don't want to modify the file in any way, is this possible
Thanks.
回答1:
I'd probably register and evaluate a variable.
The following simple playbook works for me:
- 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:
It's a tricky one. the lineinfile module is specifically intended for modifying the content of a file, but you can use it for a validation check as well.
- name: find lineinfile: dest: /etc/passwd line: "user" check_mode: yes register: presence failed_when: presence.changed
check_mode
ensures it never updates the file. register
saves the variable as noted. failed_when
allows you to set the failure condition i.e. by adding the user because it was not found in the file.
There are multiple iterations of this that you can use based on what you want the behavior to be. lineinfile docs particular related to state
and regexp
should allow you to determine whether or not presence or absence is failure etc, or you can do the not presence.changed
etc.
回答3:
If you want to fail if there is no user:
tasks: - shell: grep username /etc/passwd changed_when: false
By default shell
module will fail if command exit code is non zero.
So it will give you ok
if username is there and fails otherwise.
I use changed_when: false
to prevent changed
state when grepping.