bertvv.samba
Ansible 角色 bertvv.samba
这是一个用于设置 Samba 文件服务器的 Ansible 角色。
由于时间和资源的限制,我已经将该角色的维护工作移交给了 @vladgh。我无法再跟进问题和拉取请求,也无法确保新的版本具有足够高的质量以便实际可用。
- 新的 GitHub 仓库地址:https://github.com/vladgh/ansible-collection-vladgh-samba
- Ansible Galaxy 页面:https://galaxy.ansible.com/vladgh/samba
- 可使用以下命令安装:
ansible-galaxy collection install vladgh.samba --upgrade
感谢多年来支持过我的每一个人,感谢所有贡献者,特别感谢 @vladgh 愿意伸出援手接管维护工作。
该角色的职责包括:
- 安装必要的软件包
- 配置 SELinux 设置(当 SELinux 处于活动状态时)
- 创建共享目录
- 管理 Samba 用户和密码
- 管理共享访问权限
以下项目不属于本角色的关注范围,应通过其他角色(例如 bertvv.rh-base)进行配置:
- 管理防火墙设置。
- 创建系统用户。Samba 用户应该已经作为系统用户存在。
如果您喜欢或使用此角色,请考虑给它一个星标!谢谢!
CVE-2017-7494
一个远程代码执行漏洞可能会影响您的 Samba 服务器安装。Samba 版本 3.5.0 和 4.6.4 之前的版本受此影响。如果您的系统启用了 SELinux,则 不 存在此漏洞。
该角色会检查已安装的 Samba 版本是否受到漏洞影响,并应用建议的解决方法:将 nt pipe support = no
添加到配置的 [global]
部分。请注意,这将禁用 Windows 客户端的共享浏览。
如果需要,您可以通过将角色变量 samba_mitigate_cve_2017_7494
设置为 false
来显式禁用此修复。
更多信息:https://access.redhat.com/security/cve/cve-2017-7494
需求
没有特定的要求
角色变量
变量 | 默认值 | 备注 |
---|---|---|
samba_apple_extensions |
no | 当为 yes 时,启用 Apple 特定 SMB 扩展的支持。这是 Time Machine 支持工作的必要条件(见下文) |
samba_create_varwww_symlinks |
false | 当为 true 时,在 Web 文档根目录中创建指向共享的符号链接。(var/www/ 或 /var/www/html ,取决于平台) |
samba_cups_server |
localhost:631 | 全局选项 cups server 的值(仅在 samba_printer_type 为 "cups" 时需要) |
samba_domain_master |
true | 当为 true 时,smbd 启用 WAN 范围的浏览列表聚合 |
samba_global_include |
- | 与 Samba 兼容的配置文件,包含需加载到 [global] 部分的选项(见下文) |
samba_guest_account |
- | 供未知用户使用的访客账户 |
samba_homes_include |
- | 与 Samba 兼容的配置文件,包含需加载到 [homes] 部分的选项(见下文) |
samba_interfaces |
[] | 用于浏览、名称注册等的网络接口列表 |
samba_load_homes |
false | 当为 true 时,用户家目录可以访问 |
samba_load_printers |
false | 当为 true 时,主机上的打印机被共享 |
samba_local_master |
true | 当为 true 时,nmbd 将尝试成为子网的本地主控 |
samba_log |
- | 设置日志文件。如果未定义,则通过 syslog 进行日志记录。 |
samba_log_size |
5000 | 设置日志文件的最大大小。 |
samba_log_level |
0 | 设置 Samba 日志级别,0 为最少冗长,10 为大量调试输出。 |
samba_map_to_guest |
bad user |
未注册用户访问共享时的行为。 |
samba_mitigate_cve_2017_7494 |
true | CVE-2017-7494 缓解措施会影响某些客户端,例如 macOS High Sierra。 |
samba_netbios_name |
{{ ansible_hostname }} |
此服务器的 NetBIOS 名称。 |
samba_passdb_backend |
tdbsam |
密码数据库后端。 |
samba_preferred_master |
true | 当为 true 时,表示 nmbd 是工作组的首选主浏览器 |
samba_realm |
- | 领域的域名 |
samba_printer_type |
cups | 全局选项 printing 和 printcap name 的值 |
samba_security |
user |
Samba 安全设置 |
samba_server_max_protocol |
- | 指定服务器提供的最大协议版本。 |
samba_server_min_protocol |
- | 指定服务器提供的最小协议版本。 |
samba_server_string |
fileserver %m |
服务器的注释字符串。 |
samba_shares_root |
/srv/shares |
共享目录创建在此目录下。 |
samba_shares |
[] | 包含共享定义的字典列表。详情见下文。 |
samba_users |
[] | 定义可以访问共享的用户的字典列表。 |
samba_wins_support |
true | 当为 true 时,Samba 将充当 WINS 服务器 |
samba_workgroup |
WORKGROUP |
服务器工作组的名称。 |
定义用户
为了允许用户访问共享,他们需要为 Samba 提供一个特定的密码:
samba_users:
- name: alice
password: ecila
- name: bob
password: bob
- name: charlie
password: eilrahc
不幸的是,密码目前必须以明文形式提供。此外,请注意该角色不会更改现有用户的密码。
这些用户应该已经在主机上拥有账户!创建系统用户并不是该角色的关注点,因此您应单独进行此操作。一个可选的方式是使用我的角色 bertvv.rh-base。示例如下:
rhbase_users:
- name: alice
comment: 'Alice'
password: !!
shell: /sbin/nologin
groups:
[...]
此用户不被允许在系统上登录(例如,使用 SSH),而只允许访问 Samba 共享。
定义共享
定义 Samba 共享和配置访问控制可能会很棘手,因为这不仅涉及到正确的 Samba 配置,还涉及用户和文件权限以及 SELinux 设置。该角色旨在简化此过程。
要指定共享,您至少需要给它一个名称:
samba_shares:
- name: readonlyshare
这将创建一个仅对注册用户可读的共享。访客将无法查看共享的内容。
为共享配置写入权限的一种好方法是创建一个系统用户组,将用户添加到该组,并确保他们对共享目录具有写入权限。该角色假设组已经设置好,用户是控制写入权限的组的成员。假设您有两个用户 jack
和 teach
,他们是 pirates
组的成员。这个共享定义将为 pirates
提供读取和写入权限:
samba_shares:
- name: piratecove
comment: 'A place for pirates to hang out'
group: pirates
write_list: +pirates
访客无法访问此共享,注册用户可以读取。您可以进一步调整访问控制。可以将读取权限扩展给访客(添加 public: yes
)或限制给指定用户或组(添加 valid_users: +pirates
)。写入权限可以限制给单个用户(例如 write_list: jack
)。添加到共享的文件将被添加到指定组,并默认授予组的写入权限。
以下是配置多个 VFS 对象模块以共享 glusterfs 卷的示例。VFS 对象选项是可选的。所需的 VFS 对象模块必须在此角色之外存在/安装。在这种情况下,samba-glusterfs 已在 centos 上安装。有关如何安装或默认 VFS 对象模块的详细信息,请参阅 Samba 文档。
samba_shares:
- name: gluster-app_deploys
comment: 'For samba share of volume app_deploys'
vfs_objects:
- name: audit
options:
- name: facility
value: LOCAL1
- name: priority
value: NOTICE
- name: glusterfs
options:
- name: volume
value: app_deploys
- name: logfile
value: /var/log/samba/glusterfs-app_deploys.%M.log
- name: loglevel
value: 7
path: /
read_only: no
guest_ok: yes
write_list: tomcat
group: tomcat
下面是共享选项的完整概述。只有 name
是必需的,其余是可选的。
选项 | 默认值 | 备注 |
---|---|---|
browseable |
- | 控制此共享是否显示在文件浏览器中。 |
comment |
- | 共享的注释字符串 |
create_mode |
0664 |
有关详细信息,请参阅 Samba 文档。 |
directory_mode |
0775 |
有关详细信息,请参阅 Samba 文档。 |
include_file |
- | 与 Samba 兼容的配置文件,包含给此共享的选项(见下文)。 |
force_create_mode |
0664 |
有关详细信息,请参阅 Samba 文档。 |
force_directory_mode |
0775 |
有关详细信息,请参阅 Samba 文档。 |
group |
users |
将用户组文件添加到共享。 |
guest_ok |
- | 允许访客访问。 |
name (必需) |
- | 共享的名称。 |
owner |
root |
设置路径的所有者 |
path |
/{{samba_shares_root}}/{{name}} | 共享目录的路径。 |
public |
no |
控制访客用户的读取权限 |
setype |
samba_share_t |
共享目录的 SELinux 类型 |
valid_users |
- | 控制注册用户的读取权限。使用相应 Samba 设置的语法。 |
vfs_objects |
- | 有关详细信息,请参阅 Samba 文档。 |
writable |
- | 对访客可写。 |
write_list |
- | 控制注册用户的写入权限。使用相应 Samba 设置的语法。 |
valid_users
和 write_list
的值应为用逗号分隔的用户列表。以 +
或 @
开头的名称被解释为组。有关这些选项的更多详细信息,请参阅 Samba 配置。
添加任意配置文件
您可以通过自定义配置文件添加此角色未支持的设置,这些文件将从主配置文件中包含。有三种类型的包含文件:用于全局部分、用于家目录部分以及用于单独共享。将自定义配置文件放在相对于主剧本位置的子目录 templates
中。然后,在变量 samba_global_include
、samba_homes_include
或 include_file
中指定它们。
您的自定义配置文件被视为 Jinja 模板,因此您可以在其中使用 Ansible 变量。这些配置文件将被验证以确保它们在语法上是正确的。
例如,要包含 templates/global-include.conf
,设置:
samba_global_include: global-include.conf
请注意,指定 templates/
目录不是必需的。
同样,要包含针对 piratecove
共享的 templates/piratecove-include.conf
(见上面的示例);设置:
samba_shares:
- name: piratecove
comment: 'A place for pirates to hang out'
group: pirates
write_list: +pirates
include_file: piratecove-include.conf
test playbook 中有一些示例。自定义配置文件可以在 docker-tests 分支中找到。
依赖关系
没有依赖项。
示例剧本
请参阅 test playbook
测试
此角色使用 Ansible Molecule 进行测试。每次提交和拉取请求后,测试会在 Travis CI 中自动启动。
此 Molecule 配置将:
- 运行 Yamllint 和 Ansible Lint
- 创建一个 Docker 容器
- 运行语法检查
- 使用 test playbook 应用该角色
- 使用 BATS 运行验收测试
该过程将对支持的 Linux 发行版重复进行。
本地测试环境
如果您希望设置本地测试环境,可以使用基于 Vagrant+VirtualBox 的可重现设置:https://github.com/bertvv/ansible-testenv。手动安装必要工具的步骤:
- 应在您的计算机上安装 Docker、BATS 和 smbclient(假设运行 Linux)。当您开始测试时,不应运行任何 Docker 容器。
- 按照 Molecule 的推荐,创建一个 Python 虚拟环境
- 安装软件工具
python3 -m pip install molecule docker yamllint ansible-lint
- 导航到角色目录的根目录并运行
molecule test
Molecule 会在测试后自动删除容器。如果您希望自己查看容器,请运行 molecule converge
,然后运行 molecule login --host HOSTNAME
。
Docker 容器基于 Jeff Geerling 创建的图像,专为 Ansible 测试而设(请寻找名为 geerlingguy/docker-DISTRO-ansible
的图像)。您可以使用他的任何图像,但仅支持 meta/main.yml 中提到的发行版。
默认配置将启动一个 Centos 7 容器。通过设置 MOLECULE_DISTRO
变量选择其他发行版,例如:
MOLECULE_DISTRO=debian9 molecule test
或
MOLECULE_DISTRO=debian9 molecule converge
您可以通过 molecule verify
在两台服务器上运行验收测试,或手动运行
SUT_IP=172.17.0.2 bats molecule/default/files/samba.bats
您需要初始化变量 SUT_IP
,即待测系统的 IP 地址。服务器 smb1
的 IP 地址应为 172.17.0.2。
贡献
欢迎提出问题、功能请求和想法,可以在 Issues 部分发布。
也非常欢迎拉取请求。提交 PR 的最好方式是先创建此 GitHub 项目的分叉,然后为建议的更改创建主题分支,并将该分支推送到您的分叉中。然后 GitHub 可以轻松基于该分支创建 PR。不要忘记在下面的贡献者列表中添加您自己!
许可
2-Clause BSD 许可证,详见 LICENSE.md
贡献者
该角色的实现得益于下面列出的人们的贡献。如果您有进一步改进的想法,请随时参与!
欢迎在 Issues 部分发布问题、功能请求、想法、建议等。
也非常欢迎拉取请求。请为您的建议更改创建主题分支。如果您不这样做,在合并后将会导致您的分叉中出现冲突。请在您的 PR 中随时添加自己到下面的贡献者列表中!
Ben Tomasik, Bengt Giger, Bert Van Vreckem(维护者), Birgit Croux, DarkStar1973, George Hartzell, Ian Young, Jonas Heinrich, Jonathan Underwood, Karl Goetz, morbidick, Paul Montero, Slavek Jurkowski, Sven Eeckeman, Tiemo Kieft, Tobias Wolter, Tomohiko Ozawa, Robin Ophalvens.
This role installs and configures Samba as a file server. Deprecated, please use vladgh.samba instead.
ansible-galaxy install bertvv.samba