我是 Ansible 的新手,有几台机器使用了pam_access
在 中配置的模块/etc/security/access.conf
。多行指定 ALLOW/DENY (+/-),然后指定用户或组以及要匹配的源 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 服务器上,因此将为该组插入 ACL(行前- : ALL : ALL
),如下所示:
+ : webdev : 10.137.198.0/24
- : ALL : ALL
一些 Web 服务器也运行passenger
。这些系统的开发人员以用户身份发布代码passenger
,因此允许该用户从开发 LAN 访问,但并非所有 Web 服务器都允许访问。
+ : passenger: 10.137.197.0/24
- : ALL : ALL
每台机器的规则都非常具体,我看不出有什么简单的方法来管理这个文件。我从下面的剧本和 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'
答案1
这是我最终使用的。也许对其他人有用。剧本将对每个主机应用基本 ACL,然后在目录下查找{{ acl_dir }}
具有当前正在配置的主机名称的附加 ACL。如果存在,则应用它。最后,最后附加默认拒绝规则。
我认为在文件开头添加一条注释会很好,可以记录文件最后更新的时间。这gather_facts
会增加很多执行时间,因此选择使用shell:
命令来获取日期。
---
- hosts: all
vars:
dest_file: /etc/security/access.conf
base_acl : base
acl_dir : ../group_vars/pam_access
gather_facts: false
tasks:
- name: "Empty existing ACL and replace with base ACL"
copy:
content: ""
dest : "{{ dest_file }}"
owner : root
group : root
mode : 0644
- name: "Get current date from shell rather than wait for gather_facts"
shell: date '+%Y-%m-%d'
register: date_now
- name: "Add ansible header with modified date to beginning of file"
copy:
content: "# updated via ansible on {{ date_now.stdout }} by {{ lookup ('env', 'LOGNAME') }}"
dest: "{{ dest_file }}"
owner : root
group : root
mode : 0644
- name: "Add base ACL {{ acl_dir }}/base to {{ inventory_hostname }}"
lineinfile:
dest: "{{ dest_file }}"
line: "{{ lookup ('file', '{{ acl_dir }}/{{ base_acl }}') }}"
- name: "Check for additional ACL {{ acl_dir }}/{{ inventory_hostname }}..."
stat:
path : "{{ acl_dir }}/{{ inventory_hostname }}"
register: host_acl
- name: "Add host specific ACL from {{ acl_dir }}/{{ inventory_hostname }}"
when: host_acl.stat.exists
lineinfile:
dest: "{{ dest_file }}"
line: "{{ lookup ('file', '{{ acl_dir }}/{{ inventory_hostname }}') }}"
- name: "Add default DENY as last ACL as a security precaution"
lineinfile:
dest: "{{ dest_file }}"
line: "- : ALL : ALL"
基本访问控制列表:
+ : 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
附加主机 ACL 名为websrv01.mydom.com
:
+ : webdev : 10.137.198.0/24
+ : passenger: 10.137.197.0/24