# 幂等 if ! dpkg -l | grep -q "^ii.*nginx"; then apt install -y nginx echo"Nginx installed" else echo"Nginx already installed, skip" fi
通用模板:
1 2 3 4 5 6 7 8 9 10 11
ensure_state() { local target_state="$1" local current_state=$(get_current_state) if [ "$current_state" != "$target_state" ]; then apply_change "$target_state" log"Changed from $current_state to $target_state" else log"Already in desired state, skip" fi }
#!/bin/bash declare_state() { local resource="$1" local desired="$2" local current=$(get_resource_state "$resource") if [ "$current" != "$desired" ]; then set_resource_state "$resource""$desired" echo"Changed $resource: $current -> $desired" fi }
ensure_firewall_rule() { local chain="$1" local rule="$2" # 检查规则是否已存在 if iptables -C "$chain"$rule 2>/dev/null; then echo"Rule already exists: $rule" else iptables -A "$chain"$rule echo"Rule added: $rule" fi }
ensure_mysql_database() { local db_name="$1" local mysql_cmd="mysql -u root -p${MYSQL_ROOT_PASSWORD}" # 检查数据库是否存在 if$mysql_cmd -e "USE $db_name" 2>/dev/null; then echo"Database $db_name exists" else $mysql_cmd -e "CREATE DATABASE $db_name CHARACTER SET utf8mb4" echo"Database $db_name created" fi }
ensure_mysql_user() { local username="$1" local password="$2" local host="$3" local mysql_cmd="mysql -u root -p${MYSQL_ROOT_PASSWORD}" # 检查用户是否存在 local user_exists=$($mysql_cmd -N -e \ "SELECT COUNT(*) FROM mysql.user WHERE User='$username' AND Host='$host'") if [ "$user_exists" -eq 0 ]; then $mysql_cmd -e "CREATE USER '$username'@'$host' IDENTIFIED BY '$password'" echo"User $username@$host created" else echo"User $username@$host exists" fi }
ensure_package() { local package="$1" local state="$2"# present or absent local pm="$3"# apt/yum/dnf case"$pm"in apt) if [ "$state" = "present" ]; then if dpkg -l | grep -q "^ii.*$package"; then echo"Package $package installed" else apt install -y "$package" echo"Package $package installed" fi else if dpkg -l | grep -q "^ii.*$package"; then apt remove -y "$package" echo"Package $package removed" else echo"Package $package not installed" fi fi ;; yum|dnf) if [ "$state" = "present" ]; then if rpm -q "$package" > /dev/null 2>&1; then echo"Package $package installed" else $pm install -y "$package" echo"Package $package installed" fi else if rpm -q "$package" > /dev/null 2>&1; then $pm remove -y "$package" echo"Package $package removed" else echo"Package $package not installed" fi fi ;; esac }