Ansible安装及远程主机清单规则编写快速入门
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.常用的自动化运维工具
1.云计算运维工程师核心职能
运维工程师的基本职责就是保证系统和服务的稳定性,确保24小时不间断的为用户提供服务,甚至服务利用率在一年的占比为5个9,即99.999%。
在此基础上运维工程师的工作内容包括但不限于如下场景:
- 提升效率:
使用自动化的平台或工具,来提升项目在研发生命周期内的效率。
- 控制成本:
通过技术手段对服务架构进行优化,或采用新的产品和技术,来达到降低成本,提升效益的作用。
- 发布管理:
构建自动化运维平台,来确保每次发布,回滚都安全可控。
- 变更管理:
通过技术手段,对每次变更做要记录在案,有迹可循。
- 备份恢复:
对重要数据采用定时备份机制,以便能在发生问题时能及时恢复数据。
- 灾难演练:
定期对预定义方案进行演练,确保是可行的。
- 系统分析:
通过采集并分析各类日志,定位分析出系统可能存在的风险,及时修正,以及做好预案。
- 技术选型:
根据当前服务的业务情况,选用不同的产品和架构,以达到业务与经济的平衡。
- ...
从项目的生命周期来讲,运维工程师的工作主要包括四个阶段:
- 项目首次上线:
平台架构组件,基础环境和服务部署。
- 日常运行维护:
负责保障项目的稳定运行,版本迭代升级等。
- 性能效率优化:
当项目发展到一定阶段后,需要一些新的技术活方案来实现性能提升,成本优化等。
- 项目下线:
备份,迁移数据,释放资源等。
2.运维工程师发展路线
常见的运维相关岗位:
- Linux系统运维工程师
- 应用运维工程师:
- 运维开发工程师
- 云计算运维工程师
- 云原生工程师
- DBA运维工程师
- 大数据运维工程师
- 运维架构师
- 技术支持,交付运维工程师
- ...
运维的未来是什么?
运维的未来是让开发人员能够借助工具,自动化部署流程,并且让他们能够在运维干预极少的情况下部署和运营服务,从而实现自助服务,每个角色应该努力使工作实现自动化。
3.常用的自动化运维工具
工具名称 | 开发语言 | 描述 |
---|---|---|
Ansible | python | 无代理模式,基于ssh协议,适用于中小型应用环境,github关注度63.5k+ |
Saltstack | python | 有代理,使用前需要部署客户端,但是效率高,github关注度13k+ |
puppet | ruby | 功能强大,配置复杂,二次开发成本高,适合大型活超大型系统。 |
Fabric | python | 无代理模式,国内很少使用,文档较少。 |
Chef | ruby | 国内很少使用,文档较少。 |
有代理:
是指需要再被管理的机器上预先安装客户端软件,类似于C/S架构。
无代理:
是指预先不需要再被管理的机器上做任何操作,只需要被管理机器的远程连接用户名和密码即可。
二.Ansible概述
1.什么是Ansible
Ansible是一个自动化运维工具,基于python开发,集合了众多运维工具(puppet,cfengine,chef,func,fabric)的优点,实现批量系统配置,批量程序部署,批量运行命令等功能。
Ansible的名称来自科幻小说《安德的游戏》中跨越时空的即时通信工具,它可以在相距数光年的距离,远程实时控制前线的战队战斗。
Ansible成立于2013年,2015年10月被RedHat收购。
官网地址:
https://www.redhat.com/en/ansible-collaborative
https://docs.ansible.com/
github地址:
https://github.com/ansible/ansible
2.Ansible的发展史
2012年3月发布第一个版本
2015年10月被红帽(RedHat)收购,花费1.5亿美元。
之后由红帽开始进行商业化,作者本身之前就是红帽公司的员工,同时也是Cobbler和Func的作者。
3.Ansible的优缺点
Ansible的主要功能:
- 批量执行远程命令,可以对远程多台主机同时进行命令的执行;
- 批量安装和配置软件服务,可以对远程的多台主机进行自动化的方式配置和管理各种服务;
- 编排高级的企业级复杂的IT架构任务,Ansible和Playbook和role可以轻松实现大型的IT复杂架构;
- 提供自动化运维工具的开发API,由很多运维工具,比如jumpserver,kubeasz就是基于Ansible实现自动化管理功能;
Ansible的优点:
- 部署简单方便,在对多主机进行批量管理时,只需要在主控机上部署Ansible服务,被管理的机器不用部署;
- 默认通过SSH协议进行通信,只要保证主控端机SSH通道畅通,就能保证服务可用;
- 配置简单,上手快,功能强大;
- 用Python开发,打开源文件,所见即所得,对二次开发的支持非常友好;
- 大量常规运维操作已经内置;
- 对于较复杂的需求,可以通过Playbook功能和role功能来实现;
- 还提供了操作方便,功能强大的web管理界面;
- 是一个已经商业化很久的项目,生态成熟,社区活跃,文档完善;
Ansible的缺点:
- 在管理的主机数量较多时,性能略差,执行效率不如saltstack高;
- 不支持事务回滚;
4.Ansible工作原理
Ansible的执行流程如下:
- 1.加载Ansible的配置文件,读取配置;
- 2.加载对应的模块文件;
- 3.根据命令或者模块,生成一个临时的py文件,再将该文件传送至对应被管理的机器上;
比如: "${HOME}/.ansible/tmp/ansible-tmp/xxx/xx.py"
- 4.给远程的py文件夹可执行权限;
- 5.执行该文件,并将结果抓取会当前的主机显示;
- 6.删除远端的临时py文件;
5.Ansible命令执行来源
- 1.系统用户直接执行,系统用户登录终端后直接在命令行下执行单条命令;
- 2.在Playbooks中间接执行,Playbook中编写多条Ansible命令,Ansible根据Playbook文件的内容依次执行;
- 3.在web管理界面上执行;
- 4.使用API调用执行,配置API接口,让第三方应用或程序调用接口执行Ansible命令;
6.使用Ansible注意事项
- 1.执行Ansible的主机一般称为管理端,主控端,中控,master或堡垒机;
- 2.主控端Python 2.6+;
- 3.被控端Python 2.4-,需要安装python-simplejson模块;
- 4.被控端如何开启selinux需要安装libselinux-python模块;
- 5.Windows不能作为主控端,只能作为被控端;
三.Ansible安装和基本使用
1.centos安装Ansible
1.安装epel源
yum -y install epel-release
2.安装Ansible
yum -y install ansible
3.查看Ansible的安装包
rpm -q ansible
4.查看Ansible版本
ansible --version
2.Ubuntu安装Ansible
2.1 系统直接安装Ansible
1.安装Ansible-core软件包
apt update
apt -y install ansible-core
2.查看安装的Ansible版本
dpkg -l ansible-core
ansible --version
温馨提示:
- ansible-core包中仅包含核心功能和核心模块,如下所示。
[root@worker232 ~]# ansible --version # 对应ansible-core包的版本是2.12.0。
ansible [core 2.12.0]
config file = None
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.10.12 (main, Nov 6 2024, 20:22:13) [GCC 11.4.0]
jinja version = 3.0.3
libyaml = True
[root@worker232 ~]#
[root@worker232 ~]# dpkg -L ansible-core | wc -l
1064
[root@worker232 ~]#
- ansible包中除了核心模块之外还包含大量外围功能模块,如下所示。
[root@worker233 ~]# ansible --version # 对应ansible包的版本是2.10.8。
ansible 2.10.8
config file = None
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
executable location = /usr/bin/ansible
python version = 3.10.12 (main, Nov 6 2024, 20:22:13) [GCC 11.4.0]
[root@worker233 ~]#
[root@worker233 ~]# dpkg -L ansible | wc -l
34739
[root@worker233 ~]#
- 在ubuntu 22.04LTS系统中,ansible和ansible-core软件版不能同时共存,都不提供配置文件,且ansible-core版本更新;
2.2 使用pip3安装Ansible
1.安装pip3工具
apt-get update
apt -y install python3-pip
2.使用pip3安装Ansible
pip3.10 install -i https://pypi.tuna.tsinghua.edu.cn/simple ansible
2.查看Ansible版本
ansible --version
四.Ansible主置文件
1.Ubuntu初始化ansible配置目录
1.创建目录及初始化文件结构
[root@worker232 ~]# mkdir -pv /etc/ansible/roles
mkdir: created directory '/etc/ansible'
mkdir: created directory '/etc/ansible/roles'
[root@worker232 ~]#
[root@worker232 ~]# touch /etc/ansible/hosts
[root@worker232 ~]#
2.生成配置文件
[root@worker232 ~]# ansible-config init -t all --disable > /etc/ansible/ansible.cfg
[root@worker232 ~]#
[root@worker232 ~]# ll /etc/ansible/ansible.cfg
-rw-r--r-- 1 root root 51592 Jan 1 00:48 /etc/ansible/ansible.cfg
[root@worker232 ~]#
3.查看ansible目录文件列表及作用说明
[root@worker232 ~]# apt -y install tree
[root@worker232 ~]# tree /etc/ansible/
/etc/ansible/
├── ansible.cfg # 主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件,当前目录下如果也有ansible.cfg,则当前目录中的配置文件优先于此文件。
├── hosts # 主机清单,在此文件中定义要管理的主机
└── roles # 目录,存放角色文件
1 directory, 2 files
[root@worker232 ~]#
2.主配置文件优先级生效顺序验证
ansible的主配置文件可以有多个,分别存放于不同目录,其优先级如下:
- ANSIBLE_CONFIG
环境变量,此变量中指向的文件必须存在才生效,指向的文件要以"*.cfg"结尾。
- ./ansible.cfg
当前目录下的ansible.cfg一般一个项目对应一个专用配置文件,推荐使用这种方式。
- ~/.ansible.cfg
当前用户家目录下的".ansible.cfg"文件。
- /etc/ansible/ansible.cfg
ansible默认主配置文件。
ansible配置文件使用技巧:
- 1.主配置文件中间接定义了其他的配置项,在使用时,可以为不同的项目建立不同的配置文件放到不同的目录中,再去到该目录下执行ansible
- 2.或者用变量指定不同的配置文件用来区分不同的项目配置
- 3.对于不同用户,可以写在相应的家目录中。
验证ansible配置文件生效顺序案例:
[root@worker232 ~]# ansible --version | grep cfg
config file = /etc/ansible/ansible.cfg
[root@worker232 ~]#
[root@worker232 ~]# touch .ansible.cfg
[root@worker232 ~]#
[root@worker232 ~]# ansible --version | grep cfg
config file = /root/.ansible.cfg
[root@worker232 ~]#
[root@worker232 ~]# mkdir yinzhengjie && cd yinzhengjie && touch ansible.cfg
[root@worker232 yinzhengjie]#
[root@worker232 yinzhengjie]# ll
total 8
drwxr-xr-x 2 root root 4096 Jan 1 00:58 ./
drwx------ 9 root root 4096 Jan 1 00:58 ../
-rw-r--r-- 1 root root 0 Jan 1 00:58 ansible.cfg
[root@worker232 yinzhengjie]#
[root@worker232 yinzhengjie]# ansible --version | grep cfg
config file = /root/yinzhengjie/ansible.cfg
[root@worker232 yinzhengjie]#
[root@worker232 yinzhengjie]# cd
[root@worker232 ~]#
[root@worker232 ~]# ansible --version | grep cfg # 退出目录后,配置文件又发生了变化
config file = /root/.ansible.cfg
[root@worker232 ~]#
[root@worker232 ~]# export ANSIBLE_CONFIG=/tmp/yinzhengjie-devops.cfg # 配置环境变量
[root@worker232 ~]#
[root@worker232 ~]# ansible --version | grep cfg # 不生效是应为文件不存在
config file = /root/.ansible.cfg
[root@worker232 ~]#
[root@worker232 ~]# touch /tmp/yinzhengjie-devops.cfg # 创建后观察立刻生效
[root@worker232 ~]#
[root@worker232 ~]# ansible --version | grep cfg
config file = /tmp/yinzhengjie-devops.cfg
[root@worker232 ~]#
参考链接:
https://docs.ansible.com/ansible-core/devel/reference_appendices/config.html#the-configuration-file
3 主配置文件的关键参数说明
[root@worker232 ~]# egrep -v "^#|^$" /etc/ansible/ansible.cfg | wc -l # 不难发现,ansible有289个配置参数,对于新手相对来说还是较多的。
289
[root@worker232 ~]#
[root@worker232 ~]# cat /etc/ansible/ansible.cfg
# 默认配置
[defaults]
...
# 远程主机清单
inventory=/etc/ansible/hosts
# 远程主机临时文件目录
remote_tmp=~/.ansible/tmp
# 本地主机临时文件目录
local_tmp=~/.ansible/tmp
# 是否保留远程主机上的py脚本文件,默认不保留
keep_remote_files=False
# 生成shell命令时用指定的bash执行
executable=/bin/sh
# 最大并发数量
forks=5
# 连接远程主机时,询问是否需要输入密码,默认不询问,走ssk key校验
ask_pass=False
# 是否需要每次询问要不要添加HostKey,默认是true
host_key_checking=True
# 日志文件地址,为空表示禁用日志
log_path=
# 默认使用的模块
module_name=command
# implicit表示每次收集;explicit表示不收集,除非指定;smart表示如果有缓存则使用缓存
gathering=implicit|explicit|smart
# 远程主机信息缓存时长,默认是86400s,表示24h。
fact_caching_timeout=86400
# 默认缓存到内存中,可以写到本地json文件或者redis中
fact_caching=memory|jsonfile|redis
# 如果fact_caching写jsonfile,此处写保存路径,如果是redis此处写redis链接地址,如果是内存则省略。
fact_caching_connection=
# 指定远程主机Python版本和路径
interpreter_python=auto
...
# 连接持久化配置
[persistent_connection]
...
# 指定查找可转换连接脚本的位置,若不指定,则默认ansible将从与ansible脚本相同的目录开始
ansible_connection_path=
# 等待远程设备响应的超时时间
command_timeout=30
# 超时后的重试时长
connect_retry_timeout=15
# 连接的超时时间
connect_timeout=30
# socket套接字文件保存目录
control_path_dir=~/.ansible/pc
...
# 颜色设置
[colors]
...
# 普通用户提权配置
[privilege_escalation]
...
# sudo时是否提示输入密码
become_ask_pass=False
# 以sudo方式提权
become_method=sudo
# 默认sudo到root
become_user=root
参考链接:
https://docs.ansible.com/ansible-core/devel/reference_appendices/config.html
五.ansible远程主机清单文件
1.主机清单配置文件
ansible的主要功能在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory主机清单文件中将其分组组织。
主机定义支持IP地址和主机名两种方式,写法多种多样。inventory文件遵循INI文件风格,中括号的字符为组名,可以将同一个主机归并到不同的组中,此外,如若目标主机使用非默认的SSH端口,还可以在主机名之后使用冒号加端口号来标识,如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机。
注意:
- 1.生产建议在每个项目目录下创建独立的hosts文件;
- 2.通过项目目录下的ansible.cfg文件中的"inventory=./hosts"实现;
参考链接:
https://docs.ansible.com/ansible-core/devel/inventory_guide/intro_inventory.html
2.主机清单文件编写案例
2.1 分组经典用法
1.定义分组
[root@worker232 ~]# cat /etc/ansible/hosts
[k8s]
k8s23[1:3].yinzhengjie.com
harbor250.yinzhengjie.com
[ceph]
ceph14[1:3]
10.0.0.201
[istio]
istio[4:6].node[77:79].yinzhengjie.com
# rook分组从其他分组中引用,无法定义新的主机,从其他多个分组中继承主机(写法不推荐)。
[rook:children]
ceph
k8s
[root@worker232 ~]#
2.调用特定分组测试
[root@worker232 ~]# ansible k8s --list-hosts
hosts (4):
k8s231.yinzhengjie.com
k8s232.yinzhengjie.com
k8s233.yinzhengjie.com
harbor250.yinzhengjie.com
[root@worker232 ~]#
[root@worker232 ~]# ansible ceph --list-hosts
hosts (4):
ceph141
ceph142
ceph143
10.0.0.201
[root@worker232 ~]#
[root@worker232 ~]# ansible istio --list-hosts
hosts (9):
istio4.node77.yinzhengjie.com
istio4.node78.yinzhengjie.com
istio4.node79.yinzhengjie.com
istio5.node77.yinzhengjie.com
istio5.node78.yinzhengjie.com
istio5.node79.yinzhengjie.com
istio6.node77.yinzhengjie.com
istio6.node78.yinzhengjie.com
istio6.node79.yinzhengjie.com
[root@worker232 ~]#
[root@worker232 ~]# ansible rook --list-hosts
hosts (8):
ceph141
ceph142
ceph143
10.0.0.201
k8s231.yinzhengjie.com
k8s232.yinzhengjie.com
k8s233.yinzhengjie.com
harbor250.yinzhengjie.com
[root@worker232 ~]#
[root@worker232 ~]#
[root@worker232 ~]# ansible all --list-hosts
hosts (17):
istio4.node77.yinzhengjie.com
istio4.node78.yinzhengjie.com
istio4.node79.yinzhengjie.com
istio5.node77.yinzhengjie.com
istio5.node78.yinzhengjie.com
istio5.node79.yinzhengjie.com
istio6.node77.yinzhengjie.com
istio6.node78.yinzhengjie.com
istio6.node79.yinzhengjie.com
ceph141
ceph142
ceph143
10.0.0.201
k8s231.yinzhengjie.com
k8s232.yinzhengjie.com
k8s233.yinzhengjie.com
harbor250.yinzhengjie.com
[root@worker232 ~]#
2.2 分组别名
1.编写配置文件
[root@worker232 ~]# cat /etc/ansible/hosts
k8s ansible_python_interpreter=/usr/bin/python3 ansible_ssh_password='yinzhengjie' ansible_host=10.0.0.233
[root@worker232 ~]#
2.调用测试
[root@worker232 ~]# ansible all --list-hosts
hosts (1):
k8s
[root@worker232 ~]#
2.3 连接主机时指定配置项
1.编写配置文件
[root@worker232 ~]# cat /etc/ansible/hosts
# 每个主机都可以自定义需要的配置,比如此处我指定了远程主机的连接协议,端口,用户名和密码
master231 ansible_connection=ssh ansible_ssh_port=8022 ansible_ssh_user=jasonyin2020 ansible_ssh_password=yinzhengjie
# 指定主机的用户名和密码。
worker232 ansible_ssh_user=root ansible_ssh_password=yinzhengjie
# 指定主机的IP地址和端口
10.0.0.233:8023
[root@worker232 ~]#
2.调用测试
[root@worker232 ~]# ansible all --list-hosts
hosts (3):
master231
worker232
10.0.0.233
[root@worker232 ~]#
2.4 在分组中定义别名
1.编写配置文件
[root@worker232 ~]# cat /etc/ansible/hosts
[rook]
ceph141 ansible_ssh_hosts=10.0.0.141
ceph142 ansible_ssh_hosts=10.0.0.142
ceph143 ansible_ssh_hosts=10.0.0.143
# 为rook组定义变量,调用rook分组时使用以下变量
[rook:vars]
ansible_ssh_password=yinzhengjie
[root@worker232 ~]#
2.调用测试
[root@worker232 ~]# ansible all --list-hosts
hosts (3):
ceph141
ceph142
ceph143
[root@worker232 ~]#
3.主机清单文件分组中常用配置项
- ansible_ssh_host
指定远程主机,可以是IP地址或者主机名。
- ansible_ssh_port
指定SSH端口。
- ansible_ssh_user
指定SSH用户名。
- ansible_ssh_pass
指定SSH密码。
- ansible_sudo_pass
指定SUDO密码。
- ansible_sudo_exe
sudo命令执行路径,适用于1.8+版本。
- ansible_connection
与主机的连接类型,比如local|ssh|paramiko|docker
- ansible_ssh_private_key_file:
SSH私钥文件。
- ansible_ssh_type
目标系统的SHELL类型,默认是sh,可以指定为csh|fish等。
- ansible_python_interpreter
目标主机的Python解释器路径,适用于多Python版本场景或者默认/usr/bin/python路径不存在。
本文来自博客园,作者:尹正杰,转载请注明原文链接:https://www.cnblogs.com/yinzhengjie/p/18667646,个人微信: "JasonYin2020"(添加时请备注来源及意图备注,有偿付费)
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。问问自己,想要怎样的人生。