2016-07-19 3 views
1

Я новичок в анзибльанзибль - Проверьте, если строка существует в файле

Можно ли проверить, если строка существует в файле с помощью анзибль.

Я хочу, чтобы проверить, пользователь имеет доступ к серверу. это можно сделать на сервере, используя cat /etc/passwd | grep username

, но я хочу, чтобы Ansible остановился, если пользователя нет.

Я пытался использовать lineinfile, но не могу заставить его вернуться.

код

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

Код выше добавляет пользователя в файл, если он не существует. Все, что я хочу сделать, это проверить. Я не хочу, чтобы изменить файл в любом случае, это возможно

Спасибо.

+0

Возможный дубликат [Только проверить, является ли строка присутствует в файле (анзибль)] (http://stackoverflow.com/questions/30786263/only-check-whether-a-line-present-in-a-file-ansible) – activatedgeek

ответ

5

я бы, вероятно, register and evaluate a variable.

Следующий простой Playbook работает для меня:

- 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" 
+0

анзибль имеет проблему с пользовательским 'accts.stdout. find' - это модуль или он должен запускаться как оболочка? –

+0

Это не настоящая вещь. Он проверяет содержимое переменной user_accts. См. Документацию, связанную с ответом. Я действительно не запускал код; Теперь я немного изменил свой ответ.Вышеупомянутое определенно работает для меня, хотя очевидно, что он ничего не делает, кроме печати сообщения об успешном завершении. – hillsy

+0

Это работает отлично, спасибо за помощь –

4

Если вы хотите, чтобы потерпеть неудачу, если нет пользователя:

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

По умолчанию shell модуль будет ошибкой, если команда выхода код не равен нулю ,
Так что это даст вам ok, если имя пользователя есть и в противном случае не работает.
Я использую changed_when: false, чтобы предотвратить состояние changed, когда grepping.

+0

Это также работает, но убивает остальные задачи, спасибо –

+0

Возможно, вы хотите, чтобы 'ignore_errors: yes' соответствовал https://docs.ansible.com/ansible/playbooks_error_handling.html#ignoring -failed-commands. –

+0

Исходный вопрос: _ «но я хочу, чтобы Ansible остановился, если пользователь не существует» _ - мой ответ делает именно это: выполнение остановлено, если пользователя нет. –

4

Это сложный вопрос. модуль 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 и т.д.


+0

Именно то, что я искал. –

Смежные вопросы