ansible的安装及简单配置
一、ansible的简介
1、ansible是新出现的自动化运维工具,完全基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
2、ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。
3、ansible的特点:
(1)部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
(2)默认使用SSH协议对设备进行管理;
(3)有大量常规运维操作模块,可实现日常绝大部分操作;
(4)配置简单、功能强大、扩展性强;
(5)支持API及自定义模块,可通过Python轻松扩展;
(6)通过Playbooks来定制强大的配置、状态管理;
(7)轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
(8)提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。
官方网站
https://www.ansible.com/
二、ansible的安装
1、下载epel仓库
(1)rhel8环境
yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
(2) rhel7.6环境
yum install wget -y
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
2、安装ansible
yum install ansible -y
查看版本及配置文件
ansible --version
rpm -qc ansible
/etc/ansible/ansible.cfg | 全局配置文件 |
/etc/ansible/hosts | 全局主机清单文件 |
3、全局测试
(1)指定远程主机
vim /etc/ansible/hosts
(2)列出远程主机
ansible all --list-hosts
(3)使用ping模块测试远程主机
-m
:使用模块,-k
:使用交互式输入ssh的密码
ansible 172.25.36.2 -m ping -k
- 使用root用户调用权限太大,所以一般用普通用户的身份操作远程主机
(4)在server2主机创建devops用户,并赋予密码,同时下放权力给devops用户
useradd devops
echo devops | passwd --stdin devops
visudo ##下放权力
(5)做ssh免密认证,将公钥发送给远程主机的devops用户
ssh-keygen
ssh-copy-id devops@172.25.36.2
(6)使用远程主机的devops用户执行一些命令
-a
:指定模块参数,--become
参数,表示使用sudo执行命令,-u
:指定用户
ansible 172.25.36.2 -a "touch /mnt/testfile" -u devops --become
4、ansible的命令参数
- anisble命令语法: ansible [-i 主机文件] [-f 批次] [组名] [-m 模块名称] [-a 模块参数]
参数 | 功能 |
---|---|
-i | 指定hosts文件路径,默认在/etc/ansible/hosts |
-m | 指定使用的module名称,默认command模块 |
-a | 指定模块参数 |
-k(小写) | 提示输入ssh密码,并非基于ssh密钥认证 |
-K(大写) | 提示输入sudo密码 |
-b | 使用sudo执行命令 |
-become-user= | 指定sudo的用户 |
-f,-forks=NUM | NUM默认是整数5,指定fork开启同步进程的个数 |
-u | 指定远程主机的执行用户 |
-v | 详细模式,如果执行成功,输出详细结果,-vv -vvv 更详细过程 |
-C | 预执行检测 |
-T | 执行命令的超时时间,默认10s |
--list | 显示主机列表,也可以用--list-hosts |
--version | 显示版本 |
三、ansible配置清单
1、构建清单
cd /etc/ansible/
vim skk
ansible all -i skk --list-hosts ##查看skk清单中的主机
ansible ungrouped -i skk --list-hosts ##查看skk清单中未定义组的主机
ansible test -i skk --list-hosts ##查看skk清单中组为test的主机
2、嵌套清单
[westos:children]
3、主机规格的范围化操作
[start:end]
4、指定清单的正则表达式
* | 所有 |
: | 逻辑或 |
:& | 逻辑与 |
:! | 逻辑非 |
~ | 以关键字开头 |
~(str1|str2) | 以条件1或条件2开头 |
vim inventory
ansible '172.*' -i inventory --list
ansible 'westos_list1:westos_list2' -i inventory --list
ansible 'westos_list2:&westos_list3' -i inventory --list
ansible 'westos_list2:!westos_list3' -i inventory --list
ansible '~westos' -i inventory --list
四、ansible配置文件
1、分类与优先级
/etc/ansible/ansible.cfg | 基本配置文件,找不到其他配置文件此文件生效 |
~/.ansible.cfg | 用户当前目录中没有ansible.cfg此文件生效 |
./ansible.cfg | 优先级最高 |
2、常用配置参数
[default] | 基本配置信息 |
---|---|
inventory= | 指定清单路径 |
remote_user= | 在远程主机上登陆的用户名称,未指定使用当前用户 |
ask_pass= | 是否提示输入SSH密码,如果公钥登陆设定为false |
library= | 库文件存放目录 |
local_tmp= | 本机临时命令执行目录 |
remote_tmp= | 远程主机临时py命令文件存放目录 |
forks= | 默认并发数量 |
host_key_checking= | 第一次连接远程主机时是否要输入yes建立host_key |
sudo_user= | 默认sudo用户 |
ask_sudo_pass= | 每次在远程主机执行ansible命令时是否询问sudo密码 |
module_name= | 默认模块,默认使用command,可以修改为shell |
log_path= | 日志文件路径 |
[privilege_escalation] | 身份信息设定 |
---|---|
become= | 连接后是否自动切换用户 |
become_method= | 设定切换用户的方式,通常用sudo |
become_user= | 在远程主机中切换到的用户,通常为root |
become_ask_pass | 是否需要为become_method提示输入密码,默认为false |
(1)修改清单路径
vim /etc/ansible/ansible.cfg
14 inventory = /etc/ansible/hosts,/etc/ansible/westos
(2)python储存文件
remote_tmp
和local_tmp
是远端的本地临时文件路径;当执行ansible命令后,主机生成py临时脚本,通过ssh发送到远程主机,远程主机执行完删除该临时文件,主机也会删除临时文件。
vim /etc/ansible/ansible.cfg
17 remote_tmp = ~/.ansible/tmp
18 local_tmp = ~/.ansible/tmp
执行远程主机等待60秒的命令,监控两边是否有临时文件产生
ansible 172.25.36.2 -m shell -a 'sleep 60' -u devops -b
watch -n 1 ls -l ~/.ansible/tmp/
ls ~/ansible/tmp
等待60秒后,生成的两个临时文件自动消失
(3)默认执行become模块
执行命令时,连接远程主机的用户为devops,在远程主机中操作指令时转换用户身份,并用sudo调用为root用户,执行sudo调用命令时不提示输入密码。
vim /etc/ansible/ansible.cfg
107 remote_user = devops
339 become=True
340 become_method=sudo
341 become_user=root
342 become_ask_pass=False
不需要加-b
和-K
ansible 172.25.36.2 -m shell -a 'hostname' -v
五、不同用户的配置设定
- ansible只有一个主配置文件,不同用户的配置不同时,需要把配置独立出来,一个用户一个配置文件。需要该用户创建配置目录及配置文件,只有在配置目录时,才会优先读取该用户的配置文件。
1、创建skk用户及其配置目录
useradd skk
passwd skk
su - skk
mkdir /home/skk/ansible
2、编辑配置文件
su - skk
vim /home/skk/ansible/ansible.cfg
[defaults]
inventory = ~/ansible/inventory
host_key_checking = False
ask_pass = False
remote_user = devops
module_name = shell
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
3、编写配置清单
vim /home/skk/ansible/inventory
[demo]
172.25.36.2
4、用ansible主机的root用户将自己的私钥给skk用户发送一份,保证可以连接到远程主机的devops用户
公钥在前面做全局测试时已经发送给远程主机的devops用户
scp ~/.ssh/id_rsa skk@172.25.36.1:~/.ssh/
5、切换到skk用户,用ping模块测试
su - skk
cd ansible/
ansible demo -m ping -v