1.Ansible概述
Python写的
github地址: https://github.com/ansible/ansible
Ansible 是一套用来做 自动化运维/配置管理/批量执行/应用发布 的工具。你可以把它理解成:用一份"可读的 YAML 剧本",去指挥一堆机器把事按步骤做完------而且默认走 SSH,不用在被控机器上装 agent(代理程序)
它解决什么问题
-
你不想手动 SSH 一台台改配置、装包、重启服务
-
你希望"同一件事在 100 台机器上做出来的结果一致"
-
你希望操作是可重复、可审计、可版本管理(Git)
Ansible 的优点一句话概括:用很少的成本,把一堆机器"统一、可重复"地管起来。
更简单点分 6 条:
-
跨平台:Linux/Windows/网络设备都能管
-
无代理:不用在被控机器装 agent,通常 SSH 就行
-
好读好写:用 YAML 写剧本,人看得懂
-
可重复、可追溯:playbook 是纯文本,能放 Git 做版本管理
-
机器列表灵活:清单(inventory)可以动态生成,适合云/容器环境
-
好集成:能和 Puppet、卫星系统等现有运维工具一起编排
2.Ansible原理
用ssh连接目标机
用python做事 (不同Ansible对应不同版本Python)
3.Ansible架构

4.Ansible组件
1) Inventory(清单)
-
列出被管理主机(可以分组:web/db 等)
-
还能写连接参数(用户、端口、跳板机等)
2) Playbook(剧本)
-
用 YAML 写的"执行流程"
-
指定:对哪些主机组 、按什么顺序 、做哪些任务
3) Module(模块)
-
Ansible 执行的"动作库",比如装包、拷文件、启服务
-
分两类:内置模块 / 自定义模块
4) Connection Plugin(连接插件)
-
负责"怎么连过去并执行"
-
默认是 SSH (Linux),Windows 常用 WinRM
-
也支持跳板/代理等(本质还是走 SSH 能力)
Inventory 告诉我管谁 → Playbook 告诉我做什么 → Module 真正去干活 → Connection Plugin 负责把活送到目标机并拿回结果。
Ansible幂等性,执行过的脚本,不会再执行
5.常用运维工具比较
Puppet
基于 Ruby 开发,采用 C/S 架构,扩展性强,基于 SSL,远程命令执行相对较弱
SaltStack
基于 Python 开发,采用 C/S 架构,相对 puppet 更轻量级,配置语法使用 YAML,使得配置脚本更简单
Ansible
基于 Python paramiko 开发,分布式,无需客户端 ,轻量级,配置语法使用 YAML 及 jinja2 模板语言,更强的远程命令执行操作
6.Ansible特性
1、no agents:不需要在被管控主机上安装任何客户端,更新时,只需在操作机上进行一次更新即可
2、no server:无服务器端,使用时直接运行命令即可
3、modules in any languages:基于模块工作,可使用任意语言开发模块
4、yaml, not code:使用 yaml 语言定制剧本 playbook
5、ssh by default:基于 SSH 工作
6、strong multi-tier solution:可实现多级指挥 这个其实用到的是ssh的能力
解释
a b c d 4台机子 你可以从a连接b 从b连接c 从c连接d
7.Ansible的操作链路

例如安装软件
Ansible去主机清单中找对应的机子,通过连接插件建立连接,然后(通过核心模块,自定义模块,插件)去完成
如果是安装多个
自己写剧本(Playbooks),Ansible去主机清单中找对应的机子,通过连接插件建立连接,然后(通过核心模块,自定义模块,插件)去完成你的剧本(Playbooks)
8.安装Ansible
如果你是Centos7 需要 yum install epel-release
然后
yum install ansible -y
Ubuntu
apt install ansible -y
ansible --version 我这里config file=None

这个ansible.cfg的作用是配置主机配置清单
mkdir /etc/ansible
touch /etc/ansible/ansible.cfg
再次 ansible --version config file就有了

/etc/ansible/ansible.cfg 中指定默认清单文件位置
可以不写 不写默认就是
cat > /etc/ansible/ansible.cfg <<'EOF'
[defaults]
inventory = /etc/ansible/hosts
host_key_checking = False
retry_files_enabled = False
EOF
touch /etc/ansible/hosts
[web]
xx.xx.xx.xx ansible_user=root ansible_password='xxxxxxxx'
关于/etc/ansible/ansible.cfg配置文件修改位置
当然你/etc/profile.d/ansible.sh 然后export ANSIBLE_CONFIG=/root/ansible-demo/ansible.cfg 也是可以的
或者/etc/bash.bashrc
可以自己配置环境变量
vim /etc/profle
export ANSIBLE_CONFIG=/root/ansible-demo/ansible.cfg
保存退出
root@DMIT-JP-PROXY:~# ansible web -m ping
xx.xxx.xxx.x | FAILED! => {
"msg": "to use the 'ssh' connection type with passwords, you must install the sshpass program"
}
root@DMIT-JP-PROXY:~#
安装
apt install -y sshpass
再次执行
ansible web -m ping
出现 卡在 SSH 第一次连接的"指纹确认"
root@DMIT-JP-PROXY:~# ansible web -m ping
xx.xxx.xxx.x | FAILED! => {
"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."
}
解决办法 手动连接
ssh root@xxxxxxx
手动确认yes
输入密码 进入后退出 然后再次执行
root@DMIT-JP-PROXY:~# ansible web -m ping
xx.xx.xxx.xx | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
root@DMIT-JP-PROXY:~#
9.Ansible一堆命令
ansible是基于命令和脚本 来控制其他主机
-
命令 :一次性做一件事
ansible web -m ping -
脚本/剧本(Playbook) :把很多步骤按顺序组织起来,可重复执行
ansible-playbook site.yml
ansible all -m ping 对所有主机连接性测试
ansible-playbook site.yml
ansible-playbook site.yml -l web
ansible-playbook site.yml -l xx.xxx.xxx.xx
ansible-playbook site.yml
ansible-playbook site.yml 会执行哪些主机,由 playbook 里的 hosts: 决定:
-
如果
site.yml写的是:- hosts: all那就是对清单里的所有主机执行。
-
如果写的是:
- hosts: web那就只对 web 组执行(不是全部)。