公司动态
ansible知识点
一、Ansible 基础介绍1.1 核心特点无 Agent 无代理受控节点不需要安装 ansible 客户端仅需要 ssh 服务 python 环境控制节点安装 ansible通过 OpenSSH 通信。基于 Python 开发运行原理控制节点生成临时 python 脚本传输到受控节点执行执行完毕自动删除临时 py 文件。描述式、幂等性大部分模块具备幂等性多次执行结果一致不会重复变更Playbook 使用 YAML 语法可读性高学习门槛低支持批量管理成百上千台服务器实现配置下发、软件安装、滚动更新。1.2 架构角色控制节点Control Node安装 ansible 机器执行 ansible/ansible‑playbook 命令仅支持 Linux。受控节点Managed Node被管理服务器不需要装 ansible要有 ssh 和 python3。1.3 ansible 执行流程读取 ansible 配置文件加载对应模块生成临时 python 脚本传输到受控主机$HOME/.ansible/tmp/赋予脚本可执行权限远程执行脚本回传执行结果删除远端临时脚本文件。ansible‑corerhel9 自带只有核心模块完整 ansible 包需要 epel 源安装。二、Ansible 配置文件2.1 配置文件优先级从高到低ANSIBLE_CONFIG环境变量 当前目录./ansible.cfg 用户家目录~/.ansible.cfg 全局/etc/ansible/ansible.cfg最佳实践每个项目目录下放独立 ansible.cfg隔离项目环境。常用配置项 ansible.cfg[defaults] inventory ./inventory # 指定主机清单 remote_user devops # 默认远程登录用户 ask_pass false # 是否询问ssh密码 forks 5 # 并发主机数量 [privilege_escalation] becomeTrue # 是否开启sudo提权 become_methodsudo become_userroot become_ask_passFalse2.2 Inventory 主机清单inventory 定义所有受控主机与主机分组支持 INI 格式。master node01 node02 [webservers] master [dbservers] node01 [servers:children] # 子组 webservers dbservers常用主机匹配语法ansible all --list-hosts # 全部主机 ansible webservers:dbservers --list-hosts # 并集 ansible webservers:dbservers --list-hosts # 交集 ansible webservers:!dbservers --list-hosts # 差集单引号 ansible ~^node --list-hosts # 正则匹配 ansible‑inventory --graph # 树形查看清单三、Ad‑Hoc 临时命令Ad‑Hoc 适合一次性简单操作不需要写 playbook。 语法格式ansible 主机/主机组 -m 模块名 -a 模块参数-m指定模块默认模块是 command执行颜色绿色成功无变更、黄色成功发生变更 changed、红色执行失败。常用基础模块模块作用注意点ping探测连通性返回 pong 代表正常command执行 shell 命令不支持管道、重定向、通配符无幂等shell执行 shell 命令支持管道、重定向无幂等script执行控制节点本地脚本脚本传到远端执行copy本地文件复制远端remote_srcyes 代表读取远端源文件具备幂等校验 checksumfile创建目录、文件、软链接、删除文件设置权限 statedirectory/touch/link/absent幂等lineinfile修改单行正则匹配增删改行适合单行配置修改replace多行正则替换文件内容适合批量替换多处文本user/group管理用户、用户组statepresent/absentyum/dnf软件包管理statepresent/latest/absentservice管理服务启停开机自启statestarted/stopped/restarted enabledyesget_url网络下载 http/https/ftp 文件到受控节点setup收集主机 facts 系统信息ansible all -m setupdebug输出调试信息 msg打印变量重点区分command 不支持 shell 特性shell 支持完整 shell 语法优先使用专用模块代替 shell减少 shell 风险。四、Playbook 剧本Ad‑Hoc 适合单次操作复杂、重复任务使用playbookyaml可以保存编排流程。4.1 yaml 语法要点文件开头---缩进必须使用空格不能 tab层级对齐列表使用‑字典 key: value|保留换行把换行转为空格#代表注释。playbook 最小组成hosts、tasks。--- ‑ name: 简单测试play hosts: all gather_facts: yes # 收集facts默认yes关闭可以加速gather_facts: no remote_user: devops become: true tasks: ‑ name: ping测试 ping:运行命令ansible‑playbook test.yml ansible‑playbook --syntax‑check test.yml # 语法检查 ansible‑playbook -e var1xxx test.yml # 命令行传变量4.2 Handlers notifyhandlers只有被 notify 触发才执行多个 task 通知同一个 handler全部 tasks 结束后只执行一次task 状态 changed 才会触发 notify前置 task 失败会跳过 handler。force_handlers: yes即使前面任务失败强制执行已经被 notify 的 handler。tasks: ‑ name: 修改httpd配置 copy: src: httpd.conf dest: /etc/httpd/conf.d/ notify: restart httpd handlers: ‑ name: restart httpd service: name: httpd state: restarted4.3 错误处理ignore_errors: yes忽略当前 task 错误继续向下执行可以写在 task 级别或者 play 全局failed_when: 条件自定义什么情况算任务失败changed_when: false将 shell/command 模块执行结果强制设置为 ok不显示 changedblock‑rescue‑always类似 try‑except‑finally。block主任务rescueblock 失败才执行always无论成功失败一定执行。tasks: ‑ block: ‑ debug: msg执行主逻辑 rescue: ‑ debug: msg捕获异常执行修复 always: ‑ debug: msg无论如何都执行4.4 Jinja2 template 模板template 模块使用.j2模板文件变量会渲染替换生成动态配置文件。 支持{% if %}条件{% for %}循环。 示例test.j2主机名{{ ansible_facts.hostname }} {% if ansible_facts.distribution RedHat %} 系统是红帽 {% endif %} {% for host in groups.all %} {{ hostvars[host].ansible_facts.default_ipv4.address }} {% endfor %}playbook 调用‑ name: 渲染模板 template: src: ./test.j2 dest: /tmp/test.txt五、Ansible 变量体系5.1 变量来源优先级从高到低命令行‑e参数最高优先级playbook 中vars_files导入外部变量文件play 内部vars:定义变量host_vars / 主机名文件主机变量inventory 清单主机变量group_vars / 组名文件group_vars/all 全局组变量最低5.2 重要变量类型Facts 变量setup 模块gather_facts 收集受控主机系统信息如ansible_facts.hostname、ansible_facts.default_ipv4.address、ansible_facts.distribution。register 注册变量把 task 输出保存到变量后续取用.stdout、.stderr、.rc。‑ shell: hostname register: host_result ‑ debug: varhost_result.stdout魔法变量hostvars获取其他主机变量hostvars[node01]inventory_hostname当前执行 task 的主机名group_names当前主机所属组列表groups所有清单分组信息。5.3 ansible‑vault 加密用于保护密码等敏感信息ansible‑vault encrypt secret.yml # 加密已有文件 ansible‑vault create secret.yml # 创建加密文件 ansible‑vault view secret.yml # 查看加密文件 ansible‑vault rekey secret.yml # 修改密码 ansible‑playbook --ask‑vault‑pass xxx.yml ansible‑playbook --vault‑password‑filepwd.txt xxx.yml六、流程控制循环、条件判断6.1 loop 循环替代旧版 with_itemstasks: ‑ debug: msg: {{ item }} loop: ‑ tom ‑ jerryuntil循环重复执行 task 直到条件为 trueretries重试次数delay间隔。6.2 when 条件判断条件成立才执行 task支持 facts、变量判断。‑ yum: name: httpd state: present when: ansible_facts.distribution RedHat6.3 include_tasks 和 import_tasksimport_tasks静态导入解析 playbook 阶段就加载文件不支持 loop 循环when 会作用到导入文件内每一个 task。include_tasks动态导入运行到这一步才加载支持 loop 循环when 条件只控制是否导入整个文件。import_playbook导入完整 playbook 文件。6.4 并发控制forksansible.cfg 设置全局并发命令行--forks Nserial: N分批执行 play滚动执行适合滚动更新业务。七、Role 角色项目工程化Role 把 tasks、templates、files、handlers、vars 按照固定目录拆分实现代码复用适合大型项目。roles/httpd/ ├── defaults/main.yml # 默认变量优先级最低 ├── vars/main.yml # 角色内部变量 ├── tasks/main.yml # 核心任务 ├── handlers/main.yml # handlers任务 ├── templates/ # jinja2模板 ├── files/ # 静态文件 ├── meta/main.yml # 角色依赖信息 └── README.md生成角色骨架命令ansible‑galaxy init roles/httpdplaybook 调用 role‑ name: 使用httpd角色 hosts: webservers roles: ‑ httpdansible‑galaxy 工具下载社区角色ansible‑galaxy install xxx.role ansible‑galaxy list ansible‑galaxy remove xxx.rolecollections 集合ansible 新版本模块、插件的分发方式例如ansible.posixcommunity.general。八、补充面试高频问题什么是幂等性多次执行同一个 playbook/ad‑hoc得到系统最终状态一致模块执行前对比目标状态不需要变更就不做操作command/shell 不具备幂等性。handlers 什么时候执行多个 notify 同一个 handler 会执行多次吗所有 tasks 执行完成才执行多个 notify 同一个 handler 只会运行一次。import_tasks 和 include_tasks 区别import 静态解析阶段加载不支持 loopinclude 运行时动态加载支持循环。facts 是什么如何关闭收集 factsfacts 是远程主机硬件、系统信息play 设置gather_facts: no关闭。ansible 为什么不需要 agent基于 ssh 传输 python 临时脚本脚本执行完自动删除不需要常驻客户端。