【Ansible】
文章目录一、自动化运维工具 - Ansible1、核心特点2、架构组成二、Ansible 的基本使用三、Ansible 常用模块说明1、命令执行模块2、软件包管理模块3、文件管理模块4、服务管理模块5、用户管理模块四、Ansible 配置文件详解五、Playbook 介绍与应用六、使用 Ansible 批量安装部署 Nginx一、自动化运维工具 - AnsibleAnsible 是一款基于 Python 开发的无代理自动化运维工具通过 SSH 协议实现对远程服务器的批量管理无需在被管理节点安装任何客户端软件。它将复杂的运维操作抽象为简单的 “剧本 (Playbook)”支持配置管理、应用部署、任务编排等多种场景。1、核心特点无代理架构仅需控制节点安装 Ansible被管理节点只需开启 SSH 服务声明式语法使用 YAML 格式编写 Playbook可读性强幂等性重复执行相同操作不会产生副作用模块化设计内置数千个功能模块覆盖绝大多数运维场景可扩展性支持自定义模块、插件和角色2、架构组成控制节点安装 Ansible 的服务器执行管理命令和 Playbook被管理节点需要被管理的远程服务器Inventory主机清单文件定义被管理节点的分组和信息Modules执行具体操作的功能单元PlaybookYAML 格式的任务编排文件二、Ansible 的基本使用控制节点安装 Ansible192.168.13.134从 EPEL 10 开始原来的完整ansible元包暂时未同步目前官方仓库只提供ansible-core核心包包含所有基础功能# 安装EPEL仓库提供额外依赖dnfinstall-yepel-release# 安装Ansiblednfinstall-yansible# 验证安装ansible--version配置 SSH 免密登录# 为了实现无密码批量操作 需要将控制节点的公钥分发到所有被管理节点# 生成SSH密钥对一路回车即可ssh-keygen-ted25519# 分发公钥到所有节点ssh-copy-id root192.168.13.134 ssh-copy-id root192.168.13.135 ssh-copy-id root192.168.13.136# 测试免密登录sshroot192.168.13.135hostname配置主机清单 (Inventory)vimetc/ansible/hosts# 全局变量[all:vars]ansible_userrootansible_ssh_port22# 定义web服务器组[webservers]192.168.13.134192.168.13.135192.168.13.136# 定义数据库服务器组示例[dbservers]# 192.168.13.137测试节点连通性# 测试所有节点ansible all-mping# 测试webservers组节点ansible webservers-mping# 测试单个节点ansible192.168.13.135-mping三、Ansible 常用模块说明Ansible 模块是执行具体操作的基本单元使用格式为ansible 主机组 -m 模块名 -a “参数”1、命令执行模块2、软件包管理模块# 安装软件包ansible webservers-mdnf-anamenginx statepresent# 卸载软件包ansible webservers-mdnf-anamenginx stateabsent# 更新所有软件包ansible webservers-mdnf-aname* statelatest3、文件管理模块# 创建目录ansible webservers-mfile-apath/data/www statedirectory mode0755 ownernginx groupnginx# 复制本地文件到远程ansible webservers-mcopy-asrc/root/index.html dest/usr/share/nginx/html/index.html mode0644# 获取远程文件内容ansible webservers-mfetch-asrc/etc/nginx/nginx.conf dest/tmp/ flatyes# 删除文件或目录ansible webservers-mfile-apath/tmp/test.txt stateabsent4、服务管理模块# 启动服务并设置开机自启ansible webservers-mservice-anamenginx statestarted enabledyes# 停止服务ansible webservers-mservice-anamenginx statestopped# 重启服务ansible webservers-mservice-anamenginx staterestarted5、用户管理模块# 创建用户ansible webservers-muser-anamewww shell/bin/bash home/home/www# 删除用户ansible webservers-muser-anamewww stateabsent removeyes四、Ansible 配置文件详解Ansible 的主配置文件为/etc/ansible/ansible.cfg包含了全局配置参数。以下是最常用的配置项。从 Ansible 2.12也就是 ansible-core 时代开始官方做了一个重大改变不再默认提供包含所有配置项的完整文件所有配置项都有内置默认值空文件表示 “全部使用默认值”。所以查看ansible.cfg 是空的[defaults]# 主机清单文件路径inventory/etc/ansible/hosts# 默认远程用户remote_userroot# 并发连接数forks10# 关闭SSH主机密钥检查生产环境建议开启host_key_checkingFalse# 超时时间秒timeout30# 日志文件路径log_path/var/log/ansible.log# 模块搜索路径library/usr/share/ansible/modules[privilege_escalation]# 是否开启权限提升becomeTrue# 权限提升方式become_methodsudo# 权限提升用户become_userroot# 是否需要输入密码become_ask_passFalse[ssh_connection]# SSH连接参数ssh_args-oControlMasterauto-oControlPersist60s# 控制路径control_path/tmp/ansible-ssh-%%h-%%p-%%r五、Playbook 介绍与应用Playbook 是 Ansible 的核心它使用 YAML 格式编写将多个任务组合成一个完整的自动化流程。Playbook 基本结构--- - name: Playbook名称 hosts: 目标主机组 become:yes# 是否使用root权限执行vars:# 定义变量variable1: value1 variable2: value2 tasks:# 任务列表- name: 任务1名称 模块名: 参数1: 值1 参数2: 值2 - name: 任务2名称 模块名: 参数1: 值1变量使用--- - name: 变量使用示例 hosts: webservers vars: nginx_port:80nginx_docroot: /usr/share/nginx/html tasks: - name: 安装Nginx dnf: name: nginx state: present - name: 配置Nginx端口 lineinfile: path: /etc/nginx/nginx.conf regexp:^ listen 80;line: listen {{ nginx_port }};条件判断--- - name: 条件判断示例 hosts: webservers tasks: - name: 仅在Rocky Linux系统上安装Nginx dnf: name: nginx state: present when: ansible_os_familyRedHat执行 Playbook# 执行Playbookansible-playbook playbook.yml# 检查Playbook语法ansible-playbook playbook.yml --syntax-check# 模拟执行不实际修改ansible-playbook playbook.yml--check# 详细输出执行过程ansible-playbook playbook.yml-v六、使用 Ansible 批量安装部署 Nginx以下是一个完整的 Playbook实现批量安装、配置、启动 Nginx 并验证服务状态。创建项目目录结构mkdir-p/etc/ansible/nginx-deploy/{files,templates}cd/etc/ansible/nginx-deploy准备 Nginx 配置文件vimfiles/index.html!DOCTYPE htmlhtmlheadtitleAnsible部署的Nginx/titlestylebody{text-align: center;padding: 50px;font-family: Arial, sans-serif;}h1{font-size: 3em;color:#2c3e50; }p{font-size:1.5em;color:#34495e; }/style/headbodyh1恭喜Nginx部署成功/h1p服务器IP:{{ansible_default_ipv4.address}}/pp部署时间:{{ansible_date_time.iso8601}}/p/body/html编写 Playbookvimnginx_install.yml--- - name: 批量安装部署Nginx服务 hosts: webservers become:yesgather_facts:yescollections: - community.general vars: nginx_port:80nginx_docroot: /usr/share/nginx/html nginx_user: nginx nginx_group: nginx tasks: - name: 安装EPEL仓库 dnf: name: epel-release state: present - name: 安装Nginx dnf: name: nginx state: present - name: 创建Nginx文档根目录 file: path:{{ nginx_docroot }}state: directory owner:{{ nginx_user }}group:{{ nginx_group }}mode:0755- name: 复制自定义首页文件 template: src: files/index.html dest:{{ nginx_docroot }}/index.htmlowner:{{ nginx_user }}group:{{ nginx_group }}mode:0644- name: 配置Nginx监听端口 lineinfile: path: /etc/nginx/nginx.conf regexp:^ listen 80;line: listen {{ nginx_port }};backup:yes- name: 开放防火墙80端口 firewalld: port:{{ nginx_port }}/tcppermanent:yesimmediate:yesstate: enabled - name: 启动Nginx服务并设置开机自启 service: name: nginx state: started enabled:yes- name: 验证Nginx服务状态 uri: url:http://{{ ansible_default_ipv4.address }}:{{ nginx_port }}status_code:200register: nginx_status until: nginx_status.status200retries:5delay:2- name: 输出部署成功信息 debug: msg:Nginx服务在{{ ansible_default_ipv4.address }}部署成功访问地址http://{{ ansible_default_ipv4.address }}:{{ nginx_port }}执行 Playbook# 安装最常用的几个社区集合ansible-galaxy collectioninstallcommunity.general ansible.posix community.docker# 先检查语法ansible-playbook nginx_install.yml --syntax-check# 执行部署ansible-playbook nginx_install.yml