day40 Ansible基础学习
day40 Ansible基础学习
前言
学ansible,基础篇就是一件事
-
学各种模块的语法,参数 -
由于模块较多,参数较多,需要做好笔记,以及一定的背诵,敲打建议记忆 -
一定要多敲多练习
基础篇的学习的路线
- 1.主机清单语法,学会如何批量管理服务器组,配置服务器认证,服务器变量
- 2.学习常见的模块,语法,参数,用法
- 3.改造shell脚本为ansible模块
自动化运维的好处
-
提高工作效率,减少重复性工作
-
大大减少人为出错的可能性
-
数据化管理、数据化汇报、问题可追溯
以下的内容可以了解和学习
ansible saltstack 这俩自动化运维工具 master-61机器,管理了100台目标机器 指标 shell 脚本结合for循环处理这100个机器 每一个指标就是每一个命令 free -m > xxx.file cpuinfo shell,命令导出的数据就是一堆普通的文本字符串,难以加工处理 如果能导出为数据交换格式,如json,如yaml,如xml就可以很轻松的发给各种编程语言,实现数据加工,格式化处理,发给前端去做网页展示 ansible几条命令就可以实现了 并且 ansible导出的服务器信息,如内存,磁盘,网卡,等等一堆信息,可以直接导出为json数据 json数据就可以直接发给前端,前端就可以展示出服务器的信息 这就是运维开发做的事 后端python+ansible获取数据,导出json,发给前端 前端写html,js,对json数据展示 运维平台就出来了
好下面我们即将进入ansiable的世界
如何学习ansiable
1.1.打开ansible官网,查看所有最新的功能,不要看其他的文档,可能已经很陈旧了,python3也已经更新了很多,导致用法变化等。
https://docs.ansible.com/ansible/latest/
最新官网文档
nfs服务
rsync服务
shell脚本,堆砌了各种部署的命令
↓
把这个脚本,所有的操作,全部替换为ansible的模块
2.你可能要执行的各种命令,ansible都提供了模块,如文件拷贝,如软件安装,服务重启等;
3.你使用ansible,必须严格按照ansible提供的语法来,否则只有报错
4.先学语法,语法基本功扎实后,面对千变万化的需求,才能游刃有余
5.多动手,ansible需要记忆的操作比较多

1. ansible安装部署
在mster-61管理机器上安装
# 前提是你先配置好阿里云的epel源--
[root@master-61 ~]# yum install ansible -y
#查看版本和配置的信息
[root@master-61 ~]# ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg ----配置文件所在的目录
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Jun 28 2022, 15:30:04) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
还有一点初始化其他管理的机器
-------主要是学习ansible的主机配置的参数
主机清单文件(主机分组)
把综合架构需要用到的机器,进行分组
1.服务软件的下载
2. 修改的配置的文件
3.启动服务
4.检查服务
2.主机单配置的文件
vim /etc/ansible/hosts
[root@master-61 ~]# tail /etc/ansible/hosts
[web]
172.16.1.7
172.16.1.8
172.16.1.9
[nfs]
172.16.1.31
[bakcup]
172.16.1.41
主机分组后,执行命令测试,批量管理一组机器
管理所有的机器,使用特殊主机组,all
让所有的主机,远程执行hostname,返回主机名信息
[root@master-61 ~]#ansible all -m shell -a "hostname"
但是默认没配置认证方式,权限被拒绝
172.16.1.8 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Warning: Permanently added '172.16.1.8' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,password).",
"unreachable": true
}
#这里报错了
3.ansible主机的认证
Ansible批量管理主机的两种的方式:
- 传统的密码的登录
- 公钥认证
这里参考于超老师上一节讲解的ssh服务,所有的机器配置好公私钥登录,即可免密码操作------
#客户端生成公私钥,发公钥给服务端。
ansible给基于公私钥的认证
- 将master-61机器上的公钥,分发给想免密登陆的机器
- 后续对于该机器的操作,就直接进行ssh的公钥的认证可以免密码的登录
1.配置好master-61免密登录31机器
[root@master-61 .ssh]# ssh-copy-id root@10.0.0.31
2.后续可以免密执行ansible的各种模块了
[root@master-61 .ssh]# ansible nfs -m shell -a "hostname"
The authenticity of host '172.16.1.31 (172.16.1.31)' can't be established.
ECDSA key fingerprint is SHA256:8J6ml9c2yUH7IaTs8dd+3CoaLs18fMG+crvgx+Sy7bM.
ECDSA key fingerprint is MD5:be:7c:03:4a:f5:3c:f9:aa:b7:70:f0:6e:c4:c6:3f:aa.
Are you sure you want to continue connecting (yes/no)? yes
172.16.1.31 | CHANGED | rc=0 >>
nfs-31 ------------>看高主机名
4.基于密码的认证
- 在你的客户端机器、修改了ssh默认端口、以及密码需要修改主机清单文件才可以正确连接。
- 注意你得配置允许密码登录才能进行如下测试,可以再开一个web-9机器。
ansible主机清单的配置的语法(重要)
/etc/ansible/hosts-------->主机的清单的文件
官网在这看
注意,部分资料里的主机配置文件语法,旧版如下
Ansible 2.0 has deprecated the “ssh” from ansible_ssh_user, ansible_ssh_host, and ansible_ssh_port to become
这是旧版本的用法
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_password
最新的,去掉了中间的_ssh
新版参数
ansible_user
ansible_host
ansible_port
如果你写旧版本的语法,新版也也认识
这里我们的重点是在于新版的参数
| 参数 | 参数类型 | 参数说明 |
|---|---|---|
| ansible_host | 主机地址 | 远程主机ip |
| ansible_port | 主机端口 | 设置SSH连接端口,默认22 |
| ansible_user | 主机用户 | 默认SSH远程连接的用户身份 |
| ansible_password | 用户密码 | 指定SSH远程主机密码 |
给rsync机器,机器密码的认证
1.给rsync机器,添加密码,端口等信息
[backup]
172.16.1.41 ansible_port=22 ansible_password='123123'
2.如果目标机器的ssh信息都被改了,这里也得改
[backup]
172.16.1.41 ansible_port=22999 ansible_password='123456'
[root@master-61 .ssh]# ansible nfs -m ping
172.16.1.31 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
5.添加rsync机器的ssh的机器
Ansible软件使用的前提是SSH+KEY免密验证的环境,如果没有配置也可以使用Ansible,如下
[root@master-61 .ssh]# tail /etc/ansible/hosts
[bakcup]
172.16.1.41 ansible_port=22
ansible_user=root ansible_password=123123
测试执行
172.16.1.41 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
添加web机器组的信息
[root@master-61 ~]#tail /etc/ansible/hosts
[web]
172.16.1.7 ansible_port=22999 ansible_user=root ansible_password=123123
172.16.1.8 ansible_port=22999 ansible_user=root ansible_password=123123
[nfs]
172.16.1.31
[backup]
172.16.1.41 ansible_ssh_port=22999 ansible_ssh_user=root ansible_ssh_pass=123123
测试执行
[root@master-61 ~]#ansible web -m ping
172.16.1.8 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
172.16.1.7 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
拿web机器测试(单独操作某机器)
1.先配置主机组的参数
[web]
172.16.1.7 ansible_port=22999 ansible_password='123123'
172.16.1.8 ansible_port=22999 ansible_password='123123'
172.16.1.9 ansible_port=22999 ansible_password='123123'
2.执行ping模块,看下是否和远程主机通信
#因为这里的ssh的登录的是root用户
[root@master-61 .ssh]# ansible web -m ping
172.16.1.7 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
172.16.1.9 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
172.16.1.8 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
故障的解决
你可能会遇到的问题,关于新机器关于指纹确定的问题
[root@master-61 ~]#
[root@master-61 ~]#ansible 172.16.1.9 -m ping
172.16.1.9 | 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."
}
解决办法1,手动ssh连接,进行指纹确认,写入到本机的
[root@master-61 ~]#cat ~/.ssh/known_hosts
解决办法2,ansible配置文件中忽略指纹确认
[root@master-61 ~]#grep 'host_key_checking' /etc/ansible/ansible.cfg
host_key_checking = False
问题以及解决,可以正确操作web-9机器
[root@master-61 ~]#ansible 172.16.1.9 -m ping
172.16.1.9 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
踩坑记录(ansible缓存)
由于ansible在对远程主机操作之前,默认会先通过setup模块获取机器的facts(静态属性),并且会生成缓存,便于加速远程主机的操作;
但缓存也会导致一些奇怪的现象,比如客户端的机器信息更新了,服务端依旧使用的是旧数据,那就不准确了,因此可以删除缓存。
关于缓存导致bug的文章,https://serverfault.com/questions/630253/ansible-stuck-on-gathering-facts
清理ansible的缓存目录即可
[root@master-61 ~]#rm -rf ~/.ansible/cp/*
同一组连续的ip
可以修改主机清单文件如下,前提是该些主机的配置一致
[web]
172.16.1.[7:9]
公共的变量
当主机清单里,很多主机组,有相同的变量属性,可以写成公共变量
这部分配置是针对web主机组,抽象的变量
1.主机清单
[web:vars]
ansible_port=22999
ansible_password='123123'
[web]
172.16.1.[7:9]
[nfs]
172.16.1.31
[backup]
172.16.1.41 ansible_port=22999 ansible_password='123456'
2.ansible ad-hoc命令
web机器组
[root@master-61 ~]#ansible web -m ping
rsync机器
[root@master-61 ~]#ansible backup -m shell -a "touch /opt/已给我毅力giao warn=false"
172.16.1.41 | CHANGED | rc=0 >>
[root@master-61 ~]#
[root@master-61 ~]#
[root@master-61 ~]#ansible backup -m shell -a "ls /opt/"
172.16.1.41 | CHANGED | rc=0 >>
已给我毅力giao
[root@master-61 ~]#ansible web -m ping
172.16.1.7 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
172.16.1.8 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
172.16.1.9 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
# 获取主机名
[root@master-61 ~]#ansible web -m shell -a hostname
172.16.1.9 | CHANGED | rc=0 >>
web-9
172.16.1.8 | CHANGED | rc=0 >>
web-8
172.16.1.7 | CHANGED | rc=0 >>
web-7
所有主机都生效的变量(最终版)
指定主机组名all,即可针对所有主机生效,前提是,你要确保这个信息是所有主机通用的。
[root@master-61 ~]# grep -Ev '^#|^$' /etc/ansible/hosts
[all:vars]
ansible_port=22999
ansible_user=root
ansible_password=123123
[web]
172.16.1.[7:9]
[nfs]
172.16.1.31
[backup]
172.16.1.41
[root@master-61 ~]#
执行远程的命令
[root@master-61 ~]# ansible all -m shell -a 'date'
172.16.1.8 | CHANGED | rc=0 >>
Fri Mar 28 23:11:52 CST 2025
172.16.1.41 | CHANGED | rc=0 >>
Fri Mar 28 23:11:52 CST 2025
172.16.1.7 | CHANGED | rc=0 >>
Fri Mar 28 23:11:51 CST 2025
172.16.1.9 | CHANGED | rc=0 >>
Fri Mar 28 23:11:52 CST 2025
172.16.1.31 | CHANGED | rc=0 >>
Fri Mar 28 23:11:51 CST 2025
[root@master-61 ~]#
这里在提一嘴-------一定要学会看报错
6.关于ansible连接指纹的问题
1.master-61需要确认目标机器的指纹,记录到本地known_hosts文件
ls ~/.ssh/known_hosts文件中 这里就存放了目标机器的指纹信息
可以进行认证方式,密码,还是公钥
2.首次远程连接,需要指纹确认,可以忽略该指纹
ssh的连接参数,忽略指纹的确认
ansible的配置文件中也有一个参数忽略指纹的确认
一般用法
总之ansible就是ssh链接的标准来的
1.指纹的确定
2.密码的认证/公钥的认证
方案1
已经基于ssh完成了指纹确认,认证方式
ansible直接用就可以
你可以先一键分发公钥,实现批量免密登录,再ansible免密远程执行命令
方案2
ssh root@172.16.1.7
手动确认yes,写入到本地的known_hosts
你可以手动ssh连接,确认指纹后,再ansible去远程操作,选择认证方式就行
方案3,
你可以直接忽略指纹确认,在主机清单文件中定义好ssh连接配置参数
这个是最简单的,修改ansible配置文件,打开忽略指纹确认的参数即可
修改如下参数即可
72 # uncomment this to disable SSH key host checking
73 host_key_checking = False
#这个在/etc/ansible/ansible.conf
后续就进入了认证方式阶段,选择密码,还是公钥,
常见错误
- 端口错了
- 密码错了
- 用户错了
如果出错
1.找ansible的/etc/ansible/hosts中语法是否出错
2.看目标机器,到底提供了什么样的ssh连接形式(sshd_config)
下面是ansible的常用的模块
ansible提供了多少的模块
[root@master-61 .ssh]# ansible-doc -l | wc -l
3387
Ansible实现批量管理主机的模式主要有俩:
- 利用ansible命令实现批量管理(ad-hoc)模式
- 利用ansible剧本实现批量管理(playbook)模式
Ad-hoc和playbook的关系就好比shell命令与shell scripts的关系
ad-hoc模式
Ansible的ad-hoc模式也就是ansible的命令行模式,该模式通常用来临时处理一些任务。例如
- 临时批量查看所有被管控机器的内存、负载、磁盘
- 临时批量分发某个特定文件
Playbook模式
Ansible的playbook模式就是针对特定的具体较大的任务,事先写好执行剧本,然后在其他机器上批量执行相同的任务,属于定制化的批量执行任务,例如
- 一键安装Rsync
- 一键搭建LNMP集群等
ansible-doc命令
列出ansible所有支持的模块,这就是ansible这个万能工具箱所有的零件了。
[root@master-61 .ssh]# ansible-doc -l | grep ^ping
ping Try to connect to hos...
pingdom Pause/unpause Pingdom...
[root@master-61 .ssh]#
-------
[root@master-61 .ssh]# ansible-doc -l | grep ^shell
shell Execute shell command...
[root@master-61 .ssh]#
--------
当前ansible支持3387个模块
[root@master-61 ~]#ansible-doc -l |wc -l
3387
查看某个模块的具体的用法
[root@master-61 ~]#ansible-doc -s shell
[root@master-61 ~]#ansible-doc -s ping
浙公网安备 33010602011771号