chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用Ansible批量部署Web服務器實戰(zhàn)

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2025-09-05 10:06 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Ansible 自動化運維入門:批量部署 Web 服務器實戰(zhàn)

引言:為什么每個運維都應該掌握 Ansible

還記得那個凌晨3點被電話叫醒的夜晚嗎?生產環(huán)境的20臺服務器需要緊急更新配置,你不得不一臺一臺手動SSH登錄,重復執(zhí)行相同的命令。兩個小時后,當你拖著疲憊的身軀完成任務時,心里暗暗發(fā)誓:"一定要找個自動化工具!"

如果你有過類似的經歷,那么恭喜你,今天這篇文章將徹底改變你的運維生涯。我將帶你從零開始掌握Ansible,通過一個實際的Web服務器批量部署項目,讓你體驗自動化運維的魅力。讀完這篇文章,你將能夠:

10分鐘內完成50臺服務器的Nginx部署

一鍵實現應用的滾動更新和回滾

構建可復用的自動化部署流程

將重復性工作時間縮短90%以上

一、Ansible 是什么?它能解決什么問題?

1.1 傳統(tǒng)運維的痛點

在深入Ansible之前,讓我們先看看傳統(tǒng)運維面臨的挑戰(zhàn):

場景一:配置漂移問題你管理著100臺服務器,理論上它們的配置應該完全一致。但隨著時間推移,因為各種臨時修改、緊急補丁,服務器配置開始出現差異。某天一個看似簡單的更新,卻因為配置不一致導致部分服務器故障。

場景二:規(guī)?;魬?zhàn)公司業(yè)務快速增長,服務器數量從10臺增長到100臺。原本30分鐘能完成的部署任務,現在需要5個小時。而且隨著操作復雜度增加,人為錯誤的概率也在上升。

場景三:知識傳承困難資深運維離職了,留下的只有一堆零散的Shell腳本和簡單的文檔。新人接手后發(fā)現,每個腳本的執(zhí)行順序、參數含義都需要猜測和試錯。

1.2 Ansible 的優(yōu)勢

Ansible 是一個開源的IT自動化工具,它通過簡單的YAML語法描述系統(tǒng)配置,實現:

無代理架構(Agentless):不需要在被管理節(jié)點安裝任何客戶端,通過SSH即可管理

聲明式配置:描述"想要達到的狀態(tài)",而不是"如何達到"

冪等性保證:多次執(zhí)行產生相同結果,避免重復操作帶來的問題

易學易用:YAML語法簡單直觀,降低學習門檻

強大的模塊庫:3000+內置模塊,覆蓋各種運維場景

二、快速上手:15分鐘搭建 Ansible 環(huán)境

2.1 環(huán)境準備

我們將搭建一個實驗環(huán)境,包含1臺控制節(jié)點和3臺被管理節(jié)點:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
# 控制節(jié)點(安裝Ansible的機器)
control-node:192.168.1.10


# 被管理節(jié)點(目標服務器)
web-01:192.168.1.11
web-02:192.168.1.12
web-03:192.168.1.13

2.2 安裝 Ansible

在控制節(jié)點上執(zhí)行:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
# CentOS/RHEL 系統(tǒng)
sudoyum install -y epel-release
sudoyum install -y ansible


# Ubuntu/Debian 系統(tǒng)
sudoapt update
sudoapt install -y ansible


# 使用 pip 安裝(推薦,獲取最新版本)
sudopip3 install ansible


# 驗證安裝
ansible--version

2.3 配置 SSH 免密登錄

自動化的前提是控制節(jié)點能夠無密碼訪問被管理節(jié)點:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
# 生成SSH密鑰對(如果還沒有)
ssh-keygen -t rsa -b2048


# 將公鑰復制到所有被管理節(jié)點
forip in192.168.1.11192.168.1.12192.168.1.13; do
 ssh-copy-id -i ~/.ssh/id_rsa.pub root@$ip
done


# 測試連接
sshroot@192.168.1.11'hostname'

2.4 創(chuàng)建 Inventory 文件

Inventory文件定義了Ansible要管理的主機清單:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
# 創(chuàng)建 inventory.ini 文件
[webservers]
web-01 ansible_host=192.168.1.11
web-02 ansible_host=192.168.1.12
web-03 ansible_host=192.168.1.13


[webservers:vars]
ansible_user=root
ansible_python_interpreter=/usr/bin/python3


[all:vars]
ansible_connection=ssh

測試連接所有主機:

ounter(line
ansible -iinventory.iniall-m ping

如果看到所有主機返回 "pong",恭喜你,環(huán)境搭建成功!

三、實戰(zhàn)項目:批量部署 Nginx Web 服務器

現在讓我們通過一個實際項目,深入理解Ansible的強大功能。我們將實現:

批量安裝Nginx

部署自定義配置

部署靜態(tài)網站

實現滾動更新

3.1 項目結構設計

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
nginx-deployment/
├── inventory.ini     # 主機清單
├── ansible.cfg      # Ansible配置文件
├── site.yml       # 主Playbook
├── roles/        # 角色目錄
│  └── nginx/
│    ├── tasks/   # 任務定義
│    │  └── main.yml
│    ├── templates/  # 模板文件
│    │  ├── nginx.conf.j2
│    │  └── index.html.j2
│    ├── handlers/  # 觸發(fā)器
│    │  └── main.yml
│    └──vars/    # 變量定義
│      └── main.yml
└── group_vars/     # 組變量
  └── webservers.yml

3.2 編寫 Playbook

創(chuàng)建主Playbooksite.yml:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
---
-name: Deploy Nginx Web Servers
 hosts: webservers
 become: yes
 gather_facts: yes


 vars:
 nginx_port:80
 nginx_worker_processes:"{{ ansible_processor_vcpus }}"
 nginx_worker_connections:1024
 website_title:"Ansible自動化部署演示"


 tasks:
  -name: 更新系統(tǒng)包緩存
  apt:
   update_cache: yes
  when: ansible_os_family =="Debian"


  -name: 安裝Nginx
  package:
   name: nginx
   state: present


  -name: 創(chuàng)建網站目錄
  file:
   path: /var/www/html
   state: directory
   mode:'0755'


  -name: 部署Nginx配置文件
  template:
   src: nginx.conf.j2
   dest: /etc/nginx/nginx.conf
   backup: yes
  notify: restart nginx


  -name: 部署網站首頁
  template:
   src: index.html.j2
   dest: /var/www/html/index.html
   mode:'0644'


  -name: 確保Nginx服務運行
  service:
   name: nginx
   state: started
   enabled: yes


  -name: 等待端口就緒
  wait_for:
   port:"{{ nginx_port }}"
   host:"{{ ansible_default_ipv4.address }}"
   delay:5
   timeout:30


 handlers:
  -name: restart nginx
  service:
   name: nginx
   state: restarted

3.3 創(chuàng)建配置模板

創(chuàng)建templates/nginx.conf.j2:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
user www-data;
worker_processes {{ nginx_worker_processes }};
pid /run/nginx.pid;


events {
  worker_connections {{ nginx_worker_connections }};
  multi_accept on;
  use epoll;
}


http {
 # 基礎配置
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout 65;
  types_hash_max_size 2048;


 # 日志配置
  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;


 # Gzip壓縮
  gzip on;
  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_types text/plain text/css text/xml application/json application/javascript;


 # 虛擬主機配置
  server {
    listen {{ nginx_port }} default_server;
    listen [::]:{{ nginx_port }} default_server;


    root /var/www/html;
    index index.html index.htm;


    server_name {{ ansible_hostname }}.example.com;


    location / {
      try_files$uri$uri/ =404;
    }


   # 健康檢查端點
    location /health {
      access_log off;
     return200"healthy
";
      add_header Content-Type text/plain;
    }
  }
}

創(chuàng)建templates/index.html.j2:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line



 
 
 {{ website_title }}
 


 
   

{{ website_title }}

恭喜!您已成功使用 Ansible 部署了這個頁面

服務器名稱:{{ ansible_hostname }}

IP地址:{{ ansible_default_ipv4.address }}

操作系統(tǒng):{{ ansible_distribution }} {{ ansible_distribution_version }}

部署時間:{{ ansible_date_time.iso8601 }}

3.4 執(zhí)行部署

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
# 語法檢查
ansible-playbook -iinventory.inisite.yml--syntax-check


# 模擬執(zhí)行(Dry Run)
ansible-playbook -iinventory.inisite.yml--check


# 正式部署
ansible-playbook -iinventory.inisite.yml


# 查看詳細輸出
ansible-playbook -iinventory.inisite.yml-vvv

四、進階技巧:讓你的自動化更強大

4.1 滾動更新策略

在生產環(huán)境中,我們需要確保服務的持續(xù)可用性。Ansible支持滾動更新:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
---
-name: 滾動更新Web服務器
 hosts: webservers
 become: yes
 serial:1 # 每次更新1臺服務器
 max_fail_percentage:30 # 允許30%的失敗率


 pre_tasks:
  -name: 從負載均衡器移除
  uri:
   url:"http://lb.example.com/api/remove"
   method: POST
   body_format: json
   body:
    server:"{{ ansible_hostname }}"
  delegate_to: localhost


 tasks:
  -name: 更新應用代碼
  git:
   repo:https://github.com/yourapp/webapp.git
   dest: /var/www/html
   version:"{{ app_version | default('master') }}"


  -name: 重啟服務
  service:
   name: nginx
   state: restarted


 post_tasks:
  -name: 健康檢查
  uri:
   url:"http://{{ ansible_default_ipv4.address }}/health"
   status_code:200
  retries:5
  delay:10


  -name: 重新加入負載均衡器
  uri:
   url:"http://lb.example.com/api/add"
   method: POST
   body_format: json
   body:
    server:"{{ ansible_hostname }}"
  delegate_to: localhost

4.2 使用 Ansible Vault 保護敏感信息

生產環(huán)境中,密碼和密鑰需要加密存儲:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
# 創(chuàng)建加密文件
ansible-vault create secrets.yml


# 編輯加密文件
ansible-vault edit secrets.yml


# 在secrets.yml中添加:
db_password:"SuperSecret123!"
api_key:"sk-1234567890abcdef"


# 使用加密變量運行playbook
ansible-playbook -i inventory.ini site.yml --ask-vault-pass

4.3 動態(tài) Inventory

當服務器數量眾多或經常變化時,可以使用動態(tài)Inventory:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
#!/usr/bin/env python3
# dynamic_inventory.py


importjson
importboto3


defget_inventory():
  ec2 = boto3.client('ec2', region_name='us-west-2')


  response = ec2.describe_instances(
    Filters=[
      {'Name':'tag:Environment','Values': ['production']},
      {'Name':'instance-state-name','Values': ['running']}
    ]
  )


  inventory = {
   'webservers': {
     'hosts': [],
     'vars': {
       'ansible_user':'ubuntu',
       'ansible_ssh_private_key_file':'~/.ssh/aws-key.pem'
      }
    }
  }


 forreservationinresponse['Reservations']:
   forinstanceinreservation['Instances']:
      inventory['webservers']['hosts'].append(instance['PublicIpAddress'])


 returninventory


if__name__ =='__main__':
 print(json.dumps(get_inventory()))

4.4 性能優(yōu)化技巧

當管理大規(guī)?;A設施時,性能優(yōu)化至關重要:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
# ansible.cfg
[defaults]
host_key_checking = False
gathering = smart
fact_caching = jsonfile
fact_caching_connection = /tmp/ansible_cache
fact_caching_timeout = 86400
pipelining = True
forks = 50


[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s
control_path = /tmp/ansible-%%h-%%p-%%r

五、實戰(zhàn)案例:構建完整的 CI/CD 流程

讓我們通過一個完整的案例,展示如何將Ansible集成到CI/CD流程中:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
---
# deploy_pipeline.yml
-name: 完整的部署流程
 hosts: webservers
 become: yes


 vars:
 app_name: mywebapp
 app_version:"{{ lookup('env', 'BUILD_NUMBER') | default('latest') }}"
 deploy_user: webapp
 deploy_dir: /opt/{{ app_name }}
 backup_dir: /opt/backups/{{ app_name }}


 tasks:
  -name: 創(chuàng)建部署用戶
  user:
   name:"{{ deploy_user }}"
   shell: /bin/bash
   groups: www-data
   append: yes


  -name: 創(chuàng)建必要的目錄
  file:
   path:"{{ item }}"
   state: directory
   owner:"{{ deploy_user }}"
   group:"{{ deploy_user }}"
   mode:'0755'
  loop:
    -"{{ deploy_dir }}"
    -"{{ backup_dir }}"
    - /var/log/{{ app_name }}


  -name: 備份當前版本
  archive:
   path:"{{ deploy_dir }}"
   dest:"{{ backup_dir }}/backup-{{ ansible_date_time.epoch }}.tar.gz"
  when: deploy_dir is directory


  -name: 拉取最新代碼
  git:
   repo:"https://github.com/company/{{ app_name }}.git"
   dest:"{{ deploy_dir }}"
   version:"{{ app_version }}"
   force: yes
  become_user:"{{ deploy_user }}"


  -name: 安裝應用依賴
  pip:
   requirements:"{{ deploy_dir }}/requirements.txt"
   virtualenv:"{{ deploy_dir }}/venv"
   virtualenv_python: python3
  become_user:"{{ deploy_user }}"


  -name: 運行數據庫遷移
  command: |
    {{ deploy_dir }}/venv/bin/python manage.py migrate
  args:
   chdir:"{{ deploy_dir }}"
  become_user:"{{ deploy_user }}"
  run_once:true


  -name: 收集靜態(tài)文件
  command: |
    {{ deploy_dir }}/venv/bin/python manage.py collectstatic --noinput
  args:
   chdir:"{{ deploy_dir }}"
  become_user:"{{ deploy_user }}"


  -name: 配置Systemd服務
  template:
   src: app.service.j2
   dest: /etc/systemd/system/{{ app_name }}.service
  notify:
    - reload systemd
    - restart app


  -name: 配置Nginx反向代理
  template:
   src: nginx_app.conf.j2
   dest: /etc/nginx/sites-available/{{ app_name }}
  notify: reload nginx


  -name: 啟用站點
  file:
   src: /etc/nginx/sites-available/{{ app_name }}
   dest: /etc/nginx/sites-enabled/{{ app_name }}
   state: link
  notify: reload nginx


  -name: 運行冒煙測試
  uri:
   url:"http://localhost/api/health"
   status_code:200
  retries:5
  delay:10


 handlers:
  -name: reload systemd
  systemd:
   daemon_reload: yes


  -name: restart app
  systemd:
   name:"{{ app_name }}"
   state: restarted
   enabled: yes


  -name: reload nginx
  service:
   name: nginx
   state: reloaded

六、監(jiān)控與日志:確保自動化的可觀測性

自動化不是"一勞永逸",我們需要持續(xù)監(jiān)控:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
---
# monitoring.yml
-name: 配置監(jiān)控和日志收集
 hosts: webservers
 become: yes


 tasks:
  -name: 安裝監(jiān)控代理
  package:
   name:
     - prometheus-node-exporter
     - filebeat
   state: present


  -name: 配置Prometheus Node Exporter
  lineinfile:
   path: /etc/default/prometheus-node-exporter
   regexp:'^ARGS='
   line:'ARGS="--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|run)($|/)"'
  notify: restart node-exporter


  -name: 配置Filebeat
  template:
   src: filebeat.yml.j2
   dest: /etc/filebeat/filebeat.yml
   mode:'0600'
  notify: restart filebeat


  -name: 配置自定義指標收集腳本
  copy:
   content: |
     #!/bin/bash
     # 收集應用自定義指標
    echo"app_requests_total $(curl -s localhost/metrics | grep requests_total | awk '{print$2}')"
    echo"app_errors_total $(grep ERROR /var/log/{{ app_name }}/app.log | wc -l)"
    echo"app_response_time_seconds $(tail -n 100 /var/log/nginx/access.log | awk '{sum+=$10} END {print sum/NR}')"
   dest: /usr/local/bin/collect_metrics.sh
   mode:'0755'


  -name: 添加指標收集定時任務
  cron:
   name:"收集應用指標"
   minute:"*/5"
   job:"/usr/local/bin/collect_metrics.sh > /var/lib/node_exporter/textfile_collector/app_metrics.prom"


 handlers:
  -name: restart node-exporter
  service:
   name: prometheus-node-exporter
   state: restarted


  -name: restart filebeat
  service:
   name: filebeat
   state: restarted

七、故障恢復:當事情出錯時

即使是最完善的自動化,也可能出現問題。讓我們準備一個快速回滾方案:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
---
# rollback.yml
-name: 緊急回滾程序
 hosts: webservers
 become: yes
 serial:1


 vars_prompt:
  -name: confirm_rollback
  prompt:"確認要回滾到上一個版本嗎?(yes/no)"
  private: no


 tasks:
  -name: 驗證確認
  fail:
   msg:"回滾操作已取消"
  when: confirm_rollback !="yes"


  -name: 查找最新的備份
  find:
   paths:"{{ backup_dir }}"
   patterns:"backup-*.tar.gz"
  register: backup_files


  -name: 確保有可用備份
  fail:
   msg:"沒有找到可用的備份文件"
  when: backup_files.files | length ==0


  -name: 獲取最新備份
  set_fact:
   latest_backup:"{{ (backup_files.files | sort(attribute='mtime') | last).path }}"


  -name: 停止應用服務
  systemd:
   name:"{{ app_name }}"
   state: stopped


  -name: 清理當前版本
  file:
   path:"{{ deploy_dir }}"
   state: absent


  -name: 恢復備份
  unarchive:
   src:"{{ latest_backup }}"
   dest: /opt/
   remote_src: yes


  -name: 啟動應用服務
  systemd:
   name:"{{ app_name }}"
   state: started


  -name: 驗證服務狀態(tài)
  uri:
   url:"http://localhost/api/health"
   status_code:200
  retries:3
  delay:5


  -name: 發(fā)送回滾通知
  mail:
   to: ops-team@example.com
   subject:"緊急回滾完成 - {{ ansible_hostname }}"
   body:"服務器 {{ ansible_hostname }} 已成功回滾到備份版本:{{ latest_backup }}"
  delegate_to: localhost

總結:從手動到自動的蛻變

通過這篇文章,我們一起經歷了從傳統(tǒng)手動運維到Ansible自動化的完整旅程。讓我們回顧一下關鍵收獲:

效率提升:原本需要數小時的部署任務,現在只需要幾分鐘

一致性保證:通過代碼化的配置管理,消除了環(huán)境差異

可追溯性:每次變更都有記錄,便于審計和問題排查

知識沉淀:運維經驗轉化為可復用的Playbook

降低風險:自動化減少人為錯誤,回滾機制保障業(yè)務連續(xù)性

但這僅僅是開始。Ansible的生態(tài)系統(tǒng)遠比我們今天探索的要豐富:

Ansible Tower/AWX 提供企業(yè)級的管理界面

Ansible Galaxy 社區(qū)分享了數千個現成的角色

與Kubernetes、Docker、云平臺的深度集成

網絡設備、數據庫、中間件的自動化配置

下一步行動建議

立即實踐:選擇一個簡單的重復性任務,嘗試用Ansible自動化

逐步推廣:從開發(fā)環(huán)境開始,逐步擴展到生產環(huán)境

持續(xù)學習:關注Ansible官方文檔和社區(qū)最佳實踐

分享交流:將你的自動化經驗分享給團隊,共同成長

記住,自動化不是目的,而是讓我們能夠專注于更有價值工作的手段。當你不再被重復性任務束縛,你就有更多時間去思考架構優(yōu)化、性能調優(yōu)、安全加固這些真正體現運維價值的工作。

如果這篇文章對你有幫助,歡迎關注我的技術博客,我會持續(xù)分享更多運維實戰(zhàn)經驗。下一篇,我們將探討"Kubernetes + Ansible:打造云原生時代的自動化運維體系",敬請期待!

互動話題:你在實施自動化運維過程中遇到過哪些挑戰(zhàn)?歡迎在評論區(qū)分享你的經驗和困惑,讓我們一起探討解決方案。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴

原文標題:Ansible 自動化運維入門:批量部署 Web 服務器實戰(zhàn)

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    寶界科技WEB服務器立體防御解決方案

    利用腳本實施注入式攻擊 跨平臺全系列支持操作系統(tǒng):支持Windows、Linux、UnixWeb服務器:支持IIS、Apache、J2EE 三、 寶界網站防篡改WEB應用防火墻系統(tǒng)網絡部署拓撲圖網絡層
    發(fā)表于 05-17 14:01

    寶界科技WEB服務器立體防御解決方案

    利用腳本實施注入式攻擊 跨平臺全系列支持操作系統(tǒng):支持Windows、Linux、UnixWeb服務器:支持IIS、Apache、J2EE 三、 寶界網站防篡改WEB應用防火墻系統(tǒng)網絡部署拓撲圖網絡層
    發(fā)表于 08-19 11:02

    ansible核心程序批量部署

    ansible批量部署
    發(fā)表于 07-26 15:30

    使用IIS為Web內容配置Web服務器權限

      本文分步介紹如何使用 Internet 信息服務 (IIS) 5.0 授予對 Web 內容的 Web 服務器權限?! ?nbsp;  您可以對
    發(fā)表于 08-26 15:33 ?17次下載

    基于Linux的WEB服務器的設計與實現

    基于Linux的WEB服務器的設計與實現 嵌入式WEB服務器的主要設計思想就是將嵌入式系統(tǒng)和 WEB技術結合起來,將
    發(fā)表于 10-06 08:30 ?3263次閱讀
    基于Linux的<b class='flag-5'>WEB</b><b class='flag-5'>服務器</b>的設計與實現

    構建實戰(zhàn):Nginx+IIS構筑Web服務器集群負載均衡

    構建實戰(zhàn):Nginx+IIS構筑Web服務器集群負載均衡
    發(fā)表于 09-05 10:56 ?4次下載
    構建<b class='flag-5'>實戰(zhàn)</b>:Nginx+IIS構筑<b class='flag-5'>Web</b><b class='flag-5'>服務器</b>集群負載均衡

    如何辨別Web服務器,應用程序服務器,HTTP服務器

    強大的J2EE功能,毫無疑問是絕對的應用服務器。對于處于中間位置的Tomcat,它可以配合純Web服務器Apache一起使用,也可以作為應用服務器的輔助與應用
    發(fā)表于 11-10 14:28 ?1246次閱讀

    服務器如何部署web項目,一起來看看吧

    我們在購買了云服務器后怎么使用?是當個網絡U盤存儲文件,還是用來搭建網站,提供網路服務?其實是都可以的,不過更多的用途是用于作為網站的服務器來使用,那如何在云服務器
    的頭像 發(fā)表于 07-07 17:21 ?8717次閱讀

    什么是Ansible

    Ansible是一種運維自動化工具軟件,用來批量配置服務器或網絡設備(目標主機)。
    的頭像 發(fā)表于 02-15 14:06 ?2653次閱讀

    利用Ansible批量100臺服務器添加Crontab

    今天浩道跟大家分享關于Ansible自動化運維相關硬核干貨,利用Ansible批量100臺服務器添加Crontab !
    的頭像 發(fā)表于 08-19 14:24 ?1328次閱讀

    Ansible代碼上線項目實戰(zhàn)案例

    在DevOps浪潮中,自動化部署已經成為每個運維工程師的必備技能。今天我將分享一個完整的Ansible代碼上線項目實戰(zhàn)案例,讓你的部署效率提升10倍!
    的頭像 發(fā)表于 07-24 14:03 ?637次閱讀

    利用Ansible自動化部署Linux服務器

    作為一名在運維一線摸爬滾打多年的工程師,我見過太多因為手工配置導致的生產事故。今天,我將毫無保留地分享我在大規(guī)模Linux服務器自動化管理中積累的實戰(zhàn)經驗,讓你也能輕松駕馭數百臺服務器的配置管理。
    的頭像 發(fā)表于 08-06 17:59 ?1363次閱讀

    什么是服務器虛擬化?一文讀懂原理、優(yōu)勢與實戰(zhàn)部署

    什么是服務器虛擬化?當企業(yè)服務器CPU利用率長期低于15%,卻仍需不斷采購新硬件應對業(yè)務增長時,一場基礎設施領域的革命早已悄然發(fā)生——服務器虛擬化。這項技術通過將物理服務器劃分為多個獨
    的頭像 發(fā)表于 08-25 10:52 ?1255次閱讀
    什么是<b class='flag-5'>服務器</b>虛擬化?一文讀懂原理、優(yōu)勢與<b class='flag-5'>實戰(zhàn)</b><b class='flag-5'>部署</b>

    使用Ansible實現大規(guī)模集群自動化部署

    當你面對1000+服務器需要部署時,你還在一臺臺手工操作嗎?本文將揭秘如何用Ansible實現大規(guī)模集群的自動化部署,讓運維效率提升10倍!
    的頭像 發(fā)表于 08-27 14:41 ?878次閱讀

    如何快速在云服務器部署Web環(huán)境?

    如何快速在云服務器部署Web環(huán)境
    的頭像 發(fā)表于 10-14 14:16 ?710次閱讀