2026/8/24 14:39:24

ansible playbook剧本和 role编写

ansible playbook剧本和 role编写 摘要本文是一份详细的Ansible Playbook实战指南从基础概念、YAML语法规范讲起逐步演示了如何配置SSH免密登录、设置sudo免密提权并最终编写一个完整的Apache服务部署剧本。内容涵盖Playbook结构解析、语法检查与模拟运行、常用模块yum, service, copy, lineinfile的使用以及变量facts的运用适合初学者系统学习Ansible自动化运维。目录Playbook 组成YAML语法缩进调整(centos7设置rocky9版本不需要)语法检查 模拟运行server1 (devops) → server2 (devops) SSH 免密server2被控端操作创建 devops 用户server1主控端切换到 devops 用户server1 (devops) 生成 SSH 密钥对推送公钥到 server2 的 devops 用户测试 SSH 免密登录步骤 6Ansible ping 连通测试visudo 配置 sudo 免密字段解释验证server2 上用 devops 用户测试apache服务剧本apache.yml添加apache服务yum模块启动apache服务service模块生成首页文件copy模块修改配置文件lineinfile模块定义变量gather_facts 参数作用Playbook使用场景执行一些简单的任务使用ad-hoc命令可以方便的解决问题但对于过于复杂需要大量的操作时候执行ad-hoc命令是不适合的这时最好使用playbook。就像执行shell命令与写shell脚本一样也可以理解为批处理任务不过playbook有自己的语法格式。使用playbook你可以方便的重用这些代码可以移植到不同的机器上面像函数一样最大化的利用代码。Playbook组成Target section定义将要执行playbook的远程主机组- hostsVariable section(可选)定义playbook运行时需要使用的变量- varsTask section定义将要在远程主机上执行的任务列表- tasksHandler section可选定义task执行完成以后需要调用的任务- handlersYAML语法缩进调整(centos7设置rocky9版本不需要)写入 ~/.vimrc专门给 yaml 文件ansible playbook自动设置缩进autocmd FileType yaml setlocal ai ts2 sw2 et参数含义autocmd FileType yaml检测打开 yaml 类型文件时自动执行后面设置setlocal仅对当前缓冲区生效不影响其他普通文件aiautoindent 自动缩进换行继承上一行缩进ts2tabstopTab 键显示宽度为 2 字符sw2shiftwidth自动缩进的步长 2 字符etexpandtab把 Tab 自动转换成空格YAML 强制要求不能出现 tab 制表符否则 ansible 报语法错误⚠YAML 大忌不能有真正 Tab 制表符必须全部空格et就是解决这个坑RHCE 考试写 playbook 必配。验证效果打开任意 yml按 Tab 键实际输入的是 2 个空格不会出现\t制表符。 粘贴代码错乱时先执行:set noai关闭自动缩进粘贴粘贴完再打开。语法检查 模拟运行语法检查--syntax‑checkansible-playbook --syntax-check /path/to/playbook.yaml只检查YAML 语法、playbook 关键字语法不会连接主机不执行任务只能查出缩进、关键字写错这类静态语法错误不能检测主机不可达、变量不存在、模块参数错误测试运行模拟运行干跑‑C--checkansible-playbook -C /path/to/playbook.yaml-C等价完整写法--check会连接目标主机模拟执行任务但不会真正修改目标机器可以检测模块参数、变量、主机连通性部分模块无法完整模拟command/shell[rootserver1 ansible]# ansible-config dump作用输出当前主控节点真正生效的全部 ansible 配置包含默认值 你修改过的配置会合并 ansible.cfg、环境变量的最终生效结果CSDN博...。输出标记说明(default)这个参数没修改使用 ansible 内置默认值(/etc/ansible/ansible.cfg)这个参数来自这个配置文件是你手动修改过的项使用普通用户devopsserver1 (devops) → server2 (devops) SSH 免密server1 (主控)192.168.239.144本地用户devopsserver2 (被控)192.168.239.145远程用户devops目标server1 的 devops 用户可以免密 ssh 登录 server2 的 devops 用户用于 ansible 执行server2被控端操作创建 devops 用户# server2执行 useradd devops # 设置devops密码 passwd devopsserver1主控端切换到 devops 用户# server1执行 su - devops必须是su - devops加载 devops 完整家目录环境不要su devopsserver1 (devops) 生成 SSH 密钥对# server1 devops 用户执行 ssh-keygen全部回车不要输入密钥密码 (passphrase)私钥/home/devops/.ssh/id_rsa公钥/home/devops/.ssh/id_rsa.pub推送公钥到 server2 的 devops 用户# server1 devops 用户执行 ssh-copy-id devops192.168.239.145输入server2 机器 devops 用户的密码完成公钥推送。公钥会写入 server2/home/devops/.ssh/authorized_keys测试 SSH 免密登录# server1 devops 用户执行 ssh devops192.168.239.145不需要输入密码直接登录代表 ssh 免密成功输入exit退回 server1。步骤 6Ansible ping 连通测试[web] 192.168.239.145执行 ping 测试不加‑u默认使用当前 devops 连接远程 devopsansible web -m ping输出SUCCESS {ping:pong}完成。visudo 配置 sudo 免密在 server2 的/etc/sudoers已经写入devops ALL(ALL) NOPASSWD: ALL字段解释devops ALL(ALL) NOPASSWD: ALLdevops哪个用户第一个ALL在哪台主机生效(ALL)可以切换成什么用户可以切所有用户主要是 rootNOPASSWD: ALL执行所有 sudo 命令不需要输入密码❗注意NOPASSWD:后面必须有空格不能写成NOPASSWD:ALL。验证server2 上用 devops 用户测试su - devops sudo whoami预期输出root不提示输入密码代表 sudo 免密提权配置完成。[devopsserver1 ~]$ ansible web -m yum -a namehttpd statepresent -b在 server1 用普通用户devops连接 server2 的devops安装软件、改系统服务需要root 权限普通 devops 没有权限-b就是告诉 ansible连接到远程主机后sudo 提升为 root 用户执行任务对应之前在 server2/etc/sudoers配置devops ALL(ALL) NOPASSWD: ALL允许 devops 无密码 sudo 到 root所以-b不需要额外输入密码。apache服务剧本apache.ymlansible-doc yum跳转后查看模板标准ansible‑doc yum 看不全文档原因ansible‑doc yum默认调用less 分页器内容太长屏幕只显示一部分。操作快捷空格向下翻一整页b向上翻一整页回车向下滚动一行/关键词搜索例如/state直接定位 state 参数q退出文档回到命令行看完必须 q 退出不然你输不了命令vim apache.yml添加apache服务yum模块粘贴 yml 代码前执行:set paste防止 vim 自动乱加缩进粘贴完:set nopaste恢复。语法检查通过但是执行失败因为普通用户缺少root权限在剧本中加入 become yes启动apache服务service模块ansible-doc service查看模板生成首页文件copy模块修改配置文件lineinfile模块ansible-doc lineinfilevim apache.yml修改完端口配置后需要让httpd服务重启才会监听新端口8080可以在剧本重启也可以在server2手动重启handlers:和tasks:同一级缩进nopify触发器和name同一级缩进notify: 触发器名字名字必须和 handler 的name:完全一模一样大小写、空格不能错handler只有当 task 发生changed状态的时候才会触发执行task ok 无改动handler 不会跑handler 在整个 play 所有 task 全部跑完之后才统一执行不是立刻执行定义变量gather_facts 参数gather_facts是 playbook 顶层参数控制是否自动运行 setup 模块收集被控主机 facts 事实变量ansible_hostname、ansible_ip、ansible_os_family 这类变量。gather_facts: yes默认执行 playbook 开头自动执行 setup收集系统信息可以使用{{ ansible_hostname }}这类 facts 变量gather_facts: no关闭收集事实不跑 setup 模块执行速度变快但是不能使用系统 facts 变量- name: creat index.html ansible.builtin.copy: content: {{ ansible_hostname }}\n dest: /var/www/html/index.html作用copy模块使用content参数直接生成文件内容{{ ansible_hostname }}是 jinja2 模板语法执行 playbook 的时候会自动替换成真实主机名server2\n代表换行。 最终被控主机生成的/var/www/html/index.html文件内容ansible web -m setup -a filteransible_hostname-m setupAnsible 内置收集被控主机系统信息facts 事实变量的模块filteransible_hostname只过滤输出主机名变量不输出全部大量 facts 信息返回结果ansible_hostname: server2说明web 组的被控主机192.168.239.145主机名就是server2ansible_hostname这个变量可用。