Ansible用户模块 - 如何告诉它删除过期的用户帐户?

时间:2015-09-22 23:11:54

标签: ansible ansible-playbook userdel

我是第一次通过Ansible设置用户管理。我可以使用Ansible的用户模块删除超过其截止日期的帐户吗?我会使用什么条件陈述?

请原谅我未经测试的伪代码,但我正在寻找以下内容:

tasks:
 - name: remove expired users
   user: name=users.key state=absent force=yes
   when: expired  <----- what condition do I put here?
   with_dict: users

2 个答案:

答案 0 :(得分:3)

您可以使用shell module取回每个已过期主机上的用户列表(如useradd -e $expire_time中所示),然后将其传递给用户模块。

作为一个例子,我们可以设置一些现在到期的用户:

sudo useradd testexpires -e 2015-09-24
sudo useradd testexpires2 -e 2015-09-22
sudo useradd testexpires3 -e 2015-09-21
sudo useradd testexpires4 -e 2015-09-28
sudo useradd testexpires5 -e 2015-09-21

sudo cat /etc/shadow然后显示:

...
testexpires:!:16701:0:99999:7::16702:
testexpires2:!:16701:0:99999:7::16700:
testexpires3:!:16701:0:99999:7::16699:
testexpires4:!:16701:0:99999:7::16706:
testexpires5:!:16701:0:99999:7::16699:

然后我们可以通过使用这个合理可怕的贝壳衬里检查第8列中的纪元日期是否比现在更早:

sudo cat /etc/shadow | cut -d: -f1,8 | awk -F: '{if($2<{{ epoch_day }} && $2 != ""){print $0}}' | cut -d: -f1

我们可以使用Ansible内置的ansible_date_time变量轻松获取纪元日期,该变量以秒为单位提供纪元时间并使用Jinja's math filters进行划分:

epoch_day  : "{{ ansible_date_time.epoch | int / 86400 | round() }}"

把它放在一起(并在awk中删除引号)给我们一个剧本,如果你想在localhost上运行它会看起来像这样:

- hosts        : localhost
  connection   : local
  gather_facts : yes
  vars  :
    epoch_day  : "{{ ansible_date_time.epoch | int / 86400 | round() }}"
  tasks :    
    - name  : debug epoch day
      debug : var=epoch_day

    - name         : get users expired before today
      shell        : "cat /etc/shadow | cut -d: -f1,8 | awk -F: '{if($2<{{ epoch_day }} && $2 != \"\"){print $0}}' | cut -d: -f1"
      changed_when : False
      register     : expired_users

    - name  : debug expired_users
      debug : var=expired_users.stdout_lines

    - name : remove expired users
      user :
        name  : "{{ item }}"
        state : absent
        force : yes
      with_items : expired_users.stdout_lines

当您没有任何过期用户时运行此剧本将使Ansible跳过上一个任务,因为您没有任何项目可以传递给该任务。

答案 1 :(得分:1)

我只维护两个用户列表:&#34; current&#34;和&#34;前&#34;。不要删除用户,将其从一个列表移动到另一个列表。

tasks:
 - name: ensure users
   user: name=item.key state=present force=yes
   with_dict: current_users

tasks:
 - name: remove expired users
   user: name=item.key state=absent force=yes
   with_dict: former_users

如果您希望搜索用户帐户,则需要对其进行编写,删除系统帐户等。