精读笔记 · 第31章 Ansible 自动化运维实战
精读笔记 · 第31章 Ansible 自动化运维实战
精读整理自 RHCE9 随堂讲义(原文字版 22 页)|同名视频(第02套,第31章约 20+ 节) 关联知识文件:
分章笔记/01-Linux/02-08-自动化运维(Ansible);RHCA DO447 精读可衔接深化
一、Ansible 简介与执行过程
- Python 开发,集合 puppet/cfengine/chef/func/fabric 等工具优点:批量系统配置、批量程序部署、批量运行命令;无客户端(基于 SSH)。
- 命令执行过程(记忆顺序):
- 加载自身配置
/etc/ansible/ansible.cfg; - 读取主机配置文件(默认
/etc/ansible/hosts)确定目标主机/组; - 加载对应模块(如 command/shell);
- 把模块/命令生成临时 py 文件并传输到远程;
- 落到远程用户家目录
.ansible/tmp/xxx/xxx.py; - 加执行权限(+x);
- 执行并把结果返回控制端;
- 删除临时 py 文件,sleep 0 退出。
- 加载自身配置
- ansible 的 ping 模块探测的是 SSH 连通,不是 ICMP:关闭 sshd 后 ping 模块照样失败,与
ping命令(ICMP)不同。
二、部署环境与安装
- 拓扑:1 台 ansible-server + 多台客户机(host1~4);域名解析写
/etc/hosts(服务器端即可,客户端无需配置)。 - 安装(CentOS7 类):
yum install -y epel-release;非学校环境换阿里源:删/etc/yum.repos.d/*后wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo、同理拉 CentOS-Base.repo;再yum install -y ansible。 - 验证安装:
rpm -ql ansible(文件清单)、rpm -qc ansible(配置文件)、ansible --help、ansible-doc -l(模块总表)、ansible-doc -s yum(看某个模块用法)。 - 免密可选:
ssh-keygen+ssh-copy-id IP;免 yes/no 询问:/etc/ssh/ssh_config里StrictHostKeyChecking no后重启 sshd。
三、主机清单 Inventory
- 默认文件
/etc/ansible/hosts;自定义清单用-i 文件。 | 写法 | 作用 | | --- | --- | |host1单行一个主机 | 无组主机列表 | |host[1:4]| 连续主机名范围(host1~host4) | |[webserver]| 定义主机组,ansible webserver -m ping| |ansible_ssh_user=ansible_ssh_pass=| 主机/组内指定 SSH 账号密码 | |ansible_ssh_port=2222| sshd 改端口后指定连接端口 | |[webserver:vars]| 组级变量(整组统一账号密码) | |[webserver:children]| 子分组:apache+nginx 两小组合成 webserver | |-i hostlist| 使用自定义清单文件 | - 逐主机不同凭据:
host1 ansible_ssh_user='root' ansible_ssh_pass='777777' ansible_ssh_port='2222',host2~4 各自单写。 - 连通测试:
ansible webserver -m ping -o(-o 单行简洁输出);首次需-u root -k交互输密码。
四、Ad-Hoc 常用模块速查
格式:
ansible 主机组 -m 模块 -a '参数' [-o] [-f 2];-f/--forks并发线程数,默认 5。 | 模块 | 用途 | 示例 | | --- | --- | --- | |ping| SSH 连通测试 |ansible host1 -m ping -o| |shell| 执行命令(支持管道等) |-a 'hostname'、-a 'uptime'、-a 'yum -y install httpd'| |copy| 拷贝文件并设属性 |src=/etc/hosts dest=/tmp/2.txt owner=root group=bin mode=777 backup=yes| |user| 用户管理 |name=qianfeng state=present/absent、password="$1$..."(openssl passwd -1 加密)、shell=/sbin/nologin append=yes| |yum| 软件包 |name="*" state=latest(全量升级)、name=httpd state=latest| |service| 服务启停 |name=httpd state=started/stopped/restarted enabled=yes/no| |file| 文件/目录 |path=/tmp/88.txt mode=777 state=touch;path=/tmp/99 mode=777 state=directory| |setup| 收集主机 facts |-a 'filter=ansible_all_ipv4_addresses'| |fetch| 远程文件拉回本地 |-a "src=/app/fstab dest=/app"(自动按 IP 建子目录) | |cron| 管理计划任务 |name=... minute="*/10" job="/usr/sbin/ntpdate ...";special_time=daily/hourly/reboot 等 | |group| 用户组 |name=hhh state=present、gid=/system=yes | |script| 在节点上运行服务端脚本 |-a "./wan.sh"(无需先拷过去) | |unarchive| 解压 |src=/root/1.tar dest=/tmp/;remote_src=yes解远程主机上的包,no(默认)把本地包传过去解 |
- cron 模块常用参数:name 描述、minute/hour/day/month/weekday、job 命令、state=present/absent、user、special_time、reboot、backup、cron_file。
五、YAML 与 Playbook
- YAML 基础:列表
fruits: - Apple - Orange;字典martin: name: xxx job: Developer;缩进表达层级。 - 第一个剧本 apache.yaml(部署→配置→启动):
- hosts: host2
tasks:
- name: install apache packages
yum: name=httpd state=present
- name: copy apache conf
copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
- name: ensure apache is running
service: name=httpd state=started enabled=yes- 四步测试/执行:
ansible-playbook apache.yaml --syntax-check(语法)→--list-tasks(任务清单)→--list-hosts(主机清单)→ansible-playbook apache.yaml(执行)。 - 幂等与 handlers:改了 Listen 端口后重跑剧本“命令成功但配置不生效”——需在 copy 任务加
notify: 处理器名,文件真正变化时才触发 handlers 里的 restart,配置才生效。
六、Role 角色
- roles=playbook 的目录组织结构:把代码/文件模块化,易读、可重用、层次清晰。
- 目录约定(以 nginx 角色为例):
files普通文件、handlers触发器、tasks主任务、templatesJinja2 模板(含变量的文件)、vars自定义变量;准备:mkdir roles/nginx/{files,handlers,tasks,templates,vars} -p,各模块下建main.yaml。 - tasks/main.yaml 主流程:yum 装 epel-release、nginx → copy index.html → template 渲染配置并
notify: restart nginx→ service 启动并 enabled。 - templates/nginx.conf.j2:
worker_processes {{ ansible_processor_cores }};(调用 setup 收集的 fact)、worker_connections {{ worker_connections }};(自定义变量);vars/main.yaml 里worker_connections: 10240。 - handlers/main.yaml:
- name: restart nginx+service: name=nginx state=restarted(与 notify 名字对应)。 - 顶层 site.yaml:
- hosts: host4 roles: - nginx;cd roles && ansible-playbook site.yaml --syntax-check后正式执行。
七、条件与循环
- 条件 when:关闭指定 IP 主机
command: /usr/sbin/init 0+when: ansible_all_ipv4_addresses == "10.18.46.37";两台机器条件用or连接。 - 循环 with_items:批量建用户
user: name={{ item }} state=present groups=wheel+with_items: [testuser1, testuser2](迭代变量固定名 item)。
八、安全与多主机凭据
- 加密清单:
ansible-vault encrypt db_hosts→ 文件头变$ANSIBLE_VAULT;1.1;AES256;运行时须ansible -i db_hosts --ask-vault-pass localhost -m ping;解密用ansible-vault decrypt。 - 不同主机不同用户:清单逐主机写
ansible_port=5000 ansible_user=alice ansible_pass=123456。 - 本地连接:清单行
localhost ansible_connection=local。
九、Homework 行业调研(了解即可)
- 服务器采购:DELL/HP 常见型号(如 R730/R740/R940)的价格、CPU/内存/硬盘/RAID 规格——教材里为 2019 年参考价,仅作行业认知。
- 托管与云:北京托管商(光环新网/世纪互联)、云厂商(青云/阿里云/亚马逊/腾讯云)价格与部署。
- DNS 与 CDN:万网/新网/DNSPod/阿里 DNS;百度云 CDN 两种计费(按流量阶梯、按日峰值带宽),理解阶梯计价逻辑即可。
十、命令速查表(一句话)
| 场景 | 写法 |
|---|---|
| 连通测试 | ansible 组 -m ping -o |
| 看模块用法 | ansible-doc -s 模块名 |
| 跑命令 | ansible web -m shell -a 'uptime' |
| 拷贝+备份 | ansible web -m copy -a 'src=x dest=y backup=yes' |
| 批量装包/启服务 | -m yum -a 'name=httpd state=latest'、-m service -a 'name=httpd state=started enabled=yes' |
| 语法/任务/执行 | ansible-playbook a.yaml --syntax-check / --list-tasks / |
| 配置变化再触发 | copy/template + notify: 名 → handlers |
| 用角色 | site.yaml 中 roles: - nginx |
| 条件/循环 | when: 条件、with_items + {{ item }} |
| 加密清单 | ansible-vault encrypt hosts、--ask-vault-pass |
十一、易错点
- ansible 的 ping ≠ ICMP ping,测的是 SSH 是否可用。
- 主机清单里的组名(
[webserver])与命令中组名必须一致,没在清单里的主机直接失败。 - 改 sshd 端口后 hosts 里必须补
ansible_ssh_port,否则连不上。 - 密码用
openssl passwd -1生成密文再写进 user 模块,别明文写。 - playbook 改配置不触发 handlers 时配置不生效——先确认 copy/template 是否变化 + notify 与 handlers 名称一致。
- 模板变量分两类:
{{ ansible_xxx }}是 setup fact,{{ 自定义名 }}要在 vars/main.yaml 定义。 - 加密清单必须
--ask-vault-pass,普通 ansible 命令会 Decryption failed。 - YAML 对缩进敏感:同一 task 的属性对齐、列表用
-开头,写错会直接语法报错。
十二、实操清单
装 ansible + 配 /etc/hosts → hosts 清单练连续范围/组变量/子分组/自定义 -i → ad-hoc 过一遍 shell/copy/user/yum/service/file/setup/fetch/cron/group/script/unarchive → 写 apache.yaml 四步验证 → 加 handlers 观察触发时机 → 搭 roles/nginx 五目录 → site.yaml 部署并 curl 验证 → when 关指定 IP、with_items 批量建用户 → ansible-vault 加密解密演练。
十三、本章自测
- ansible 为什么“无客户端”?一次命令的执行过程分几步?
- ping 模块与 ping 命令的区别?
- hosts 清单里
[组:vars]、[组:children]、host[1:4]分别怎么用? - copy/user/yum/service/file/setup/cron 模块各管什么?举例。
- playbook 四步检查命令是什么?handlers 解决什么问题?
- role 目录结构(files/handlers/tasks/templates/vars)各放什么?模板变量两种来源?
- when 与 with_items 如何实现“条件执行/批量创建用户”?
- ansible-vault 如何加密、解密、运行加密清单?
