在实现LAMP(Linux、Apache、MySQL、PHP)自动化部署前,需完成以下基础准备:
ssh-keygen生成密钥并复制到托管节点);ntpdate或chrony确保控制节点与托管节点时间同步,避免因时间差异导致部署失败。Ansible是基于YAML的开源配置管理工具,无需在托管节点安装客户端,通过SSH实现远程操作,适合LAMP环境的快速部署。
以Ubuntu为例,执行以下命令安装Ansible:
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ansible/ansible
sudo apt update
sudo apt install ansible
安装完成后,通过ansible --version验证是否安装成功。
Inventory文件用于定义托管节点(目标服务器),创建inventory文件(如/etc/ansible/inventory),内容如下:
[lamp_servers]
web1 ansible_host=192.168.1.100 ansible_user=ubuntu ansible_ssh_private_key_file=~/.ssh/id_rsa
web2 ansible_host=192.168.1.101 ansible_user=ubuntu ansible_ssh_private_key_file=~/.ssh/id_rsa
[lamp_servers]:主机组名称,可自定义;ansible_host:托管节点IP地址;ansible_user:登录托管节点的用户名;ansible_ssh_private_key_file:SSH私钥路径(若使用密码登录,可省略此项)。Playbook是Ansible的核心,通过YAML语法定义LAMP部署步骤。创建lamp_deploy.yml文件,内容如下:
---
- name: Deploy LAMP stack on multiple servers
hosts: lamp_servers
become: yes # 使用sudo权限执行任务
vars:
apache_port: 80
mysql_root_password: "YourSecurePassword123!" # 生产环境建议使用Vault加密
tasks:
# 更新系统软件包
- name: Update apt cache (Ubuntu/Debian)
apt:
update_cache: yes
when: ansible_os_family == 'Debian'
- name: Update yum cache (CentOS/RHEL)
yum:
update_cache: yes
when: ansible_os_family == 'RedHat'
# 安装Apache
- name: Install Apache
package:
name:
- apache2 # Debian/Ubuntu
- httpd # CentOS/RHEL
state: present
notify: Restart Apache
# 安装MySQL
- name: Install MySQL server
package:
name:
- mysql-server # Debian/Ubuntu
- mariadb-server # CentOS/RHEL
state: present
notify: Restart MySQL
- name: Secure MySQL installation
mysql_secure_installation:
login_unix_socket: /var/run/mysqld/mysqld.sock
remove_anonymous_users: yes
remove_test_database: yes
root_password: "{{ mysql_root_password }}"
root_password_update: yes
# 安装PHP及常用扩展
- name: Install PHP and extensions
package:
name:
- php
- libapache2-mod-php # Debian/Ubuntu
- php-mysqlnd
- php-cli
- php-curl
- php-gd
state: present
notify: Restart Apache
# 启动服务并设置开机自启
- name: Enable and start Apache
service:
name: "{{ 'apache2' if ansible_os_family == 'Debian' else 'httpd' }}"
state: started
enabled: yes
- name: Enable and start MySQL
service:
name: "{{ 'mysql' if ansible_os_family == 'Debian' else 'mariadb' }}"
state: started
enabled: yes
handlers:
- name: Restart Apache
service:
name: "{{ 'apache2' if ansible_os_family == 'Debian' else 'httpd' }}"
state: restarted
- name: Restart MySQL
service:
name: "{{ 'mysql' if ansible_os_family == 'Debian' else 'mariadb' }}"
state: restarted
apache_port、mysql_root_password可根据需求调整;when语句用于区分Ubuntu/Debian(使用apt)和CentOS/RHEL(使用yum)系统;执行以下命令启动部署:
ansible-playbook -i inventory lamp_deploy.yml
-i inventory:指定Inventory文件路径;-k参数(提示输入密码)。若服务器数量较少或需求简单,可通过Shell脚本自动化执行安装命令。创建lamp_deploy.sh文件,内容如下:
#!/bin/bash
# 更新系统
echo "Updating system packages..."
sudo apt update && sudo apt upgrade -y # Ubuntu/Debian
# sudo yum update -y # CentOS/RHEL(取消注释适配)
# 安装Apache
echo "Installing Apache..."
sudo apt install -y apache2 # Ubuntu/Debian
# sudo yum install -y httpd # CentOS/RHEL(取消注释适配)
sudo systemctl enable apache2
sudo systemctl start apache2
# 安装MySQL
echo "Installing MySQL..."
sudo apt install -y mysql-server # Ubuntu/Debian
# sudo yum install -y mariadb-server # CentOS/RHEL(取消注释适配)
sudo systemctl enable mysql
sudo systemctl start mysql
# 安全配置MySQL
echo "Securing MySQL..."
sudo mysql_secure_installation <<EOF
y
YourSecurePassword123!
y
y
y
y
EOF
# 安装PHP
echo "Installing PHP..."
sudo apt install -y php libapache2-mod-php php-mysql # Ubuntu/Debian
# sudo yum install -y php php-mysqlnd # CentOS/RHEL(取消注释适配)
sudo systemctl restart apache2
echo "LAMP deployment completed successfully!"
赋予执行权限并运行:
chmod +x lamp_deploy.sh
./lamp_deploy.sh
<<EOF用于交互式输入MySQL root密码,生产环境建议使用expect工具或Ansible替代。若需要代码更新后自动部署,可结合Jenkins、GitLab CI等工具:
ansible-playbook -i inventory sync_code.yml)。通过以上方法,可实现LAMP环境的快速、一致部署,减少人工操作错误,提升运维效率。