ansible服务器初始化部署按系统准备、安全加固、服务配置、用户权限四层协作:系统准备用apt/yum、timezone等模块统一环境;ssh加固用copy、lineinfile、service模块批量调优;服务配置依赖file、copy/template、yum_repository等模块部署服务;用户权限通过user、authorized_key、lineinfile模块规范账户体系,并基于facts实现跨发行版兼容。

Ansible 常用模块在服务器初始化部署中不是零散调用,而是按逻辑分层协作:系统准备、安全加固、服务配置、基础依赖四类任务各由对应模块高效承接,避免 shell 脚本拼凑,保障幂等性与跨发行版兼容。
系统准备类模块:统一基础环境
初始化首要目标是让新服务器具备一致、干净的运行基线。关键模块包括:
-
apt / yum:自动适配 Debian/Ubuntu 或 RHEL/CentOS,执行
update_cache=yes upgrade=dist(Debian系)或name=* state=latest update_cache=yes(RHEL系),确保包管理器最新且系统已升级; -
timezone:直接设置时区,如
name: Asia/Shanghai,无需手动修改/etc/localtime或执行timedatectl; -
lineinfile:用于内核参数调整,例如禁用 IPv6:
path: /etc/sysctl.conf line: 'net.ipv6.conf.all.disable_ipv6 = 1' create: yes,再配合command: sysctl -p生效; -
systemd_service:启用并启动时间同步服务,如
name: chronyd enabled: yes state: started(RHEL)或name: systemd-timesyncd enabled: yes state: started(Debian)。
SSH 安全加固类模块:降低远程风险
默认 SSH 配置不满足生产要求,需批量修正。核心操作由以下模块完成:
-
copy:先备份原始配置,如
src: /etc/ssh/sshd_config dest: /etc/ssh/sshd_config.backup mode: '0600'; -
lineinfile:精准替换关键行,例如
regexp: '^PasswordAuthentication' line: 'PasswordAuthentication no'关闭密码登录,line: 'AllowUsers admin deploy'限制可登录用户; -
service:重载配置生效,
name: sshd state: reloaded(注意区分restart与reloaded,后者更安全)。
服务与文件管理类模块:构建可用环境
初始化常需部署基础服务(如 Web、DB)或准备运行目录。常用组合如下:
-
file:创建目录、设置权限、管理符号链接,例如
path: /www state: directory mode: '0755',再用state: link src: /var/www/html dest: /www建软链; -
copy 或 template:分发静态文件或动态生成配置,如用 Jinja2 模板生成
/etc/my.cnf,保留!includedir /etc/my.cnf.d/兼容 RPM 包结构; -
yum_repository:配置本地或内网仓库,替代默认源,适用于离线环境,如
baseurl: file:///mnt/BaseOS enabled: yes gpgcheck: no; -
service:启用并启动服务,如
name: httpd enabled: yes state: started,支持 systemd 和 SysVinit。
用户与权限类模块:规范账户体系
初始化需建立运维账户并赋予必要权限,避免长期使用 root:
-
user:创建用户并指定 shell、主目录和密钥,如
name: deploy shell: /bin/bash generate_ssh_key: yes ssh_key_bits: 2048; -
authorized_key:注入公钥,
user: deploy key: "{{ lookup('file', '/home/admin/.ssh/id_rsa.pub') }}",比copy更语义化; -
lineinfile(配合
/etc/sudoers):添加免密 sudo 权限,如path: /etc/sudoers line: '%deploy ALL=(ALL) NOPASSWD: ALL' validate: 'visudo -cf %s',带语法校验更安全。
不复杂但容易忽略:所有模块调用都应基于 gather_facts 获取的 ansible_distribution 或 ansible_os_family 做条件判断,才能真正实现一套 Playbook 覆盖多发行版。











