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需要记忆的操作比较多

无标题-2025-02-27-0918

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的主机配置的参数

主机清单文件(主机分组)

https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#inventory-basics-formats-hosts-and-groups

把综合架构需要用到的机器,进行分组

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给基于公私钥的认证

  1. 将master-61机器上的公钥,分发给想免密登陆的机器
  2. 后续对于该机器的操作,就直接进行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-------->主机的清单的文件

官网在这看

https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#connecting-to-hosts-behavioral-inventory-parameters

注意,部分资料里的主机配置文件语法,旧版如下
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
posted @ 2025-03-28 22:23  国家一级冲浪yzk  阅读(64)  评论(0)    收藏  举报