Ansible:从0到1自动化运维部署

发布时间:2026/6/29 18:23:56
Ansible:从0到1自动化运维部署 主机条件:192.168.88.139 安装ansible192.168.88.140 node1192.168.88.141 node2 第一阶段环境搭建与初始配置建议1天这是所有实践的基础我们需要配置好Ansible的控制节点和被管理节点。配置主机名与Hosts解析为了方便管理建议为三台机器设置清晰的主机名。控制节点 (Control Node)建议命名为ansibleIP为192.168.88.139。受管节点 (Managed Nodes)可以命名为node1(140) 和node2(141)。在所有节点的/etc/hosts文件中添加三台机器的IP和主机名映射。安装AnsibleAnsible采用无代理架构只需在控制节点上安装即可。在CentOS 9上官方推荐使用dnf包管理器。配置SSH免密登录Ansible通过SSH协议与受管节点通信。需要在控制节点生成SSH密钥对并将公钥复制到两台受管节点上。ssh-keygen -t rsa # 在控制节点生成RSA密钥对公钥私钥 ssh-copy-id rootnode1 # 将公钥复制到 node1并设置免密登录 ssh-copy-id rootnode2 # 将公钥复制到 node2结果:创建一个项目目录projectmkdir project cd project创建主机清单InventoryInventory文件定义了Ansible要管理的主机。创建一个项目目录并在其中创建inventory.ini文件进入到项目文件夹下:执行:vi inventory.ini[webservers] node1 ansible_host192.168.88.140 ansible_userroot node2 ansible_host192.168.88.141 ansible_userroot # 如果需要使用非root用户请修改 ansible_user 和 become 相关设置运行测试命令​​​​​​​ansible -i inventory.ini all -m ping如果返回pong说明一切就绪可以开始愉快的自动化之旅了 第二阶段Ansible核心概念与实战建议1-2周这个阶段是学习的核心需要掌握Ansible的常用模块和Playbook的编写。Ad-Hoc命令快速上手先用简单的命令测试连通性和模块用法。ansible -i inventory.ini all -m ping ansible -i inventory.ini webservers -m command -a df -h结果:常用模块学习Ansible拥有丰富的模块库建议优先掌握以下几个command/shell在远程主机执行命令。copy从控制节点拷贝文件到受管节点。file管理文件和目录的属性。yum/dnf管理软件包。service管理服务状态。user管理用户账号。debug输出变量或信息用于调试。Playbook编写核心技能Playbook是Ansible的配置、部署、编排语言使用YAML格式编写。基础语法理解Playbook的结构---、- hosts、tasks、name。第一个Playbook创建一个first_playbook.yml包含安装nginx、启动服务、拷贝一个自定义主页的任务。创建first_playbook.yml文件vi first_playbook.yml粘贴内容:包含安装nginx、启动服务、拷贝一个自定义主页的任务。--- - name: My first playbook hosts: webservers become: yes # 使用sudo权限 tasks: - name: Install nginx dnf: name: nginx state: present - name: Start nginx service: name: nginx state: started enabled: yes - name: Copy index.html copy: src: ./index.html dest: /usr/share/nginx/html/index.html在/root/poject/目录下创建一个files子目录并在其中放入index.htmlmkdir -p /root/poject/files echo Hello from GitOps! /root/poject/files/index.html运行Playbookansible-playbook -i inventory.ini first_playbook.yml结果:[root139 poject]# echo Hello from GitOps! /root/poject/files/index.html [root139 poject]# ansible-playbook -i inventory.ini first_playbook.yml PLAY [My first playbook] **************************************************************************************************************************************************************************************** TASK [Gathering Facts] ****************************************************************************************************************************************************************************************** ok: [node1] ok: [node2] TASK [Install nginx] ******************************************************************************************************************************************************************************************** ok: [node1] ok: [node2] TASK [Start nginx] ********************************************************************************************************************************************************************************************** ok: [node1] ok: [node2] TASK [Copy index.html] ****************************************************************************************************************************************************************************************** changed: [node1] changed: [node2] PLAY RECAP ****************************************************************************************************************************************************************************************************** node1 : ok4 changed1 unreachable0 failed0 skipped0 rescued0 ignored0 node2 : ok4 changed1 unreachable0 failed0 skipped0 rescued0 ignored0 [root139 poject]#变量与事实Facts变量Variables学习如何在Playbook、Inventory文件或独立的变量文件中定义和使用变量。FactsAnsible会自动收集受管节点的系统信息如IP地址、操作系统版本等这些信息可以作为变量使用。- name: Show OS family debug: msg: The OS is {{ ansible_facts[os_family] }}任务控制条件判断when只在特定条件下执行任务例如只在Debian系系统上使用apt模块。循环loop使用loop关键字重复执行任务例如创建多个用户。️ 第三阶段Playbook进阶与最佳实践建议1周当基础Playbook熟练后可以开始学习如何让代码更规范、更可复用。Jinja2模板使用template模块和Jinja2模板语言动态生成配置文件。例如根据不同的主机名或IP生成不同的nginx配置。yaml- name: Deploy nginx config from template template: src: ./nginx.conf.j2 dest: /etc/nginx/nginx.confRoles角色Roles是Ansible中用于组织Playbook的最佳实践它将变量、任务、文件、模板、处理器等按规范的结构组织起来。可以使用ansible-galaxy init role_name命令创建一个角色骨架。HandlersHandlers是特殊的tasks只在被notify时触发通常用于在配置文件变更后重启服务。接下来我们来做一个小项目: 第四阶段实践项目使用角色部署带动态配置的 Nginx 网站项目目标在node1和node2上安装 Nginx。利用Jinja2模板生成一个自定义的index.html页面内容显示该主机的IP地址和主机名。利用Handler在Nginx配置文件发生变更时自动重启服务。将所有任务、变量、模板、handler封装到一个角色Role中以便将来复用。目录结构:~/ansible-role-nginx/├── ansible.cfg # 可选用于指定配置文件├── inventory.ini # 你的主机清单├── site.yml # 入口Playbook└── roles/└── nginx_role/ # 角色名├── tasks/│ └── main.yml├── handlers/│ └── main.yml├── templates/│ ├── nginx.conf.j2 # Nginx主配置模板│ └── index.html.j2 # 网站首页模板├── vars/│ └── main.yml└── meta/└── main.yml # 依赖关系可选 第一步创建目录和角色骨架使用ansible-galaxy自动生成角色骨架省去手动建目录的麻烦cd ~ mkdir ansible-role-nginx cd ansible-role-nginx ansible-galaxy init roles/nginx_role这会生成完整的目录结构你只需保留需要的目录删除示例文件或覆盖内容。结果:[root139 ~]# cd ~ mkdir ansible-role-nginx cd ansible-role-nginx ansible-galaxy init roles/nginx_role - Role roles/nginx_role was created successfully [root139 ansible-role-nginx]#在项目文件夹下创建:检查并编辑inventory.inivi inventory.ini[webservers] node1 ansible_host192.168.88.140 ansible_userroot node2 ansible_host192.168.88.141 ansible_userroot # 可选全局变量 [all:vars] ansible_userroot 第二步编写模板文件2.1 编写index.html.j2位于roles/nginx_role/templates/这是一个Jinja2模板它会使用Ansible的 facts 变量动态生成内容1. 进入项目根目录cd ~/ansible-role-nginx2. 确认templates目录存在如果不存在则创建mkdir -p roles/nginx_role/templates3. 创建并编辑index.html.j2文件你可以使用任何文本编辑器如vi、nano或vimvi roles/nginx_role/templates/index.html.j2将模板内容粘贴进去!DOCTYPE html html head titleWelcome to {{ ansible_facts[hostname] }}/title /head body h1Server: {{ ansible_facts[hostname] }}/h1 pIP Address: {{ ansible_facts[default_ipv4][address] }}/p pOS: {{ ansible_facts[distribution] }} {{ ansible_facts[distribution_version] }}/p /body /html 第三步编写任务tasks/main.yml打开roles/nginx_role/tasks/main.yml填入以下内容--- - name: Install Nginx dnf: name: nginx state: present notify: restart nginx # 通知handler在任务变化时重启 - name: Ensure nginx is enabled and started systemd: name: nginx state: started enabled: yes - name: Deploy custom index.html from template template: src: index.html.j2 dest: /usr/share/nginx/html/index.html owner: root group: root mode: 0644 notify: restart nginx # 内容变化时重启 - name: Deploy nginx.conf from template (optional) template: src: nginx.conf.j2 dest: /etc/nginx/nginx.conf owner: root group: root mode: 0644 notify: restart nginx when: use_custom_config | default(false) | bool # 通过变量控制是否部署自定义配置 第四步编写 Handlerhandlers/main.ymlHandlers 只有在被notify触发时才会执行这里我们定义重启Nginxcd ~/ansible-role-nginxpwd # 应该显示 /root/ansible-role-nginx 或类似路径mkdir -p roles/nginx_role/handlersvi roles/nginx_role/handlers/main.yml粘贴 Handler 内容进入编辑模式按i键粘贴以下内容--- - name: restart nginx systemd: name: nginx state: restarted 第五步定义变量vars/main.yml这里可以定义角色内部的默认变量比如控制是否使用自定义配置--- # 是否部署自定义 nginx.conf默认不部署false use_custom_config: false 第六步编写入口Playbooksite.yml在项目根目录创建site.yml它引用我们刚写的角色--- - name: Apply Nginx configuration to web servers hosts: webservers become: yes roles: - nginx_role 第七步运行Playbook确保你的inventory.ini正确注意不要有行尾注释然后执行ansible-playbook -i inventory.ini site.yml执行后观察输出每个任务的状态ok或changed。如果模板内容变化会触发restart nginxhandler。 第八步验证结果在浏览器中访问http://192.168.88.140和http://192.168.88.141你应该看到显示各自主机名和IP的页面。查看响应头用curl -I或浏览器开发者工具

相关新闻

第七周学习笔记

第七周学习笔记

2026/6/29 18:23:56
图片太大怎么缩小

图片太大怎么缩小

2026/6/29 18:23:56

月新闻