LINUX.ORG.RU

Как заблокировать пользователя через Ansible?

 , ,


0

1

Нужно заблокировать пользователя на всех серверах через Ansible. В файле ansible/hosts перечислены все хосты, даже те на которых пользователя нет.

Пишу playbook:

---
- hosts: users
  tasks:
  - include_vars: users.yml

  - name: Block user
    user:
    name: "{{item.username}}"
    shell: /bin/false
    with_items: "{{ users }}"

Но он добавляет пользователя даже на те сервера, где аккаунта не было. Как задать сначала проверку на существования пользователя и не добавлять его логин на сервера?



Последнее исправление: perrfect (всего исправлений: 4)

У тебя по умолчанию в задании - state: present, что означает создать пользователя с таким шелом.

Как проверить перед таской - я бы просто шелом грепнул, и если удачно - то дергал смену шела.

stave ★★★★★
()

Например используя include_tasks и делая проверку наличия юзера и операции с ним внутри таски (ну и цикл, конечно)

user.yml

---
- name: "check if user exists"
  shell: "grep -q {{ item }} /etc/passwd"
  ignore_errors: yes
  register: out

- name: "Action with user"
  debug:
    msg: "User {{ item }} exists"
  when: out.rc == 0

playbook.yml

---
- hosts: localhost
  tasks:
    - name: users
      include_tasks: user.yml
      loop:
        - mail
        - news
        - qwer
        - asdf

На выходе что-то вроде:

TASK [check if user exists] 
changed: [localhost]

TASK [Action with user] 
ok: [localhost] => {
    "msg": "User mail exists"
}

TASK [check if user exists] 
changed: [localhost]

TASK [Action with user] 
ok: [localhost] => {
    "msg": "User news exists"
}

TASK [check if user exists] 
fatal: [localhost]: FAILED! => {"changed": true, "cmd": "grep -q qwer /etc/passwd", "delta": "0:00:00.002596", "end": "2018-08-22 12:29:45.782598", "msg": "non-zero return code", "rc": 1, "start": "2018-08-22 12:29:45.780002", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring

TASK [Action with user] 
skipping: [localhost]

TASK [check if user exists] 
fatal: [localhost]: FAILED! => {"changed": true, "cmd": "grep -q asdf /etc/passwd", "delta": "0:00:00.002633", "end": "2018-08-22 12:29:46.044396", "msg": "non-zero return code", "rc": 1, "start": "2018-08-22 12:29:46.041763", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring

TASK [Action with user] 
skipping: [localhost]

Возможно саму проверку юзера можно оформить как лучше

anonymous
()
Ответ на: комментарий от anonymous

Далаю так, но оболчка пользователя не меняется:

---
- hosts: new_servers
  tasks:
  - include_vars: users.yml

  - name: Check that user exists
    shell: "grep -q {{item.username}} /etc/passwd"
    ignore_errors: yes
    register: user_exist
    with_items: "{{ users }}"

  - name: Block user
    user:
      name: "{{item.username}}"
      shell: /bin/false
    when: user_exist == "1"
    with_items: "{{ users }}"
perrfect
() автор топика

Потому что в одной итерации цикла (с одним значением юзера) должно выполняться 2 задачи. И переменная, хранящая состояние grep'a должна существовать между этими задачами

Ты же написал 2 независимых цикла. Т.е. сначала на всех хостах сделается grep для всего списка юзеров, в user_exist сохранится последнее состояние. А потом на всех хостах будет выполняться модуль user, с учетом этого последнего состояния user_exist, также для всего списка пользователей

ЗЫ register: user_exist и when: user_exist == «1» тоже неправильно лучше посмотри сначала, что попадает в «переменную»: - debug: var: user_exist и для проверки кода выполнения используй user_exist.rc

anonymous
()

Для начала неплохо бы подтянуть скил в ansible

Книга «mastering ansible», которую все хайпят - не очень хорошая, и её автор не умеет в систематизированное изложение

А вот официальная документация оставила приятное впечатление

https://docs.ansible.com/ansible/2.6/user_guide/index.html

router ★★★★★
()
Ответ на: комментарий от anonymous

grep -q {{ item }} /etc/passwd

Во избежание ложных срабатываний, предлагаю

id {{item}}

ну или честный awk с "-F ':'"

router ★★★★★
()

Ну и некоторый оффтоп

1) возможно, вместо блокировки подойдёт удаление. Это было бы проще, и condition не потребуются

2) не уверен, что изменения шела хватит для надёжной блокировки. Я бы для перестраховки залочил ещё из через chage и usermod

router ★★★★★
()
Последнее исправление: router (всего исправлений: 1)
Ответ на: комментарий от router

Удаления пока не нужно, возможно в дальнейшем нужно будет открыть доступ.

perrfect
() автор топика
Ответ на: комментарий от anonymous

Поменял user_exist == «1» на user_exist == 0 и debug сейчас показывает такую ошибку:

fatal: [second]: FAILED! => {"msg": "The conditional check 'userexist.rc == 0' failed. The error was: error while evaluating conditional (userexist.rc == 0): 'dict object' has no attribute 'rc'\n\nThe error appears to have been in '/etc/ansible/playbooks/block_users.yml': line 12, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n  - name: Block user\n    ^ here\n"}
perrfect
() автор топика
Ответ на: комментарий от perrfect

Если задача выполняется линейно (без циклов), то в register переменную попадает JSON вида:

ok: [localhost] => {
    "out": {
        ...
        "rc": 0, 
        ...
    }
}
Т.е. return_code находится в out.rc

Если есть цикл, то в JSON появляется список:

ok: [localhost] => {
    "out": {
        "changed": true, 
        "failed": true, 
        "msg": "All items completed", 
        "results": [
            {
                ...
                "rc": 0, 
                ...
            }, 
            {
                ...
                "rc": 0, 
                ...
            }, 
            {
                ...
                "rc": 1, 
                ...
            }, 
            {
                ...
                "rc": 1, 
                ...
            }
        ]
    }
}

return_code - out.results.0.rc, out.results.1.rc ... - для каждой итерации отдельно

можно вывести значение в модуле debug:

- debug:
    var: out

CaHbl4
()
# sometest_role
---
- set_fact:
    someusers:
      - sometest
      - pollinate
      - none
- name: some setup
  include_role:
    name: block_users
    tasks_from: main
  with_together: "{{ someusers }}"
# block_users
- name: Check that user exist
  shell: grep "^{{ grep_item }}:" /etc/passwd
  ignore_errors: yes
  register: user_evidential_existentiality
  with_items: "{{ someusers }}"
  loop_control:
    loop_var: grep_item

- name: debug
  debug:
    msg: "{{ user_item.grep_item }}"
  when: (user_item.rc != 1)
  with_flattened: "{{ user_evidential_existentiality.results }}"
  loop_control:
    loop_var: user_item
# site.yml
---
- name: Test
  hosts: allmyshittyhosts
  strategy: linear
  roles:
    - sometest_role
system-root ★★★★★
()
Последнее исправление: system-root (всего исправлений: 1)
Ответ на: комментарий от system-root

Проблема решена:

---
- hosts: new_servers
  tasks:
  - include_vars: users.yml

  - name: Check that user exists
    shell: "grep -q {{item.username}} /etc/passwd"
    ignore_errors: yes
    register: userexist
    with_items: "{{ users }}"

  - name: Block user
    user:
      name: "{{item.username}}"
      shell: /bin/false
    when: userexist is succeeded
    with_items: "{{ users }}"
perrfect
() автор топика
Ответ на: комментарий от perrfect

Проверил твой вариант - userexist is succeeded только если проверки всех юзеров успешные

Если в списке встречается отсутствующий на хосте юзер - userexists уже не succeeded и все действия в «Block user» игнорирутся

Почему так упорно не хочешь вынести 2 таски в отдельный .yml и динамически его импортировать с разными значениями users? Или сделать через role

CaHbl4
()
Ответ на: комментарий от CaHbl4

Попробую сделать так как Вы говорите. Но на данный момент юзеров не так часто нужно удалять. А если удалять, то юзер однозначно есть на сервере. Спасибо.

perrfect
() автор топика
Ответ на: комментарий от perrfect

Проблема решена

пф. никакого уважения к потраченном мною времени.

system-root ★★★★★
()

Потому что Ansible - ущерб. Пора открывать для себя NixOS.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.