自動化與配置管理工具 ——Ansible

一、Ansible 概述

1.1 核心特性

Ansible 是一款開源的自動化運維工具,采用無代理(Agentless)架構,通過 SSH 協議實現對遠程節點的管理。其核心特性包括:

  • 無代理架構:被管理節點無需安裝代理軟件,降低部署復雜度
  • 聲明式語法:通過 YAML 格式的 Playbook 定義目標狀態
  • 模塊化設計:豐富的內置模塊覆蓋各類運維場景,支持自定義模塊
  • 冪等性操作:確保多次執行相同任務結果一致,避免重復操作風險
  • 簡單易用:學習曲線平緩,配置文件可讀性強
  • 強大的編排能力:支持復雜任務流程和依賴關系定義

1.2 應用場景

Ansible 適用于多種運維自動化場景:

  • 服務器初始化配置(操作系統優化、安全加固)
  • 應用程序部署與升級
  • 配置文件統一管理與分發
  • 批量命令執行與任務調度
  • 云資源管理(AWS、Azure、GCP 等)
  • 容器編排(Docker、Kubernetes)
  • 基礎設施即代碼(IaC)實踐

二、Ansible 安裝與環境準備

2.1 控制節點安裝

2.1.1 基于包管理器安裝(CentOS 7)
# 安裝 EPEL 源
yum install -y epel-release# 安裝 Ansible
yum install -y ansible# 驗證安裝
ansible --version
2.1.2 基于包管理器安裝(Ubuntu 20.04)
# 更新軟件包列表
apt update# 安裝 Ansible
apt install -y ansible# 驗證安裝
ansible --version
2.1.3 基于 Python Pip 安裝
# 安裝 Python 和 pip
yum install -y python3 python3-pip  # CentOS
# 或
apt install -y python3 python3-pip   # Ubuntu# 安裝 Ansible
pip3 install ansible# 驗證安裝
ansible --version

2.2 被管理節點準備

Ansible 對被管理節點的要求極低,只需滿足:

  • 開通 SSH 服務(默認端口 22)
  • 安裝 Python 2.7 或 Python 3.5+
  • 控制節點能通過 SSH 訪問被管理節點

對于未安裝 Python 的節點,可通過以下方式快速安裝:

# 在被管理節點手動安裝(CentOS)
yum install -y python3# 在被管理節點手動安裝(Ubuntu)
apt install -y python3

2.3 SSH 免密配置

為提高安全性和操作便捷性,建議配置控制節點到被管理節點的 SSH 免密登錄:

# 在控制節點生成 SSH 密鑰對
ssh-keygen -t ed25519 -N "" -f ~/.ssh/ansible_id_ed25519# 手動分發公鑰到被管理節點
ssh-copy-id -i ~/.ssh/ansible_id_ed25519.pub admin@192.168.1.101# 批量分發公鑰(使用密碼)
ansible all -i inventory.ini -m authorized_key -a "user=admin key='{{ lookup('file', '~/.ssh/ansible_id_ed25519.pub') }}'" --user=admin --ask-pass

三、Ansible 核心配置

3.1 主配置文件

Ansible 主配置文件默認路徑為 /etc/ansible/ansible.cfg,常用配置項:

[defaults]
# 默認 Inventory 文件路徑
inventory = /etc/ansible/hosts# 默認遠程用戶
remote_user = admin# 是否自動提權
become = yes
become_method = sudo
become_user = root
become_ask_pass = no# 并行執行數量
forks = 5# SSH 連接超時時間(秒)
timeout = 10# 模塊查找路徑
module_paths = /usr/share/ansible/plugins/modules# 角色查找路徑
roles_path = /etc/ansible/roles:/usr/share/ansible/roles# 日志配置
log_path = /var/log/ansible.log[ssh_connection]
# SSH 連接池設置
ssh_args = -o ControlMaster=auto -o ControlPersist=60s
control_path_dir = ~/.ansible/cp

3.2 Inventory 配置

Inventory 用于定義被管理節點的清單,支持多種格式和分組方式。

3.2.1 INI 格式 Inventory
# /etc/ansible/hosts
# 基礎主機定義
web1.example.com
web2.example.com:2222  # 非默認 SSH 端口
192.168.1.103# 分組定義
[webservers]
web1.example.com
web2.example.com
192.168.1.103[dbservers]
db1.example.com
db2.example.com
192.168.1.201:2222# 組變量
[webservers:vars]
http_port=80
max_clients=200[dbservers:vars]
db_port=3306
db_name=appdb# 嵌套組
[allservers:children]
webservers
dbservers# 環境分組
[production:children]
webservers
dbservers[staging:children]
webservers_staging
dbservers_staging
3.2.2 YAML 格式 Inventory
# inventory.yaml
all:vars:ansible_user: adminansible_port: 22children:webservers:hosts:web1.example.com:http_port: 80web2.example.com:http_port: 8080192.168.1.103:http_port: 80vars:server_type: webmax_connections: 1000dbservers:hosts:db1.example.com:db_type: mysqldb2.example.com:db_type: postgresql192.168.1.201:ansible_port: 2222db_type: mysqlvars:server_type: databaseproduction:children:webservers:dbservers:

3.3 驗證節點連通性

# 測試所有節點連通性
ansible all -m ping# 測試特定組節點連通性
ansible webservers -m ping# 測試單個節點連通性
ansible web1.example.com -m ping# 使用指定 Inventory 文件
ansible all -i inventory.yaml -m ping# 查看節點信息
ansible all -m setup

四、Ansible 命令行工具使用

4.1 常用 ansible 命令

# 執行臨時命令(查看磁盤使用情況)
ansible webservers -a "df -h"# 指定用戶執行命令
ansible dbservers -a "free -m" -u admin# 提權執行命令(需要 sudo 權限)
ansible all -a "systemctl status nginx" --become# 使用指定模塊執行操作
ansible webservers -m yum -a "name=nginx state=present" --become
ansible webservers -m service -a "name=nginx state=started enabled=yes" --become# 復制文件到遠程節點
ansible webservers -m copy -a "src=/local/path/file dest=/remote/path/file mode=0644"# 創建目錄
ansible all -m file -a "path=/data/logs state=directory mode=0755 owner=root group=root" --become# 查看模塊幫助
ansible-doc yum
ansible-doc -s copy  # 查看模塊示例

4.2 ansible-playbook 命令

# 執行 Playbook
ansible-playbook playbook.yml# 執行指定 Inventory 的 Playbook
ansible-playbook -i inventory.yaml playbook.yml# 執行指定標簽的任務
ansible-playbook playbook.yml --tags "install,config"# 跳過指定標簽的任務
ansible-playbook playbook.yml --skip-tags "restart"# 列出 Playbook 中的任務
ansible-playbook playbook.yml --list-tasks# 檢查 Playbook 語法
ansible-playbook playbook.yml --syntax-check# 執行 dry-run(模擬執行)
ansible-playbook playbook.yml --check# 詳細輸出執行過程
ansible-playbook playbook.yml -v
ansible-playbook playbook.yml -vvv  # 更詳細輸出

五、Playbook 編寫與應用

5.1 Playbook 基本結構

Playbook 是 Ansible 自動化任務的核心,采用 YAML 格式編寫,基本結構:

- name: 第一個 Playbook 示例hosts: webserversvars:http_port: 80max_clients: 200remote_user: adminbecome: yesbecome_method: sudotasks:- name: 任務 1 描述module_name:parameter1: value1parameter2: value2tags:- tag1- tag2- name: 任務 2 描述module_name:parameter1: value1when: ansible_os_family == "RedHat"notify:- 處理程序名稱handlers:- name: 處理程序名稱module_name:parameter1: value1

5.2 常用模塊示例

5.2.1 包管理模塊
# 安裝軟件包(yum)
- name: 安裝 Nginxyum:name: nginxstate: present  # 確保安裝update_cache: yes  # 等同于 yum clean all# 安裝特定版本
- name: 安裝特定版本的 Dockeryum:name: docker-19.03.15state: present# 卸載軟件包
- name: 卸載 Apacheyum:name: httpdstate: absent  # 確保卸載# Ubuntu/Debian 系統使用 apt 模塊
- name: 安裝 Nginxapt:name: nginxstate: presentupdate_cache: yes
5.2.2 服務管理模塊
# 啟動服務并設置開機自啟
- name: 啟動 Nginx 服務service:name: nginxstate: startedenabled: yes  # 開機自啟# 重啟服務
- name: 重啟 MySQL 服務service:name: mysqldstate: restarted# 停止服務
- name: 停止防火墻服務service:name: firewalldstate: stoppedenabled: no  # 禁止開機自啟# 重載服務配置
- name: 重載 Nginx 配置service:name: nginxstate: reloaded
5.2.3 文件操作模塊
# 復制文件
- name: 復制 Nginx 配置文件copy:src: ./files/nginx.confdest: /etc/nginx/nginx.confmode: '0644'  # 文件權限owner: root   # 所有者group: root   # 所屬組backup: yes   # 覆蓋前備份原文件# 模板文件(使用 Jinja2 模板)
- name: 生成虛擬主機配置template:src: ./templates/vhost.conf.j2dest: /etc/nginx/conf.d/{{ server_name }}.confmode: '0644'validate: 'nginx -t -c %s'  # 配置驗證# 創建目錄
- name: 創建應用日志目錄file:path: /var/log/myappstate: directorymode: '0755'owner: appusergroup: appgrouprecurse: yes  # 遞歸創建父目錄# 刪除文件/目錄
- name: 刪除臨時文件file:path: /tmp/tempfilesstate: absent
5.2.4 命令執行模塊
# 執行命令(無環境變量)
- name: 查看系統版本command: cat /etc/redhat-releaseregister: os_version  # 保存輸出結果- name: 顯示系統版本debug:var: os_version.stdout# 執行 Shell 命令(帶環境變量)
- name: 統計 Nginx 進程數shell: ps -ef | grep nginx | grep -v grep | wc -lregister: nginx_process_count# 執行腳本
- name: 執行初始化腳本script: ./scripts/init.shargs:creates: /var/log/init_done  # 如果文件存在則不執行

5.3 條件判斷與循環

5.3.1 條件判斷
# 根據操作系統類型安裝不同軟件
- name: 安裝 Web 服務器(RedHat)yum:name: httpdstate: presentwhen: ansible_os_family == "RedHat"- name: 安裝 Web 服務器(Debian)apt:name: apache2state: presentwhen: ansible_os_family == "Debian"# 多條件判斷
- name: 僅在生產環境且內存大于 4GB 時執行command: /opt/app/heavy_task.shwhen:- environment == "production"- ansible_memtotal_mb > 4096# 基于前序任務結果判斷
- name: 檢查文件是否存在stat:path: /etc/important.confregister: important_file- name: 如果文件不存在則創建file:path: /etc/important.confstate: touchwhen: not important_file.stat.exists
5.3.2 循環
# 簡單列表循環
- name: 創建多個目錄file:path: "{{ item }}"state: directorymode: '0755'loop:- /var/log/app/debug- /var/log/app/error- /var/log/app/access# 字典列表循環
- name: 創建多個用戶user:name: "{{ item.name }}"uid: "{{ item.uid }}"group: "{{ item.group }}"state: presentloop:- { name: 'appuser', uid: 1001, group: 'appgroup' }- { name: 'webuser', uid: 1002, group: 'webgroup' }- { name: 'dbuser', uid: 1003, group: 'dbgroup' }# 循環帶標簽
- name: 安裝多個軟件包yum:name: "{{ item }}"state: presentloop:- nginx- php- mysqlloop_control:label: "Installing {{ item }}"  # 簡化輸出

5.4 處理程序(Handlers)

Handlers 用于響應任務通知,通常用于重啟服務、重新加載配置等操作:

- name: 配置 Nginxhosts: webserversbecome: yestasks:- name: 安裝 Nginxyum:name: nginxstate: present- name: 復制 Nginx 主配置copy:src: ./files/nginx.confdest: /etc/nginx/nginx.confmode: '0644'notify:  # 配置變化時通知- 重啟 Nginx- name: 復制虛擬主機配置template:src: ./templates/vhost.conf.j2dest: /etc/nginx/conf.d/example.com.confmode: '0644'notify:- 重載 Nginx 配置  # 配置變化時通知- name: 確保 Nginx 服務啟動service:name: nginxstate: startedenabled: yeshandlers:  # 定義處理程序- name: 重啟 Nginxservice:name: nginxstate: restarted- name: 重載 Nginx 配置service:name: nginxstate: reloaded

六、Ansible 角色(Roles)

6.1 角色目錄結構

Roles 是 Ansible 用于組織 Playbook 的標準化目錄結構,便于代碼復用和共享。標準的角色目錄結構如下:

roles/
├── role_name/               # 角色名稱
│   ├── defaults/            # 默認變量(優先級最低)
│   │   └── main.yml
│   ├── files/               # 靜態文件(copy模塊使用)
│   ├── handlers/            # 處理程序
│   │   └── main.yml
│   ├── meta/                # 角色元數據(依賴關系等)
│   │   └── main.yml
│   ├── tasks/               # 任務列表
│   │   └── main.yml
│   ├── templates/           # 模板文件(template模塊使用)
│   ├── vars/                # 角色變量(優先級較高)
│   │   └── main.yml
│   └── README.md            # 角色說明文檔

各目錄功能說明:

  • defaults/main.yml:定義角色的默認變量,可被外部變量覆蓋
  • files/:存放需要復制到目標主機的靜態文件
  • handlers/main.yml:角色相關的處理程序
  • meta/main.yml:定義角色依賴、作者、許可證等元數據
  • tasks/main.yml:角色的主要任務列表
  • templates/:存放 Jinja2 模板文件
  • vars/main.yml:角色的私有變量,優先級高于 defaults

6.2 創建和使用角色

6.2.1 初始化角色
# 使用ansible-galaxy命令創建角色骨架
ansible-galaxy init roles/nginx
ansible-galaxy init roles/mysql
ansible-galaxy init roles/php
6.2.2 編寫角色內容

以nginx角色為例:

  1. 定義任務(tasks/main.yml)
- name: 安裝Nginxyum:name: nginxstate: presentwhen: ansible_os_family == "RedHat"- name: 安裝Nginx(Debian)apt:name: nginxstate: presentwhen: ansible_os_family == "Debian"- name: 復制Nginx主配置文件template:src: nginx.conf.j2dest: /etc/nginx/nginx.confmode: '0644'notify: 重啟Nginx- name: 創建虛擬主機配置目錄file:path: /etc/nginx/conf.dstate: directorymode: '0755'- name: 部署默認虛擬主機配置template:src: default.conf.j2dest: /etc/nginx/conf.d/default.confmode: '0644'notify: 重載Nginx配置- name: 確保Nginx服務啟動并開機自啟service:name: nginxstate: startedenabled: yes

? ? 2. 定義處理程序(handlers/main.yml)

- name: 重啟Nginxservice:name: nginxstate: restarted- name: 重載Nginx配置service:name: nginxstate: reloaded

? ? 3. 定義變量(defaults/main.yml)

# 默認端口
nginx_listen_port: 80# 服務器名稱
nginx_server_name: localhost# 文檔根目錄
nginx_root: /var/www/html

? ? 4. 創建模板文件(templates/nginx.conf.j2)

user nginx;
worker_processes {{ ansible_processor_vcpus }};  # 使用facts獲取CPU核心數error_log /var/log/nginx/error.log;
pid /run/nginx.pid;events {worker_connections 1024;
}http {log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile            on;tcp_nopush          on;tcp_nodelay         on;keepalive_timeout   65;types_hash_max_size 2048;include             /etc/nginx/mime.types;default_type        application/octet-stream;include /etc/nginx/conf.d/*.conf;
}
6.2.3 在 Playbook 中使用角色
# site.yml
- name: 部署Web服務器hosts: webserversbecome: yesroles:- role: nginxvars:nginx_listen_port: 8080nginx_server_name: web.example.com- role: php- role: mysqlvars:mysql_root_password: secure_passwordmysql_databases:- name: webappmysql_users:- name: webuserpassword: user_passwordpriv: 'webapp.*:ALL'

也可以使用import_role或include_role動態導入角色:

- name: 部署應用服務器hosts: appserversbecome: yestasks:- name: 安裝基礎組件import_role:name: base- name: 根據環境部署Web服務include_role:name: "{{ web_server_role }}"vars:web_server_role: nginx

6.3 角色依賴管理

在meta/main.yml中定義角色依賴:

galaxy_info:author: Your Namedescription: Nginx web server rolelicense: MITmin_ansible_version: 2.9platforms:- name: ELversions:- 7- 8- name: Ubuntuversions:- focal- bionicgalaxy_tags:- web- nginx- serverdependencies:- role: firewalldvars:firewall_ports:- 80/tcp- 443/tcp- role: ssl_certvars:cert_domain: "{{ nginx_server_name }}"

七、Ansible 實戰案例

7.1 服務器初始化配置

# init_server.yml
- name: 服務器初始化配置hosts: allbecome: yesvars:timezone: Asia/Shanghaissh_port: 22allowed_ssh_users:- admin# 禁用密碼登錄,只允許SSH密鑰ssh_password_auth: notasks:- name: 設置時區timezone:name: "{{ timezone }}"- name: 安裝基礎工具包yum:name:- vim- wget- curl- net-tools- lsof- tcpdump- chronystate: presentwhen: ansible_os_family == "RedHat"- name: 安裝基礎工具包(Debian)apt:name:- vim- wget- curl- net-tools- lsof- tcpdump- chronystate: presentwhen: ansible_os_family == "Debian"- name: 啟動時間同步服務service:name: chronydstate: startedenabled: yes- name: 配置SSH服務lineinfile:path: /etc/ssh/sshd_configregexp: "{{ item.regexp }}"line: "{{ item.line }}"state: presentloop:- { regexp: '^Port', line: 'Port {{ ssh_port }}' }- { regexp: '^PasswordAuthentication', line: 'PasswordAuthentication {{ ssh_password_auth | lower }}' }- { regexp: '^PermitRootLogin', line: 'PermitRootLogin no' }notify: 重啟SSH服務- name: 配置sudo權限lineinfile:path: /etc/sudoers.d/allowed_usersline: '{{ item }} ALL=(ALL) NOPASSWD: ALL'state: presentmode: '0440'validate: 'visudo -cf %s'loop: "{{ allowed_ssh_users }}"handlers:- name: 重啟SSH服務service:name: sshdstate: restarted

7.2 部署 Docker 和容器化應用

# deploy_docker_app.yml
- name: 部署Docker和應用容器hosts: appserversbecome: yesvars:docker_packages:- docker-ce- docker-ce-cli- containerd.io- docker-compose-pluginapp_name: myappapp_port: 8080app_image: myapp:latesttasks:- name: 添加Docker YUM源yum_repository:name: docker-ce-stabledescription: Docker CE Stable - $basearchbaseurl: https://download.docker.com/linux/centos/$releasever/$basearch/stablegpgcheck: yesgpgkey: https://download.docker.com/linux/centos/gpgwhen: ansible_os_family == "RedHat"- name: 安裝Dockeryum:name: "{{ docker_packages }}"state: presentwhen: ansible_os_family == "RedHat"- name: 啟動Docker服務service:name: dockerstate: startedenabled: yes- name: 將用戶添加到docker組user:name: "{{ ansible_user }}"groups: dockerappend: yes- name: 創建應用目錄file:path: /opt/{{ app_name }}state: directorymode: '0755'- name: 復制docker-compose配置template:src: docker-compose.yml.j2dest: /opt/{{ app_name }}/docker-compose.ymlmode: '0644'- name: 啟動應用容器community.docker.docker_compose:project_src: /opt/{{ app_name }}state: present

對應的docker-compose.yml.j2模板:

version: '3'
services:app:image: {{ app_image }}ports:- "{{ app_port }}:8080"environment:- DB_HOST={{ db_host }}- DB_NAME={{ db_name }}- DB_USER={{ db_user }}- DB_PASS={{ db_pass }}restart: alwaysvolumes:- app_data:/var/lib/{{ app_name }}depends_on:- dbdb:image: mysql:8.0environment:- MYSQL_ROOT_PASSWORD={{ db_root_pass }}- MYSQL_DATABASE={{ db_name }}- MYSQL_USER={{ db_user }}- MYSQL_PASSWORD={{ db_pass }}restart: alwaysvolumes:- db_data:/var/lib/mysqlvolumes:app_data:db_data:

八、Ansible 高級特性

8.1 變量與事實(Facts)

8.1.1 變量優先級

Ansible 變量按以下優先級從高到低排序:

  1. 命令行變量(-e 或 --extra-vars)
  2. 角色內 vars 目錄定義的變量
  3. Playbook 中 vars 部分定義的變量
  4. 主機變量(Inventory 中定義)
  5. 組變量(Inventory 中定義)
  6. 角色內 defaults 目錄定義的變量
8.1.2 事實緩存

Facts 是 Ansible 收集的被管理節點信息,可緩存以提高性能:

# ansible.cfg
[defaults]
gathering = smart  # 只在需要時收集
fact_caching = jsonfile
fact_caching_connection = /var/cache/ansible/facts
fact_caching_timeout = 86400  # 緩存24小時

8.2 加密敏感數據

使用ansible-vault加密敏感信息:

# 創建加密文件
ansible-vault create secrets.yml# 編輯加密文件
ansible-vault edit secrets.yml# 查看加密文件
ansible-vault view secrets.yml# 加密現有文件
ansible-vault encrypt existing_file.yml# 解密文件
ansible-vault decrypt encrypted_file.yml# 更改密碼
ansible-vault rekey secrets.yml

運行 Playbook 時需要提供密碼:

ansible-playbook --ask-vault-pass playbook.yml
# 或使用密碼文件
ansible-playbook --vault-password-file vault_pass.txt playbook.yml

8.3 動態 Inventory

動態 Inventory 用于從外部源(如云服務、CMDB)獲取主機列表:

# 使用AWS動態Inventory
pip3 install boto3
wget https://raw.githubusercontent.com/ansible/ansible/stable-2.14/contrib/inventory/ec2.py
wget https://raw.githubusercontent.com/ansible/ansible/stable-2.14/contrib/inventory/ec2.ini
chmod +x ec2.py# 測試動態Inventory
./ec2.py --list# 使用動態Inventory運行Playbook
ansible-playbook -i ec2.py playbook.yml

8.4 回調插件

回調插件用于自定義 Ansible 的輸出格式:

# ansible.cfg
[defaults]
stdout_callback = yaml  # 更易讀的YAML格式輸出
# 或使用社區插件
# stdout_callback = community.general.yaml

常用回調插件:

  • yaml:YAML 格式輸出
  • json:JSON 格式輸出
  • debug:詳細調試輸出
  • profile_tasks:任務執行時間統計

九、Ansible 最佳實踐

9.1 項目結構組織

推薦的 Ansible 項目結構:

project/
├── ansible.cfg           # 項目級配置
├── inventory/            #  inventory文件
│   ├── production/
│   │   ├── hosts
│   │   ├── group_vars/
│   │   └── host_vars/
│   └── staging/
│       ├── hosts
│       ├── group_vars/
│       └── host_vars/
├── playbooks/            # Playbook文件
│   ├── webserver.yml
│   ├── dbserver.yml
│   └── site.yml          # 主Playbook
├── roles/                # 自定義角色
│   ├── nginx/
│   ├── mysql/
│   └── common/
├── roles/                # 第三方角色(通過ansible-galaxy安裝)
├── files/                # 通用文件
├── templates/            # 通用模板
├── vars/                 # 變量文件
│   ├── main.yml
│   └── secrets.yml       # 加密的敏感變量
└── docs/                 # 文檔

9.2 安全性最佳實踐

  1. 敏感數據管理
    • 使用 ansible-vault 加密密碼、密鑰等敏感信息
    • 避免在 Playbook 中硬編碼敏感數據
    • 限制加密文件的訪問權限

? ? ?2. 權限控制

    • 最小權限原則:遠程用戶只授予必要權限
    • 避免使用 root 用戶直接操作
    • 使用 sudo 提權而非直接登錄 root

? ? ?3. SSH 安全

    • 禁用 SSH 密碼認證,只使用密鑰
    • 更改默認 SSH 端口
    • 限制允許登錄的用戶和 IP

9.3 性能優化

  1. 減少事實收集開銷
# 完全禁用事實收集
- hosts: allgather_facts: no

? ? ?2. 增加并行處理數量

# ansible.cfg
[defaults]
forks = 20  # 根據控制節點性能調整

? ? 3. 使用連接池

# ansible.cfg
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=300s

? ? 4. 任務優化

    • 合理使用when條件減少不必要的任務
    • 使用tags只執行必要任務
    • 避免在循環中使用with_items處理大量數據

十、總結與展望

Ansible 憑借其無代理架構、簡單易用的特點,成為自動化運維領域的佼佼者。它不僅能簡化日常運維工作,還能通過基礎設施即代碼(IaC)的方式提高系統的可重復性和可維護性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94110.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94110.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94110.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Effective C++ 條款18:讓接口容易被正確使用,不易被誤用

Effective C 條款18:讓接口容易被正確使用,不易被誤用核心思想:設計接口時,應使正確使用方式直觀自然,同時通過類型系統、行為約束等手段主動預防常見錯誤,減少用戶犯錯的可能性。 ?? 1. 接口誤用的常見陷…

nodejs讀寫文件

1.讀文件 node有很多模塊,可在node模塊查看相應模塊; var fsrequire(fs)fs.readFile(./src/a.doc,utf8,function(err,data){// 如果發生錯誤,data是undefined 如果成功 err為null console.log(err); console.log(data); }) 2.寫文件 var…

ConcurrentHashMapRedis實現二級緩存

1. 為什么使用ConcurrentHashMap?在Java中,ConcurrentHashMap 是一個線程安全且高效的哈希表實現,廣泛用于高并發場景。將其用作一級緩存的原因主要包括以下幾點:1.1. 線程安全性ConcurrentHashMap 是線程安全的,支持多…

Mysql集群技術

實驗在RHEL7中做,因為9中缺少了一個關鍵的高可用組件環境:兩臺數據庫,內存和CPU要多一點主流是MYSQL(開源),Oracle收費較貴RHEL7中直接用make編譯是有問題的,所以需要要gcc工具做好前置準備&…

自動駕駛嵌入式軟件工程師面試題【持續更新】

文章目錄前言請描述 CAN 幀的基本結構(包括標識符、數據字段、CRC 等)描述 WebSocket 協議的基本工作流程(包括握手、數據幀結構)請說明如何實現 WebSocket 連接的心跳機制以檢測連接狀態,并描述在斷開后如何通過重連策…

vue(5)-組件

一.組件三大組成部分(結構/樣式/邏輯)(1)組件樣式沖突用scoped全局樣式在組件中起全局作用,局部樣式可以加scoped屬性來只作用于當前組件圖中只給baseone加這個樣式,就在baseone中style加scoped&#xff08…

【機器學習】兩大線性分類算法:邏輯回歸與線性判別分析:找到分界線的藝術

文章目錄一、核心概念:數據分類的"切分線"二、工作原理:從"找分界線"理解二、常見算法1、邏輯回歸:二分類2、線性判別分析(LDA):分類與降維3、兩種算法對比分析三、實際應用&#xff1…

靜態分析c/cpp源碼函數調用關系圖生成

calltree calltree 不好使用 Dpxygen https://www.doxygen.nl/download.html Graphviz https://graphviz.org/download/ 靜態代碼調用結構圖分析、構建、生成 doxygen doxygen在win和linux上均可運行,可以自動分析源碼,對c語言項目友好,預處…

使用 MySQL Shell 進行 MySQL 單機到 InnoDB Cluster 的數據遷移實踐

遷移背景與環境原來都是用mysqldump,DTS或者cdc遷移,這次8.0用了下新工具感覺挺好用的,簡單快捷,30G數據不到源環境:單機 MySQL 8.0,地址為 172.23.3.28目標環境:InnoDB Cluster 集群&#xff0…

淘寶商品API可以獲取哪些商品詳情數據?

商品詳情頁商品全部sku信息"skus": {"sku": [{"price": 45.6,"total_price": 0,"orginal_price": 45.6,"properties": "1627207:39617249736","properties_name": "1627207:39617249736…

新一代PLC控制軟件平臺EsDA-AWStudio

在工業自動化和智能制造領域,高效的軟件平臺是提升開發效率和系統性能的關鍵。ZLG致遠電子推出的EsDA-AWStudio平臺,憑借其強大的功能和靈活的設計,為工業控制和物聯網應用提供了全新的解決方案。一站式PLC工業控制軟件平臺EsDA-AWStudioZLG致…

基于深度學習的醫學圖像分析:使用MobileNet實現醫學圖像分類

前言 醫學圖像分析是計算機視覺領域中的一個重要應用,特別是在醫學圖像分類任務中,深度學習技術已經取得了顯著的進展。醫學圖像分類是指將醫學圖像分配到預定義的類別中,這對于疾病的早期診斷和治療具有重要意義。近年來,MobileN…

docker 容器常用命令

在平常的開發工作中,我們經常需要使用 docker 容器,那么常用的 docker 容器命令有哪些呢?今天簡單總結下。 一:查看容器查看運行的容器:docker ps查看所有的容器:docker ps a查看容器詳細信息&#…

重型機械作業誤傷預警響應時間縮短80%!陌訊多模態識別算法在工程現場的應用優化

一、行業痛點:機械作業場景的識別困境據《工程機械安全白皮書(2025)》統計,施工現場因機械盲區導致的工傷事故中??78.3%由識別延遲引發??。核心難點包括:??動態遮擋問題??:吊臂擺動導致目標部件部分…

2025年ESWA SCI1區TOP,強化學習多目標灰狼算法MOGWO-RL+分布式混合流水車間調度,深度解析+性能實測

目錄1.摘要2.問題描述和數學建模3.強化學習多目標灰狼算法MOGWO-RL4.結果展示5.參考文獻6.算法輔導應用定制讀者交流1.摘要 本文針對大規模個性化制造(MPM)中的調度問題,提出了一種新的解決方案。MPM能夠在確保大規模生產的前提下&#xff0…

Mac 系統下安裝 nvm

Mac 系統下安裝 nvm nvm 全稱為 node version manger,顧名思義就是管理 node 版本的一個工具,通過這個工具,我們可以在一臺計算機上安裝多個版本的 node,并且隨時進行無縫的切換。 1. 卸載原本的 node.js(重要&#xf…

變量篩選—隨機森林特征重要性

對于接觸算法模型不久的小伙伴來說,建模中海量變量篩選總是讓人頭疼,不知道如何把握。之前已經介紹了一些變量篩選的方法:變量篩選一張圖、【變量篩選】計算類別型變量IV值、KS值、一文囊括風控建模中的變量篩選方法、變量篩選—特征包含信息量。本文詳細介紹通過隨機森林算…

【設計模式】 3.設計模式基本原則

單一職責原則 對于一個類而言,有且僅有一個引起他變化的原因或者說,一個類只負責一個職責 如果一個類承擔的職責過多,那么這些職責放在一起耦合度太高了,一個職責的變化可能會影響這個類其他職責的能力。 所以我們在做軟件設計的時…

ABP VNext + Redis Bloom Filter:大規模緩存穿透防護與請求去重

ABP VNext Redis Bloom Filter:大規模緩存穿透防護與請求去重 🚀 📚 目錄ABP VNext Redis Bloom Filter:大規模緩存穿透防護與請求去重 🚀TL;DR ?1. 引言 🎉2. 環境與依賴 🛠?3. Bloom Filt…

構建工具和腳手架:從源碼到dist

構建工具和腳手架:從源碼到dist**1. 為什么需要工程轉換?****2. 構建工具的核心職責**為什么要求轉換**1)明確三種關鍵問題****(2)Webpack 的打包機制****3. 開發服務器(Webpack Dev Server)***…