hannseman.raspbian
ansible-raspbian
此角色将设置一个带有合理默认值的安全基本 Raspbian 环境。
它将会:
- 安装指定的系统包。
- 配置主机名。
- 配置区域设置。
- 在写入密集的目录上挂载 tmpfs,以延长 SD 卡的使用寿命。
- 更改默认用户的密码。
- 设置默认文本编辑器。
- 设置安全的 SSH 配置。
- 配置 UFW(防火墙)。
- 配置 /boot/config.txt。
- 运行 raspi-config。
- 配置 Postfix 通过 SMTP 中继发送电子邮件。
- 启用无用户干预升级。
- 安装 Fail2ban。
- 配置 Logwatch 以发送每周报告。
它不会:
- 更新系统包。
- 运行
apt-get update
。请在预任务中执行此操作。参见 示例剧本。 - 安装安全补丁,但无用户干预升级应该会处理这个问题。
安装设置
- 通过运行
pip install -r requirements.txt
安装 Python 依赖。 - 通过运行
sudo apt-get install sshpass
安装 sshpass。 - 使用 Raspbian Stretch Lite 刷写 SD 卡。
- 在刷写的 SD 卡的引导分区中添加一个名为
ssh
的空文件。 - 可选:要启用 WiFi,在刷写的 SD 卡的引导分区中放置一个名为
wpa_supplicant.conf
的文件,内容如下:
network={
ssid="您的SSID"
psk="您的密码"
}
- 运行剧本。
清单
首次运行 Ansible 时需要 sshpass,默认密码为 raspberry
。然后将禁用基于密码的 SSH 认证,改为使用 ssh_public_keys
中指定的公钥认证。
您的清单应包含以下内容:
[all:vars]
ansible_connection=ssh
ansible_user=pi
ansible_ssh_pass=raspberry
变量
# 设置系统主机名
system_hostname: "raspberrypi"
# ansible_ssh_user 的系统密码(应配置为 pi)。
# 注意:应更改为安全的密码。
system_ssh_user_password: "raspberry"
# 使用的密码盐。
# 注意:应更改为安全且随机的值。
system_ssh_user_salt: "salt"
# 系统区域设置
system_locale: "en_US.UTF-8"
# 系统时区
system_timezone: "Europe/Stockholm"
# 列出期望挂载的 tmpfs 目录。
system_tmpfs_mounts:
- { src: "/run", size: "10%", options: "nodev,noexec,nosuid" }
- { src: "/tmp", size: "10%", options: "nodev,nosuid" }
- { src: "/var/log", size: "10%", options: "nodev,noexec,nosuid" }
# apt-get 安装的包列表
system_packages: []
# 默认编辑器的路径
system_default_editor_path: "/usr/bin/vi"
# Logwatch 缓存目录
logwatch_tmp_dir: /var/cache/logwatch
# 接收 Logwatch 报告的电子邮件
logwatch_mailto: "root"
# Logwatch 报告详细级别
logwatch_detail: "Low"
# 收到 Logwatch 报告的频率,可以设置为每周或每天
logwatch_interval: "weekly"
postfix_hostname: "{{ ansible_hostname }}"
postfix_mailname: "{{ ansible_hostname }}"
postfix_mydestination:
- "{{ postfix_hostname }}"
- localdomain
- localhost
- localhost.localdomain
postfix_relayhost: smtp.gmail.com
postfix_relayhost_port: 587
# 必填字段,请设置为您的 Gmail 地址
postfix_sasl_user:
# 必填字段,请设置为您的 Gmail 密码
postfix_sasl_password:
postfix_smtp_tls_cafile: /etc/ssl/certs/ca-certificates.crt
# 更新 /boot/config.txt,格式为 `{{ key }}: {{ value }}`
rpi_boot_config: {}
# 运行 raspi-config,格式为 -noint do_{{ key }} {{ value }}。选项见: https://github.com/raspberrypi-ui/rc_gui/blob/master/src/rc_gui.c#L23-L70
rpi_cmdline_config: {}
ssh_sshd_config: "/etc/ssh/sshd_config"
# 必填字段,列出要更新到 ~/.authorized_keys 的 SSH 公钥。
# 注意:这些密钥中需包含 Ansible 使用的密钥。
ssh_public_keys: []
# 连接到主机时在 SSH 中显示的字符串
ssh_banner:
# UFW 规则应始终允许 SSH,以保持 Ansible 功能
ufw_rules:
- { rule: "allow", port: "22", proto: "tcp" }
# 配置是否允许 igmp 流量
ufw_allow_igmp: false
# 无用户干预升级报告的接收者
unattended_upgrades_email_address: root
# 是否在检测到 /var/run/reboot-required 时重启?
unattended_upgrades_auto_reboot: false
# 运行测试时使用的内部变量 - 不应使用。
ansible_raspbian_testing: false
示例剧本
- hosts: servers
become: true
pre_tasks:
- name: 更新 apt 缓存
apt:
cache_valid_time: 600
roles:
- role: hannseman.raspbian
vars:
system_packages:
- apt-transport-https
- vim
system_default_editor_path: "/usr/bin/vim.basic"
system_ssh_user_password: hunter2
system_ssh_user_salt: pepper
postfix_sasl_user: [email protected]
postfix_sasl_password: hunter2
ssh_public_keys:
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJXTGInmtpoG9rYmT/3DpL+0o/sH2shys+NwJLo8NnCj