第十九天笔记(01-Ansible 自动化介绍、02-Ansible 基本使用、03-编写和运行 Playbook)2026.1.12
第十九天笔记(01-Ansible 自动化介绍、02-Ansible 基本使用、03-编写和运行 Playbook)2026.1.12
01-Ansible 自动化介绍
Ansible 自动化介绍
手动执行任务和自动化执行任务
手动执行任务缺点:
- 很容易遗漏某个步骤或错误地执行某个步骤。步骤是否正确执行或产生预期的结果的验证通常有限。
- 管理大量服务器很容易会出现差异,加大维护的难度,并给IT环境带来错误或不稳定性。
自动化执行任务优点:
- 通过标准化,确保快速、正确地部署和配置所有系统。
- 自动执行日常计划重复性任务,从而空出时间并专注于更重要的事情。
- 更快速的交付应用。
基础架构即代码
- 良好的自动化系统允许实施基础架构即代码方法。基础架构即代码意味着可以使用机器可读的自动化语言来定义和描述IT基础架构所处的状态。理想情况下,这种自动化语言也应该非常便于人类阅读,因为这样就可以轻松了解所处的状态并对其进行更改。
- 如果自动化语言使用简单文本文件表示,还可以使用版本控制系统管理。这样做的好处是每个更改都可以嵌入到版本控制系统中,可以获得随时间所做更改的历史记录,可以将系统恢复到更早的配置。这样就奠定了一个遵循DevOps的基础。开发人员可以在自动化语言中定义所需的配置。操作员可以更轻松地查看这些更改以提供反馈,并使用该自动化可重复地确保系统处于开发人员期望的状态。
Ansible 与 DevOps

百度百科:DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来 使得构建、测试、发布软件能够更加地快捷、频繁和可靠。
DevOps的关键在于 communication(沟通和交流)。
Ansible是第一款可以在整个IT范围读取和编写的自动化语言,也是唯一能够从头至尾自动化应用生命周期和持续交付管道的自动化引擎。
什么是 ANSIBLE?
Ansible is a simple automation language,通过Playbooks描述和配置IT基础架构。
Ansible可以管理强大的自动化任务,适用于不同的生产环境。同时,Ansible对于新用户来说,也可以很快的上手运用到生产环境。
使用案例:
- OpenStack 搭建和维护
- OpenShift 搭建和维护
- ceph 搭建和维护
Ansible 特点
**简单:**Ansible Playbooks 是一个人们非常容易查阅,理解和更改的文本文件,用户不需要具备特定的代码编写技能。
**功能强大:**可以使用Ansible部署应用,例如配置管理,工作流自动化,网络自动化。还可用于编排整个应用生命周期。
无代理:Ansible 是一个无代理的架构,通过OpenSSH或者WinRM连接到hosts,并执行任务,推送小的程序(Ansible modules)到这些主机上。这些程序用于设置系统到预期状态。在Ansible执行完成后,任何之前推送的模块,都会被删除。Ansible可以随时使用,因为被管理主机上不需要配置特定代理。正是因为这点,Ansible 才更加高效和安全。
跨平台支持:可以管理Linux、UNIX、windows 和网络设备。
**非常准确地描述应用:**Ansible Playbook使用YAML格式描述生产环境。
**可以通过版本控制管理:**Ansible Playbooks和projects是纯文本格式,可以当作源码存放在版本控制系统中。
非常容易与其他系统集成: HP SA,Puppet,Jenkins,红帽卫星服务器等。
Ansible 概念和架构

-
NODES:Ansible架构中有两种计算机类型:
- 控制节点,安装有ansible软件的节点。
- 受管节点,被ansible管理的Linux系统、Windows系统、网络设备等。
-
INVENTORY:受管主机清单。
-
PLAYBOOK:Ansible用户只需要编写playbook,确保主机是预期状态。
- 每个playbook可以包含多个play。
- 每个play会在一组hosts上按顺序执行一系列tasks。
- 每个task都执行一个模块,模块是一个小的代码段(Python,PowerShell,或者其他语言)。Ansible自带几百个模块,执行不同类型自动化任务,例如操作系统文件,安装软件,API调用。Tasks,plays和Playbooks是 idempotent(幂等的),在相同的主机上多次安全地执行Playbooks,让主机是正确的状态。如果主机已经是预期状态,则Playbook不会做任何改变。
-
PLUGINS,添加到Ansible中的代码段,用于扩展Ansible平台。
Ansible Way
- Complexity Kills Productivity(复杂性会破坏效率),越简单越好。Ansible的设计宗旨是工具易用,自动化易写易读,所以在创建自动化时尽可能地追求简单化。
- Optimize For Readability(专为易读性优化),Ansible自动化语言围绕简单易读的声明性文本文件来构建。正确编写的Ansible Playbook可以清楚地记录您的工作流自动化。
- Think Declaratively(声明式思维),Ansible是一种要求状态引擎。它通过表达您希望系统处于何种状态来解决如何自动化IT部署的问题。Ansible的目标是通过仅执行必要的更改,使您的系统处于所需的状态。
Ansible 用例
- **配置管理:**集中化配置文件管理和部署是Ansible的常见用例,很多高级用户也是通过这种方式了解Ansible自动化平台。
- **应用部署:**通过Ansible定义应用,以及使用红帽Ansible Tower管理部署时,各团队可以更加有效地管理从开发到生产的整个应用生命周期。
- **工作流管理:**Ansible 和红帽Ansible Tower有助于简化调配系统的流程,不论您是要PXE引导和kickstart安装裸机恢复服务器或虚拟机,还是从模板创建虚拟机或云实例。
- **持续交付:**创建CI/CD管道需要多个团队的协调和参与。如果没有组织内人人可用的简单自动化平台,就无法实现这个目标。Ansible Playbook让您的应用可以在整个生命周期内得到正确部署(和管理)
- **安全性和合规性:**当您在Ansible Playbook中定义安全策略时,也可以将扫描和修复整站安全策略集成到其他自动化流程中。确保安全应该是您所有部署中不可或缺的组成部分,而不是事后才去考虑的部分。
- **编排:**仅配置本身不足以定义您的环境,您还需定义多个配置间就应如何交互,并确保以整体的方式管理各类分散资源。
Ansible 部署
准备实验环境
实验环境 /etc/hosts
10.1.8.10 controller.zj.cloud controller
10.1.8.11 node1.zj.cloud node1
10.1.8.12 node2.zj.cloud node2
10.1.8.13 node3.zj.cloud node3
10.1.8.14 node4.zj.cloud node4
配置控制节点 zj 用户使用zj用户免密登录所有节点,并免提sudo提权执行任何命令。
# 所有节点配置/etc/hosts
[root@all-node ~]# cat >> /etc/hosts <<EOF
################ ansible #################
10.1.8.10 controller.laoma.cloud controller
10.1.8.11 node1.laoma.cloud node1
10.1.8.12 node2.laoma.cloud node2
10.1.8.13 node3.laoma.cloud node3
10.1.8.14 node4.laoma.cloud node4
EOF
# 配置普通用户,免密提权为root
[root@all-node ~]#
echo 'zj ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/zj
# Xshell左下角命令行输入即可
# ssh首次连接不提示
[root@controller ~ 17:38:01]# echo 'StrictHostKeyChecking no' >> /etc/ssh/ssh_config
# 控制节点 普通用户,秘钥登录其他节点(包括控制节点自己)
[zj@controller ~ 19:31:04]$ ssh-keygen -N '' -t rsa -f ~/.ssh/id_rsa
[zj@controller ~ 19:32:24]$ sshpass -p 123 ssh-copy-id zj@node1
[zj@controller ~ 19:31:38]$ sshpass -p 123 ssh-copy-id zj@node2
[zj@controller ~ 19:34:00]$ sshpass -p 123 ssh-copy-id zj@node3
[zj@controller ~ 19:34:58]$ sshpass -p 123 ssh-copy-id zj@node4
# 进行秘钥推送
for host in controller node{1..4}
do
sshpass -p 123 ssh-copy-id zj@$host
done
# 验证
for host in controller node{1..4}
do
ssh zj@$host sudo id
done
控制节点
控制节点用来安装 Ansible 软件的主机节点。控制节点可以是一个或多个,由 ansible 管理的主机不用安装 Ansible。
提示:控制节点是Linux或UNIX系统,不支持 Windows 作为控制节点。
安装 ansible并验证
[zj@controller ~ 19:36:56]$ sudo yum install -y ansible
[zj@controller ~ 19:40:52]$ ansible --version
02-Ansible 基本使用
Ansible 清单
Ansible 软件包中文件
[zj@controller ~ 19:59:02]$ rpm -ql ansible
- 配置文件目录 /etc/ansible
- 执行文件目录/usr/bin
- lib依赖库目录/usr/lib/python2.7/site-packages/ansible
- 插件/usr/share/ansible/plugins
- Help文档目录/usr/share/doc/ansible
- Man文档目录/usr/share/man/
管理 ANSIBLE 配置文件
配置文件位置和优先级
- 环境变量 ANSIBLE_CONFIG
- ./ansible.cfg,当前位置中的 ansible.cfg,当前位置一般是项目目录。
- ~/.ansible.cfg
- /etc/ansible/ansible.cfg
从上到下,优先级越来越低。
建议:在当前目录下定义ansible.cfg文件。
03-编写和运行 Playbook
Playbook 介绍
playbook是由多个play组成,每个play定义了多个主机执行多个任务,包含多个任务。
每个任务执行具体的任务(模块)



实验环境
# 环境准备
[zj@controller ~ 19:59:22]$ touch ~/.ansible.cfg
[zj@controller ~ 20:07:12]$ mkdir webapp
[zj@controller ~ 20:08:16]$ cd webapp
[zj@controller webapp 20:08:43]$ touch ansible.cfg
# 编辑 Ansible 的主机清单(inventory)文件
[zj@controller webapp 20:36:17]$ vim inventory
[controllers]
controller
[webs]
node1
node2
[dbs]
node3
node4
[nodes]
node[1:4]
# 自定义 Ansible 的配置文件参数
[zj@controller webapp 20:09:22]$ vim ansible.cfg
[defaults]
inventory = ./inventory
remote_user = zj
[privilege_escalation]
become = True
become_user = root
become_method = sudo
become_ask_pass = False
[zj@controller webapp 11:51:41]$ ansible node1 -i inventory -m command -a id -b
node1 | CHANGED | rc=0 >>
uid=0(root) gid=0(root) groups=0(root)
-i inventory: 从哪里读取主机名
-m user:使用user模块,管理用户
-a 'name=zhangsan uid=1008 state=present': zhangsan用户,uid是1008,状态是present(存在)
-b: 提权为root
vim 编辑器缩进
set ai ts=2 number
- ‘ai’:即 autoindex,表示自动缩进
- ‘ts’:即 tabstop,表示 tab 使用 2 个空格代替
- ‘number’:显示行号
需求:部署 webs 主机组上部署 nginx 服务器,并且测试可用性
-
play1:部署 nginx 服务
- 安装软件包
- 启动服务
- 防火墙放行
- 测试页面
-
play2:测试
在 controller 上进行访问测试
[zj@controller webapp 16:51:06]$ vim deploy_nginx.yaml
[zj@controller webapp 16:52:03]$ cat deploy_nginx.yaml
---
- name: deploy nginx
hosts: webs
tasks:
# ansible-doc yum,搜多EXAMPLE
- name: install packages
yum:
name: nginx,firewalld
state: latest
- name: enable and start service nginx
service:
name: nginx
state: started
enabled: yes
- name: enable and start service firewalld
service:
name: firewalld
state: started
enabled: yes
- name: set firewall to allow web
firewalld:
service: http
permanent: yes
state: enabled
immediate: yes
- name: prepare website test page
copy:
content: "Welcome to {{ ansible_fqdn }}\n"
dest: /usr/share/nginx/html/index.html
- name: check nginx server
hosts: controller
tasks:
- name: check web site
uri:
url: http://{{item}}/
loop:
- node1
- node2
...
[zj@controller webapp 16:51:52]$ ansible-playbook deploy_nginx.yaml
[zj@controller webapp 16:51:52]$ ansible-playbook deploy_nginx.yaml
PLAY [deploy nginx] ************************************************************
TASK [Gathering Facts] *********************************************************
ok: [node1]
ok: [node2]
TASK [install packages] ********************************************************
ok: [node2]
ok: [node1]
TASK [enable and start service nginx] ******************************************
ok: [node1]
ok: [node2]
TASK [enable and start service firewalld] **************************************
ok: [node1]
ok: [node2]
TASK [set firewall to allow web] ***********************************************
changed: [node1]
changed: [node2]
TASK [prepare website test page] ***********************************************
changed: [node2]
changed: [node1]
PLAY [check nginx server] ******************************************************
TASK [Gathering Facts] *********************************************************
ok: [controller]
TASK [check web site] **********************************************************
ok: [controller] => (item=node1)
ok: [controller] => (item=node2)
PLAY RECAP *********************************************************************
controller : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node1 : ok=6 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node2 : ok=6 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ler : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node1 : ok=6 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node2 : ok=6 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
更多推荐
所有评论(0)