phpMyAdmin 应跳过 apt 安装,改用官方压缩包部署:下载解压、手写最小化 config.inc.php(敏感项通过 Vault 或 vars_prompt 注入)、禁用 'config' 认证、删除 setup 目录、按 Web 服务器类型配置安全规则并验证 PHP 模块与权限。
phpMyAdmin 部署为什么不能直接用 apt install phpmyadmin
因为交互式配置会卡住 ansible 执行(比如等待你选 web 服务器、设置数据库密码),debconf-set-selections 虽能预设,但不同 ubuntu/debian 版本的 debconf 问题名不一致,容易漏配导致安装失败或配置残缺。
更稳的做法是跳过包管理器,直接下载官方压缩包解压部署:
- 用
get_url拉取https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.tar.gz(注意校验sha256sum) - 用
unarchive解压到/var/www/html/phpmyadmin,设好owner/group为www-data - 手动写
config.inc.php,避免依赖 debconf 生成的不透明配置
config.inc.php 必须手动生成,不能靠模板硬塞敏感信息
Ansible 的 template 模块容易把数据库密码明文塞进 playbook 或 inventory,一旦泄露就是全库权限。实际应拆成两步:
- 用
copy模块部署一个最小化骨架配置(只含$cfg['blowfish_secret']和基础设置) - 敏感项如
$cfg['Servers'][1]['password']放在vars_prompt或 Vault 加密的group_vars里,运行时注入 - 务必禁用
$cfg['Servers'][1]['auth_type'] = 'config'—— 这等于把密码写死在 PHP 文件里,Nginx/Apache 一旦配置出错就可能被直接下载
示例关键行:
$cfg['blowfish_secret'] = '{{ blowfish_secret }}'; // 32 字符随机字符串,用 <code>lookup('community.general.random_string', length=32)</code> 生成
Web 服务器配置要区分 Nginx 和 Apache,且必须显式禁用目录遍历
phpMyAdmin 自带 .htaccess,但 Nginx 不认;Apache 默认允许 .htaccess,但若 AllowOverride None 就会失效。所以不能依赖内置规则。
立即学习“PHP免费学习笔记(深入)”;
- 对 Apache:用
lineinfile确保虚拟主机配置含Require local(非Allow from all) - 对 Nginx:在 server 块里加
location ~ ^/phpmyadmin/(?:\.ht|config\.inc\.php|\.git|\.hg|\.project|composer\.json|composer\.lock|\.env)并返回403 - 无论哪种,都得删掉
/var/www/html/phpmyadmin/setup目录 —— 它是远程可访问的配置向导,生产环境必须移除
playbook 中的 when 判断别只看 ansible_facts['distribution']
Ubuntu 22.04 和 Debian 12 都叫 “Debian”,但 PHP 版本、Web 服务名(apache2 vs httpd)、默认文档根路径可能不同。光靠发行版名会误判。
- 优先用
ansible_facts['distribution_major_version']+ansible_facts['distribution']组合判断 - 对 Web 服务状态检查,用
systemctl is-active --quiet apache2或nginx,而不是假设服务名 - PHP 模块是否启用(如
mbstring、openssl)必须用command: php -m | grep mbstring实际验证,别只信apt install php-mbstring返回成功
真正麻烦的是权限继承 —— 解压后的 tmp 目录如果属主是 root,www-data 写不了上传文件,得用 file 模块递归设权,且 recurse: yes 必须显式声明,否则只改顶层目录。











