Ansible 新手,有几台机器pam_access
使用/etc/security/access.conf
. 多行指定 ALLOW/DENY (+/-),然后指定用户或组以及要匹配的 src IP 地址。
在 Ansible 中管理这个文件的更简洁的方法是什么?
该文件/etc/security/access.conf
看起来像这样:
+ : root : cron crond :0 ttyS0 tty1 tty2 tty3 tty4 tty5 tty6
+ : root : 10.137.198.176
+ : inventory: 10.137.198.25
+ : sysadmin : 10.137.198.202
- : ALL : ALL
大多数机器将使用此基本 ACL,然后可以根据需要添加其他组或用户。Web 开发人员通过 SFTP 在两个 Web 服务器上登录,因此将为该组(- : ALL : ALL
行前)插入 ACL,如下所示:
+ : webdev : 10.137.198.0/24
- : ALL : ALL
一些 Web 服务器也运行passenger
. 这些系统的开发人员以用户身份推出代码passenger
,因此允许该用户从开发 LAN 中访问,但这并非在所有 Web 服务器上。
+ : passenger: 10.137.197.0/24
- : ALL : ALL
对于每台机器,规则变得非常具体,我看不到管理此文件的简单方法。我从下面的 playbook 和 group_vars 开始,但对于同一台机器有多个定义需要帮助。可能需要剧本中的数组定义line:
并进行调查。
此外,此模型每次都需要重新写入文件,因为从中删除主机group_vars
不会从access.conf
. 的唯一状态lineinfile
是absent
或present
。我需要一个名为add_line_if_missing_remove_if_absent_from_vars
. 有没有更好的办法?
- hosts: all
vars_files:
- ../group_vars/test-etc-security-access-conf.yml
gather_facts: false
tasks:
- name: "Set up /etc/security/access.conf for {{ inventory_hostname }}"
when: inventory_hostname is match (item.name)
lineinfile:
dest : /tmp/access.conf
regexp: '{{ item.regexp }}'
line: '{{ item.line }}'
with_items: "{{ access_rules }}"
group_vars - 必须是更好的方法:
access_rules:
- name: 10.137.1.66
regexp: '.*passenger.*'
line: '+ : passenger : 10.137.10.0/24'
- name: 10.137.1.66
regexp: '.*webdev.*'
line: '+ : webdev : 10.137.198.0/24'
这就是我最终使用的。也许它对其他人有用。
{{ acl_dir }}
playbook 会将基本 ACL 应用到每个主机,然后在目录下查找具有当前配置的主机名称的附加 ACL 。如果存在,它将被应用。最后,最后附加默认拒绝规则。我认为文件开头的注释会很高兴注意到文件上次更新的时间。
gather_facts
增加了很多执行时间,所以选择了shell:
命令来获取日期。基本 ACL:
名为的附加主机 ACL
websrv01.mydom.com
: