目录
一、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