如何配置Ansible实现自动化部署?

摘要:Ansible是什么? Ansible官网:https:www.ansible.com Ansible 是一款开源的自动化运维工具,由 RedHat 公司开发维护,核心目标是实现: 批量服务器操作(命令执行、软件安装、配置修改) 应用
Ansible是什么? Ansible官网:https://www.ansible.com/ Ansible 是一款开源的自动化运维工具,由 RedHat 公司开发维护,核心目标是实现: 批量服务器操作(命令执行、软件安装、配置修改) 应用部署与生命周期管理 配置自动化(替代手动修改配置文件) 任务编排(按顺序执行复杂的运维流程) 它最大的特点是无客户端(Agentless) —— 不需要在被管理的服务器上安装任何代理程序,仅通过 SSH 协议(默认)或 WinRM(Windows 主机)与目标机器通信,部署和使用门槛极低。 Ansible 核心特性 无代理架构:仅需控制节点(安装 Ansible 的机器)能 SSH 连接被管理节点,无需在目标机装软件,降低维护成本; 模块化设计:内置上千个模块(如 yum/apt 安装软件、copy 传输文件、service 管理服务),覆盖绝大多数运维场景; 声明式语法:用 YAML 编写 Playbook(剧本),只需描述 “最终要达到什么状态”,无需写 “如何达到这个状态”,Ansible 会自动处理执行逻辑; 幂等性:多次执行同一个操作,结果始终一致(比如 “确保 nginx 服务启动”,无论执行多少次,最终都是启动状态); 跨平台:支持管理 Linux、Windows、网络设备(华为 / 思科 / 华三)、云平台(AWS / 阿里云 / 腾讯云)等。 Ansible架构 Ansible安装与配置 安装Ansible # 首先安装python3 root@master:~# apt install -y python3 root@master:~# apt install -y python3-pip # 安装ansible # -i指定安装源,可以不加-i参数,直接pip3 install ansible root@master:~# pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple ansible 检查是否安装成功 root@master:~# ansible --version ansible [core 2.14.18] config file = /etc/ansible/ansible.cfg configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3/dist-packages/ansible ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections executable location = /usr/bin/ansible python version = 3.11.2 (main, Aug 26 2024, 07:20:54) [GCC 12.2.0] (/usr/bin/python3) jinja version = 3.1.5 libyaml = True 修改Ansible的配置文件 Ansible的配置文件默认没有配置上,需要使用命令进行初始化 # 创建目录 root@master:~# mkdir -p /etc/ansible # 初始化配置文件 root@master:~# ansible-config init --disabled > /etc/ansible/ansible.cfg 修改配置文件,修改下面两个地方就好 root@master:~# vim /etc/ansible/ansible.cfg # #类似于 ssh -oStrictHostKeyChecking=no host_key_checking=False # 日志 log_path=/var/log/ansible.log 配置Ansible的hosts(被管理的主机清单)配置文件 Ansible的hosts文件作用 定义被管理节点:把所有需要 Ansible 操作的服务器(IP / 主机名 / 域名)列在这个文件里,Ansible 只能识别并操作这里面的节点; 分组管理节点:按业务场景(如 web 服务器、数据库服务器)给节点分组,方便批量操作指定分组(比如只给 web 组装 nginx); 配置节点属性:给单个节点 / 分组设置专属变量(如 SSH 端口、登录用户、自定义参数),让 Ansible 适配不同节点的差异; 简化操作指令:不用每次执行命令都手动写一堆 IP,直接用分组名(如 webservers)就能指代一组节点。 配置hosts文件 Ansible 默认读取 /etc/ansible/hosts,你也可以通过 -i 参数指定自定义的 hosts 文件(比如 ansible -i /opt/my_hosts all -m ping)。 root@master:~# cat /etc/ansible/hosts [web] 10.37.99.63 10.37.120.9 [db] 10.37.99.63 [es] 10.37.120.9 配置机器之间免密登录 可以查看这篇文章:Linux机器之间配置免密登录 当然也可以不配置免密登录,这个后续文章会更新,这里可以照着这里做就好 测试使用 测试所有被管理主机执行ping命令 # -m指定ansible的模块 root@master:~# ansible all -m ping [WARNING]: Platform linux on host 10.37.99.63 is using the discovered Python interpreter at /usr/bin/python3.11, but future installation of another Python interpreter could change the meaning of that path. See https://docs.ansible.com/ansible-core/2.14/reference_appendices/interpreter_discovery.html for more information. 10.37.99.63 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3.11" }, "changed": false, "ping": "pong" } [WARNING]: Platform linux on host 10.37.120.9 is using the discovered Python interpreter at /usr/bin/python3.11, but future installation of another Python interpreter could change the meaning of that path. See https://docs.ansible.com/ansible-core/2.14/reference_appendices/interpreter_discovery.html for more information. 10.37.120.9 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3.11" }, "changed": false, "ping": "pong" } 测试在db主机执行shell命令 # -m指定ansible的模块,-a指定模块命令 root@master:~# ansible db -m command -a 'hostname -I' [WARNING]: Platform linux on host 10.37.99.63 is using the discovered Python interpreter at /usr/bin/python3.11, but future installation of another Python interpreter could change the meaning of that path. See https://docs.ansible.com/ansible-core/2.14/reference_appendices/interpreter_discovery.html for more information. 10.37.99.63 | CHANGED | rc=0 >> 10.37.99.63 172.17.0.1 100.112.111.195 fdbd:dc01:ff:318:71d3:f428:1bc5:b474 去除ansible返回的warning警告 root@master:~# vim /etc/ansible/ansible.cfg # 找到下面这一行 interpreter_python=auto_silent 测试 root@master:~# ansible db -m command -a 'hostname -I' # 发现warning警告已经没有了 10.37.99.63 | CHANGED | rc=0 >> 10.37.99.63 172.17.0.1 100.112.111.195 fdbd:dc01:ff:318:71d3:f428:1bc5:b474