Contents
ansible-简介及基本安装并连接主机
ansible简介
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。Ansible架构相对比较简单,仅需通过SSH连接客户机执行任务即可
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
ansible安装
Ansible易于安装。Ansible软件只需要安装到要运行它的一个(或多个)控制节点上。由Ansible管理的主机不需要安装Ansible。
对控制节点的要求:
- 控制节点应是Linux或UNIX系统。不支持将Windows用作控制节点,但Windows系统可以是受管主机。
-
控制节点需要安装Python3(版本3.5或以上)或Python2(版本2.7或以上)。
-
需要epel源。
-
关闭防火墙和selinux。
对受控节点的要求:
- 控制节点需要安装Python3(版本3.5或以上)或Python2(版本2.7或以上)。
- 关闭防火墙和selinux。
yum install ansible -y
[root@eab5aec2df6c ~]# ansible --version
ansible [core 2.15.3]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.11/site-packages/ansible
ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.11.5 (main, Oct 25 2023, 16:19:59) [GCC 8.5.0 20210514 (Red Hat 8.5.0-20)] (/usr/bin/python3.11)
jinja version = 3.1.2
libyaml = True
从以上信息可以看到
- 配置文件位置ansible.cfg
- 模块路径
- python的模块路径
- ansible的执行文件路径
- python版本
- jinja模板引擎的版本
- Ansible playbook 编写时用到的文件格式
常用模块介绍
模块 | 作用 |
---|---|
ping | 检测目标机器是否存活 |
command | 远程执行简单linux命令不支持特殊符号 |
shell | 万能模块,远程执行简单linux命令,支持特殊符号 |
copy | 批量分发文件,管理机器要给所有被管理的机器,批量的发送,更新某文件,某文件夹 |
file | 设置文件的权限和其他属性。 |
script | 在受控端执行控制端的脚本 |
cron | 创建修改定时任务 |
rsync | 使用rsync同步内容。 |
lineinfile | 确保特定行是否在文件中。 |
yum | 使用yum管理软件包。 |
apt | 使用APT管理软件包。 |
dnf | 使用dnf管理软件包。 |
firewalld | 管理防火墙 |
service | 管理服务。 |
user | 添加、删除和管理用户帐户。 |
group | 添加、删除和管理组。 |
get_url | 通过HTTP、HTTPS或FTP下载文件。 |
raw | raw模块可以绕过模块子系统,直接使用远程shell运行命令。python没有安装时使用。 |
临时命令简介
临时命令可以执行单个Ansible任务,不需要将它保存下来供以后再次运行。无需编写playbook。
语法规则如下:
ansible host-pattern -m module [-a ‘module arguments’] [-i inventory]
参数 | 释义 |
---|---|
host-pattern | 指定在其上运行临时命令的受管主机。它可以是清单中的特定受管主机或主机组。 |
-m | 指定使用的模块。 |
-a | 以带引号字符串形式取这些参数的列表。 |
-i | 指定清单文件。 |
-v | 输出更详细的执行过程信息,-vvv可得到执行过程所有信息。 |
-o | 单行输出。 |
-f | 指定并发线程数,默认5个线程。 |
–private-key | 指定密钥文件。 |
-M | 指定模块存放路径,默认/usr/share/ansible,也可以通过ANSIBLE_LIBRARY设定默认路径。 |
-k | 认证密码 |
-s | 相当于Linux系统下的sudo命令。 |
-t | 输出信息至DIRECTORY目录下,结果文件以远程主机命名。 |
-T | 指定连接远程主机的最大超时,单位是秒。 |
-B | 后台执行命令,超NUM秒后中止正在执行的任务。 |
-P | 定期返回后台任务进度。 |
-U | 使用sudo,相当于LInux下的sudo命令。 |
-c | 指定连接方式,可用选项paramiko(SSH)、ssh、local,local方式常用于crontab和kickstarts。 |
-l | 指定运行主机。 |
–list-hosts | 列出符合条件的主机列表,不执行任何命令。 |
-u | 指定远程主机以USERNAME运行命令。 |
-b | 是否使用特级升权,连接后,是否在受控机上切换用户。 |
–become-method | 如何切换用户,也可以指定为su。 |
–become_user | 要在受控机上切换到的用户。 |
-K | 用户的密码(–sudo时使用)。 |
ansible配置文件
ansible默认配置文件可以在多个位置,若这些文件都存在,则优先级是:
环境变量 ANSIBLE_CONFIG指定的配置文件> 当前目录下的配置文件 > ~/.ansible.cfg配置文件 > /etc/ansible/ansible.cfg配置文件 > 默认配置参数。
我们一般自定义一个配置文件和清单文件。
配置文件参数如下
[defaults]
[defaults]部分设置Ansible操作的默认值。
参数 | 释义 |
---|---|
inventory | 表示资源清单inventory文件的位置。 |
library | 指定存放Ansible模块的目录。 |
remote_tmp | 远程执行的文件路径 |
local_tmp | 管理节点的执行路径 |
forks | 默认开启的并发数。 |
poll_interval | 默认轮询时间间隔 |
sudo_user | 默认sudo用户 |
ask_sudo_pass | 是否需要sudo密码 |
ask_pass | 是否需要用户输入连接密码 |
remote_port | 指定连接对端节点的管理端口,默认是22。 |
module_lang | 默认模块和系统之间通信的计算机语言,默认为C语言。 |
host_key_checking | 首次连接是否检查key认证,默认为False,表示跳过。 |
timeout | 连接超时时间 |
module_name | 默认执行的模块 |
nocolor | 默认ansible会为输出结果加上颜色,用来更好的区分状态信息和失败信息。关闭功能设置为1。 |
private_key_file | 在使用ssh公钥私钥登录系统时候,使用的密钥路径。 |
roles_path | 默认下载的Roles存放的目录 |
log_path | 执行日志存放目录 |
fact_caching | getfact缓存的主机信息存放方式 |
retry_files_save_path | 错误重启文件存放目录 |
[privilege_escalation]
[privilege_escalation]配置Ansible如何在受管主机上执行特权升级
参数 | 释义 |
---|---|
become=True | 连接后,是否在受控机上切换用户。 |
become_method=sudo | 如何切换用户,也可以指定为su。 |
become_user=root | 要在受控机上切换到的用户,默认为root。 |
become_ask_pass=False | 切换时是否需要提示设置密码,此时设置True。 |
[paramiko_connection]
参数 | 释义 |
---|---|
record_host_keys=False | 不记录新主机的key以提升效率 |
pty=False | 禁用sudo功能 |
[ssh_connection]
参数 | 释义 |
---|---|
pipelining = False | 管道加速功能,需配和requiretty使用方可生效 |
[selinux]
参数 | 释义 |
---|---|
libvirt_lxc_noseclabel = yes | selinux配置 |
ansible颜色状态
- 绿色:命令以用户期望的执行了,但是状态没有发生改
- 黄色:命令以用户期望的执行了,并且状态发生了改变
- 紫色:警告信息,说明ansible提示你有更合适的用法
- 红色:命令错误,执行失败
- 蓝色:详细的执行过程
ansible主机清单文件
vim /etc/ansible/hosts
通过模块批量管理主机,host-pattern为all表示所有的主机
[模块名]
主机或者ip 后可接ssh端口 用户名 密码
主机或者ip ....................
......
例如:
[web]
192.168.125.1 ansible_port=22 ansible_user=root ansible_password="1111"
192.168.125.2 ansible_port=22 ansible_user=root ansible_password="1111"
支持通用写法,表示www001-www006 6个主机
www[001:006]
当用户名密码port相同时,可以在模块上方定义一个[模块名:vars],参数每行一个键值对
[web:vars]
ansible_port=22
ansible_user=root
ansible_password="1111"
[web]
192.168.125.1
192.168.125.2
ansible连接受控主机
环境如下
主机 | ip | 主机组 |
---|---|---|
eab5aec2df6c | 192.168.125.31 | ansible主机 |
centos70 | 192.168.125.20 | web |
centos71 | 192.168.125.21 | web |
centos72 | 192.168.125.23 | nfs |
ansible主机认证的两种方式
- 用户名密码认证
- ssh公钥私钥认证
初始化认证的几种方式
方法1
己经基于ssh完成了指纹确认,认证方式
ansible直接用就可以
先一键分发公钥,实现批量免密登录,再ansible免密远程执行命令
方法2
ssh root@192.168.125.20
手动确认yes,写入到本地的known_hosts
手动ssh连接,确认指纹后,再ansible去远程操作
方法3,
直接忽略指纹确认,在主机清单文件中定义好ssh连接配置参数
修改ansible配置文件,打开忽略指纹确认的参数即可
修改如下参数即可
host_key_checking=false
两种方式连接受控主机
方式1:
在ansible主机组做好host解析
编辑清单文件
[web:vars]
ansible_user=root
ansible_password=520140
[web]
centos70
centos71
[nfs]
centos72
生成默认配置文件
ansible-config init --disabled > ansible.cfg
修改配置文件的参数忽略指纹验证
host_key_checking=false
使用ping模块测试连通性
ansible web -m ping
方式2:
删除hosts文件中的用户密码配置
ssh-keygen
ssh-copy-id root@192.168.125.20
ssh-copy-id root@192.168.125.21
ssh-copy-id root@192.168.125.22