目录
- 写在前面
- 1. Ansible是什么
- 1.1 简介与来历
- 1.2 Ansible的特点
- 1.3Ansible的架构与工作流程
- 1.3.1 ansible 任务执行模式
- 1.3.2 ansible 执行流程
- 1.4 Ansible的模块
- 2. Ansible实验初始化
- 2.1 实验环境
- 2.2Ansible的安装
- 2.2.1 Ansible的程序结构
- 2.3 修改Ansible配置文件
- 2.3.1 配置文件中常见参数
- 2.4 Ansible的命令参数
- 3. Ansible Inventory 主机清单文件
- 3.1 设置Inventory
- 3.2.1 子组
- 3.2.2 指定ansible用户、密码、端口(不推荐)
写在前面
在ansible部分,决定以多篇文章的方式进行记录。写成一篇太累太费时太费脑TuT
1. Ansible是什么
1.1 简介与来历
Ansible 是一个开源的基于Python开发的自动化工具,用于配置管理、应用程序部署和任务自动化。它旨在简化 IT 基础设施管理,使得开发运维 (DevOps) 流程更加高效和可靠。
Ansible 由 Michael DeHaan 于 2012 年创建,并于同年发布。它由 Red Hat 赞助,并于 2015 年被 Red Hat 收购。Ansible 的设计理念是简洁易用,旨在解决传统自动化工具复杂性和学习曲线的问题。
1.2 Ansible的特点
- 无客户端模式:仅需在控制端部署Ansible环境,被控端无需操作;
- SSH工作:基于ssh协议对设备进行管理;
- 框架概念:Ansible基于模块进行工作,本身没有能力,真正工作的是运行的模块
- playbook:使用基于yaml的playbook实现自动化操作;
- 可扩展性:支持API等方式扩展;
- 幂等性:不关注执行过程,执行的结果无关次数,结果相同;
1.3Ansible的架构与工作流程
1.3.1 ansible 任务执行模式
Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhoc和playbook
- ad-hoc模式(点对点模式)
使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。 - playbook模式(剧本模式)
是Ansible 主要管理方式 ,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。
1.3.2 ansible 执行流程
Ansible在运行时, 首先读取ansible.cfg
中的配置, 根据规则获取Inventory
中的管理主机列表, 并行的在这些主机中执行配置的任务, 最后等待执行返回的结果。
- 命令执行过程:
- 加载自己的配置文件,默认/etc/ansible/ansible.cfg;
- 查找对应的主机配置文件,找到要执行的主机或者组;
- 加载自己对应的模块文件,如 command;
- 通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将文件传输至远程服务器;
- 对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;
- 给文件 +x 执行权限;
- 执行并返回结果;
- 删除临时py文件,sleep 0退出;
1.4 Ansible的模块
- Ansible:Ansible核心程序。
- Host Inventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。
- Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
- CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。
- CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
- ConnectionPlugins:连接插件,Ansible和Host通信使用
2. Ansible实验初始化
2.1 实验环境
Server: manager CentOS8 192.168.100.151
Host01: front CentOS8 192.168.100.148
Host02: storage CentOS8 192.168.100.150
Host03: backup CentOS8 192.168.100.149
2.2Ansible的安装
#ansible需要有epel源的支持,所以先安装epel-release
[root@manager ~]# yum install -y epel-release[root@manager ~]# yum install -y ansible[root@manager ~]# ansible --version
ansible [core 2.16.2]config file = /etc/ansible/ansible.cfgconfigured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']ansible python module location = /usr/lib/python3.11/site-packages/ansibleansible collection location = /root/.ansible/collections:/usr/share/ansible/collectionsexecutable location = /usr/bin/ansiblepython version = 3.11.5 (main, Oct 25 2023, 14:45:39) [GCC 8.5.0 20210514 (Red Hat 8.5.0-21)] (/usr/bin/python3.11)jinja version = 3.1.2libyaml = True######也可以用pip安装,首先安装python-pip,然后pip拉取ansible的包
yum install -y python-pip
pip install ansible
2.2.1 Ansible的程序结构
- 配置文件目录:/etc/ansible/
- 执行文件目录:/usr/bin/ansible
- lib库依赖目录:/usr/lib/pythonx.xx/site-packages/ansible*
- help文档目录:/usr/share/doc/ansible*
- man文档目录:/usr/share/man/man1/ansible*
2.3 修改Ansible配置文件
从 Ansible 2.12 版本开始,默认的配置文件不再有具体内容。但可以通过运行一个命令来生成一个示例配置文件。这个文件会包含所有默认设置,但都是被注释掉的(即“disabled”),如同2.12版本之前一样。
#生成配置文件 ansible-config init --disabled > ansible.cfg#或者更加完整的 ansible-config init --disabled -t all > ansible.cfg
关于配置文件,这里修改两点:
- 关闭主机密钥检查(host_key_checking)
- 开启日志功能
#不必生成新的配置文件,就在空的配置文件内添加即可
cat >> /etc/ansible/ansible.cfg << EOF
[defaults]
host_key_checking = False
log_path = /var/log/ansible.log
EOF
2.3.1 配置文件中常见参数
inventory = /etc/ansible/hosts #这个参数表示资源清单inventory文件的位置
library = /usr/share/ansible #指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
forks = 5 #并发连接数,默认为5
sudo_user = root #设置默认执行命令的用户
remote_port = 22 #指定连接被管节点的管理端口,默认为22端口,建议修改,能够更加安全
ask_pass = True #是否需要密码
host_key_checking = False #设置是否检查SSH主机的密钥,值为True/False。关闭后第一次连接不会提示配置实例
timeout = 60 #设置SSH连接的超时时间,单位为秒
log_path = /var/log/ansible.log #指定一个存储ansible日志的文件(默认不记录日志)
2.4 Ansible的命令参数
# ansible 命令参数
# anisble命令语法: ansible [-i 主机文件] [-f 批次] [组名] [-m 模块名称] [-a 模块参数]
ansible详细参数:-v,-verbose # 详细模式,如果命令执行成功,输出详细的结果 (-vv –vvv -vvvv)-i PATH, -inventory=PATH # 指定 host 文件的路径,默认是在 /etc/ansible/hosts
inventory [ˈɪnvəntri] 库存-f NUM,-forks=NUM # NUM 是指定一个整数,默认是 5 ,指定 fork 开启同步进程的个数。-m NAME,-module-name=NAME # 指定使用的 module 名称,默认使用 command模块-a,MODULE_ARGS #指定 module 模块的参数-k,-ask-pass #提示输入 ssh 的密码,而不是使用基于 ssh 的密钥认证-sudo # 指定使用 sudo 获得 root 权限-K,-ask-sudo-pass #提示输入 sudo 密码,与 -sudo 一起使用-u USERNAME,-user=USERNAME # 指定移动端的执行用户-C,-check #测试此命令执行会改变什么内容,不会真正的去执行# ansible-doc详细参数:ansible-doc -l #列出所有的模块列表ansible-doc -s 模块名 #查看指定模块的参数 -s, snippet [ˈsnɪpɪt] 片断
[root@manager~]# ansible-doc -s service#列出模块使用简介
[root@manager~]# ansible-doc -l # 指定一个模块详细说明
[root@ansible_server~]# ansible-doc -s fetch # 查询模块在剧本中应用方法
[root@manager~]# ansible-doc fetch
3. Ansible Inventory 主机清单文件
Ansible Inventory
指的是ansible管理的主机的列表,即主机清单。
ansible默认读取/etc/ansible/hosts
文件,也可以修改路径(用ansible -i
指定)
3.1 设置Inventory
- 指明主机的方式:
- 直接指明主机ip或域名
- 定义主机组再加入
#设置Inventory
[root@manager ~]# vim /etc/ansible/hosts
[front]
192.168.100.148[storage]
192.168.100.150[backup]
192.168.100.149
...#测试,对Inventory的所有主机ping测试
[root@manager ~]# ansible all -m ping
192.168.100.148 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": false,"ping": "pong"
}
192.168.100.149 | UNREACHABLE! => {"changed": false,"msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.100.149 port 22: No route to host","unreachable": true
}
...
3.2.1 子组
对于多个不同的组,创建一个聚合的组,便于一次对多组执行操作。
创建组data,包含storage和backup
ansible data -m ping
#在/etc/ansible/hosts中添加
[data:children]
storage
backup#测试(测试主机未开机)
ansible data -m ping
192.168.100.149 | UNREACHABLE! => {"changed": false,"msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.100.149 port 22: No route to host","unreachable": true
}
192.168.100.150 | UNREACHABLE! => {"changed": false,"msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.100.150 port 22: No route to host","unreachable": true
}
3.2.2 指定ansible用户、密码、端口(不推荐)
前文提到,ansible是基于ssh控制Inventory中的主机的。我之前的文章已经写过如何配置ssh密钥认证
。
但若没有配置,也可以在Inventory中指定ansible使用的用户、密码以及ssh的端口。
推荐设置ssh密钥登录
#/etc/ansible/hosts中的内容
[front]
192.168.100.148 ansible_user=root ansible_password=Huawei@123 ansible_port=22[storage]
192.168.100.150 ansible_user=root ansible_password=Huawei@123 ansible_port=22[backup]
192.168.100.149 ansible_user=root ansible_password=Huawei@123 ansible_port=22#测试
#若报错,为ssh: Permission denied (publickey.password)。即无密码。
192.168.100.148 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": false,"ping": "pong"
}