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路径不存在。
posted @ 2025-01-12 23:57  尹正杰  阅读(288)  评论(0)    收藏  举报