目录
一、Ansible 快速入门
1.1 什么是 Ansible
1.2 Ansible 主要功能
1.3 Ansible 的特点
1.4 Ansible 基础架构
二、Ansible 安装与配置
2.1 Ansible 安装
2.2 确认安装
三、Ansible 配置解读
3.1 Ansible 配置路径
3.2 Ansible 主配置文件
3.3 Ansible 配置优先级
一、Ansible 快速入门
1.1 什么是 Ansible
Ansible 是一个 IT 自动化的配置管理工具,自动化主要体现在 Ansible 集成了丰富模块,以及强大的功能组件,可以通过一个命令行完成一系列的操作。进而能减少我们重复性的工作,以提高工作的效率。
1.2 Ansible 主要功能
- 批量执行远程命令,可以对 N 多台主机同时进行命令的执行。
- 批量配置软件服务,可以进行自动化的方式配置和管理服务。
- 实现软件开发功能,jumpserver 底层使用 ansible 来实现的自动化管理。
- 编排高级的 IT 任务,Ansible 的 playbook 是一门编程语言可以用来描绘一套 IT 架构。
1.3 Ansible 的特点
- 容易学习: 无代理,不像 salt 既要学客户端与服务端,还需要学习客户端与服务端中间通讯协议;
- 操作灵活: Ansible 有较多的模块,提供了丰富的功能;playbook 则提供类似于编程语言的复杂功能;
- 简单易用: 体现在 Ansible 一个命令可以完成很多事情;
- 安全可靠: 因为 Ansible 使用了 SSH 协议进行通讯,既稳定也安全;
- 移植性高: 可以将写好的 playbook 拷贝至任意机器进行执行;
- 幂等性: 一个任务执行 1 遍和执行 n 遍效果一样,不会因为重复执行带来意外情况。
1.4 Ansible 基础架构
Ansible 架构中的控制节点、被控制节点、 inventroy、ad-hocplaybook、Connection Protocol 是什么?
在 Ansible 架构中,以下是一些关键概念:
-
控制节点 (Control Node): 控制节点是指运行 Ansible 的主机,负责管理和执行 Ansible 的配置和任务。通常,这是管理员或开发人员的工作站或服务器,用于控制和管理被控制节点。
-
被控制节点 (Managed Node): 被控制节点是指由控制节点管理的目标主机。Ansible 通过 SSH 连接到这些节点,并在其上执行任务。被控制节点可以是服务器、虚拟机或任何远程主机。
-
Inventory (清单): 清单是一个包含被控制节点信息的文件,它告诉 Ansible 哪些主机应该被管理。清单可以是静态的(手动编写主机列表)或动态的(通过脚本或外部源动态生成)。清单还可以包含主机组,用于组织和分类主机。
-
Ad-hoc Commands (即席命令): 即席命令是在控制节点上直接执行的简单 Ansible 命令,用于在远程被控制节点上执行一次性任务,而无需编写复杂的 Playbook。使用即席命令,可以快速地在目标主机上执行某些操作。
-
Playbook (剧本): Playbook 是 Ansible 的主要配置文件,用于定义一系列任务和配置,以及在目标主机上执行这些任务的顺序。它使用 YAML 格式,具有易读性和编写简便性。通过 Playbook,可以在多个主机上执行复杂的配置管理和自动化任务。
-
Connection Protocol (连接协议): 连接协议指定 Ansible 在控制节点与被控制节点之间建立连接的方式。在大多数情况下,默认连接协议是 SSH (Secure Shell),通过 SSH 协议连接到被控制节点并执行任务。然而,Ansible 也支持其他连接协议,例如在 Windows 主机上使用 WinRM 进行连接。
总结: Ansible 是一种配置管理和自动化工具,它由控制节点管理被控制节点。清单文件指定被控制节点,Playbook 定义任务和配置,Ad-hoc Commands 允许在目标主机上执行一次性任务,而连接协议决定了如何与被控制节点建立连接。
二、Ansible 安装与配置
2.1 Ansible 安装
# 方式一:yum 安装(推荐)
[root@tidb ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@tidb ~]# yum makecache
[root@tidb ~]# yum install ansible -y
# 方式二:pip 安装
[root@tidb ~]# yum install python3 python3-devel python3-pip -y
[root@tidb ~]# pip3 install --upgrade pip -i https://pypi.douban.com/simple/
[root@tidb ~]# pip3 install ansible -i https://pypi.douban.com/simple/
2.2 确认安装
# 检查 Ansible 版本
[root@tidb ~]# 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 是否可用
[root@tidb ~]# ansible localhost -m ping
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
三、Ansible 配置解读
3.1 Ansible 配置路径
- /etc/ansible/ansible.cfg:主配置文件,配置 ansible 工作特性;
- /etc/ansible/hosts:配置主机清单文件;
- /etc/ansible/roles/:存放 ansible 角色的目录。
3.2 Ansible 主配置文件
ansible 的主配置文件存在 /etc/anible/ansible.cfg ,其中大部分的配置内容无需进行修改,下面是对于该文件重点内容的解读:
······
[defaults]
# some basic default values...
#inventory = /etc/ansible/hosts # 指定 Ansible 使用的主机清单文件的路径。
#library = /usr/share/my_modules/ # 指定 Ansible 模块库的路径。
#module_utils = /usr/share/my_module_utils/ # 指定 Ansible 模块工具库的路径
#remote_tmp = ~/.ansible/tmp # 指定远程主机上临时文件的路径。
#local_tmp = ~/.ansible/tmp # 指定本地主机上临时文件的路径
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml # 指定插件过滤器配置文件的路径。
#forks = 5 # 指定同时在多少个主机上并行执行任务。
#poll_interval = 15 # 设置在使用 async 任务时,轮询任务结果的时间间隔。默认为 15 秒。
#sudo_user = root # 在远程主机上以指定用户身份执行任务
#ask_sudo_pass = True # 如果设置为 True,Ansible 在执行任务时会要求输入 sudo 密码
#ask_pass = True # 如果设置为 True,Ansible 在执行任务时会要求输入远程用户的密码
#transport = smart # 指定连接被控制节点的方式。smart 表示智能选择
#remote_port = 22 # 指定连接远程主机时使用的 SSH 端口
#module_lang = C # 指定 Ansible 模块的语言
#module_set_locale = False # 如果设置为 False,在执行任务时不会设置模块的本地化
#host_key_checking = False # 这是用于控制是否进行主机密钥检查的配置项(建议去掉注释)
#log_path = /var/log/ansible.log # 这个配置项用于指定 Ansible 日志文件的路径(建议去掉注释开启日志)
3.3 Ansible 配置优先级
Ansible 的配置文件可以存放在任何位置,但配置文件有读取顺序,查找顺序如下:
- 最先查找 $ANSIBLE_CONFIG 变量
- 其次查找当前目录下 ansible.cfg
- 然后查找用户家目录下的 .ansible.cfg
- 最后查找 /etc/ansible/ansible.cfg
通过命令行操作演示,验证结论:
# 优先读取 $ANSIBLE_CONFIG 变量
[root@tidb ~]# ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
······
[root@tidb ~]# export ANSIBLE_CONFIG=/tmp/ansible.cfg
[root@tidb ~]# touch /tmp/ansible.cfg
[root@tidb ~]# ansible --version
ansible 2.9.27
config file = /tmp/ansible.cfg
······
# 读取当前目录下的 ansible.cfg(推荐)
[root@tidb ~]# unset ANSIBLE_CONFIG
[root@tidb ~]# ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
······
[root@tidb ~]# mkdir project1
[root@tidb ~]# cd project1/
[root@tidb ~/project1]# touch ansible.cfg
[root@tidb ~/project1]# ansible --version
ansible 2.9.27
config file = /root/project1/ansible.cfg
······
[root@tidb ~/project1]# cd ..
[root@tidb ~]# ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
······
# 读取当前用户家目录下的 .ansible.cfg
[root@tidb ~]# touch ~/.ansible.cfg
[root@tidb ~]# ansible --version
ansible 2.9.27
config file = /root/.ansible.cfg
·····
[root@tidb ~]# cd project1/
[root@tidb ~/project1]# ansible --version
ansible 2.9.27
config file = /root/project1/ansible.cfg
······
[root@tidb ~]# rm -rf .ansible.cfg
[root@tidb ~]# ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg