Ansible的安装及部署
1 实验环境
- Ansible是新出现的自动化运维工具,主要适用于一台主机同时控制多台主机,实现了批量系统配置、批量程序部署、批量运行命令等功能。需要注意的是ansible是基于模块工作的,本身没有批量部署的功能,真正具有批量部署的是ansible所运行的模块
- ansible的实验可以使用三台主机,可使真机作为ansible服务器,也就是作为主控机。再使用两台虚拟机作为被控机,三台主机之间是可以实现网络互通的。两台受控主机不需要做环境设定。
2 Ansible的安装
-
镜像文件是不提供ansible服务的,所以需要使用epel源安装该服务,可以使用阿里云的epel源或者官方提供的epel源。注意如果之前安装过阿里云的epel源而后删除了,那么再去重新安装时,就会出现提示安装包已经安装过,但是却仍然无法下载服务的情况,此时可以输入“rpm -qa | grep epel”命令找到epel的软件包,再输入“rpm -e 软件包”将软件包删除后再重新下载即可。
-
输入“dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y”命令安装官方提供的epel源:
-
输入“dnf install ansible.noarch -y”命令安装ansible服务:
-
输入“ansible --version”,命令可以查看ansible版本:
3 Ansible的基本信息
可以输入 “rpm -qc ansible”命令查看ansible的配置文件:
文件 | 含义 |
---|---|
/etc/ansible/ansible.cfg | 全局配置文件,默认情况很少修改 |
/etc/ansible/hosts | 全局清单文件 |
4 构建Ansible清单
清单就是ansible控制主机的列表
4.1 全局清单
编辑/etc/ansible/hosts全局清单文件,加入受控主机清单列表。可以直接书写受控主机名或ip,每行一个:
4.2 设定受控主机的组
可以将一些主机设定到一个组中,再查看所有列表、查看westos列表中的清单、查看linux列表中的清单:
4.2.1 清单查看
命令 | 含义 |
---|---|
ansible 清单中组名称 [-i 清单文件] - -list-hosts | 查看某个组列表中的清单,加上中括号的内容表示列出某个文件中的所有主机 |
ansible ungrouped - -list-hosts | 查看全局清单文件中,不属于任何组的主机 |
ansible all - -list-hosts | 查看全局清单文件中的全部主机列表 |
添加一个主机ip,不在任何组中,然后查看:
4.2.2 单层清单
注意,上面所写的组都是单层清单,也就是指不同的组之间有各自的主机列表:
4.2.3 嵌套清单
使用了嵌套清单后,嵌套清单里就会包含该嵌套清单中所有的单层清单里的主机。
5 主机规格的范围化操作
使用上面的方式添加主机都是手动单个的添加,但实际上如果主机数量较多而且有序,此时就可以采用范围化的方法将主机写入清单中。如下图所示,其中 [1:10],表示从1号到10号主机:
6 指定其他清单文件
1)在/mnt建立一个书写主机清单的文件:
此时查看清单,默认列的是全局清单文件中的主机清单:
可以输入“ansible -i /mnt/westos all --list-hosts”列出该清单文件中的所有主机:
2)在/mnt/westos自定义清单文件列表外加了一个主机:
查看清单中的主机:
使用“ansible -i /mnt/westos ungrouped --list-hosts”命令列出不再列表中的主机:
6.1 ansible命令指定清单的正则表达式
符号 | 含义 |
---|---|
* | 所有 |
: | 逻辑或 |
:& | 逻辑与 |
:! | 逻辑非 |
~ | 以关键字开头 |
~(str1 |str2) | 以条件1或条件2开头 |
1)查看以172.25.254开始的所有主机:
2)查看/mnt/westos文件中以node开始,以.westos.org结尾的所有主机:
3)查看/mnt/westos文件中以node开始或者名为westos.westos.org的主机:
4)查看/mnt/westos文件中以node开始或者以westos开始以westos.org的主机:
5)编辑/etc/ansible/hosts文件,将某个111主机分别年加入两个组中:
查看在westos组而且在linux组中的主机:
查看在westos组而且不在linux组中的主机:
6)编辑/mnt/westos文件,添加几个以westos开始的主机名:
查看以node关键字开头的主机:
查看以node或以c开头的主机,注意这里需要加单引号转译,否则会被识别为shell命令:
7 Ansible配置文件参数详解
- 使用方法:ansible 清单中组名称 -m 模块 -u remote_user。模块就相当于命令
- -k参数表示输入密码;-a参数表示shell的命令
- ansible运行方式:将命令转化成pythom语言,然后上传到被控主机,执行完后,再删除
- 注意:ansible控制主机时,使用的用户身份是什么 ,登陆被控主机时,默认使用的身份就是什么
7.1 配置文件的分类与优先级
配置文件 | 优先级 |
---|---|
/etc/ansible/ansible.cfg | 基本配置文件,找不到其他配置文件此文件生效 |
~/.ansible.cfg | 用户当前目录中没有ansible.cfg此文件生效 |
./ansible.cfg | 优先级最高 |
7.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_path= | 默认模块,默认使用command,可以修改为shell |
log_path= | 日志文件路径 |
– | – |
[privilege_escalation] | 身份信息设定 |
become= | 连接后是否自动切换用户 |
become_method= | 设定切换用户的方式,通常sudo |
become_user= | 在受控主机中切换到的用户,通常为root |
become_ask_pass= | 是否需要为become_method提示输入密码,默认为false |
1)编辑/etc/ansible/hosts 文件,里面是两个受控主机的ip:
2)输入“ansible westos --list”命令查看该组中的清单:
3)输入“ansible westos -m ping”,此处直接输入该命令,会红色报错,因为没有输入密码的步骤,所以是无法登陆的:
4)编辑/etc/ansible/ansible.cfg 主配置文件,在71行处取消注释,表示主控机登陆被控机时,不进行输入yes这个步骤:
5)输入“ansible westos -m ping -k”命令,-k参数表示输入密码,输入密码后可成功登陆被控主机且执行-m后面的模块。注意这里两台被控机的密码需要一致:
6)输入“ansible westos -m shell -a ‘hostname’ -k ”命令,-a参数表示shell要执行的命令,此时就可以把被控主机的主机名抓取出来:
7)输入“ansible westos -m shell -a ‘useradd test’ -k”命令,表示建立用户:
在被控主机上查看,用户建立成功:
8)输入“ansible westos -m shell -a ‘userdel test’ -k”命令,表示删除用户:
9)编辑/etc/ansible/ansible.cfg主配置文件,内容为inventory = /etc/ansible/hosts,/mnt/westos ,表示在指定清单路径处,再加一个路径:
此时使用“ansible all --list-hosts”命令产看清单,就不止去默认路径找,也会去指定的新路径下找:
10)切换到普通用户,执行“ansible westos -m shell -a “whoami” -k”命令,可以看到ansible控制主机时,使用的用户身份是什么 ,登陆被控主机时,默认使用的身份就是什么:
输入“ansible westos -m shell -a “whoami” -k -u root”命令,表示指定登陆的用户为root:
11)切换回root用户,编辑/etc/ansible/ansible.cfg 主配置文件,写入内容为remote_user =qjw,表示在受控主机上登陆的用户名称为指定使用当前用户:
输入“ansible westos -m shell -a ‘id’ -k”,表示指定登陆用户之后,查看id,发现当前asible主机是root用户,但是登陆被控主机时,使用的是qjw用户:
输入“ansible westos -m shell -a ‘useradd test’ -k”命令,表示此时已经设定了登陆用户为qjw,使用该普通用户身份去建立用户,权限被限制:
12)编辑/etc/ansible/ansible.cfg 主配置文件,写入内容如下,
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=Ture
表示,虽然登陆的是westos身份,但是可以执行sudo命令,也就是主控机登陆被控机使用的是被控机的普通用户,这样对被控机来说,安全性较高。但是主控机登陆后,想使用超级用户权限,就需要做上面所示改变,使得主控机有超级用户的所有权力:
此时输入“ansible westos -m shell -a ‘useradd test1’ -k”命令,依旧无法建立用户,因为没有在受控主机上做用户权力下放,输入visudo命令,在100行处输入以下内容:
输入“ansible westos -m shell -a ‘useradd test1’ -k”命令,此时虽然是普通用户登陆,但经过设定后,仍然可以建立用户:
在受控主机查看:
8 免密登陆以及构建用户级Ansible操作环境
8.1 免密登陆
1)输入“ssh-keygen”命令,在主控机里面获得密钥:
2)进入“.ssh/”目录,查看有公钥和私钥:
3)输入“ssh-copy-id -i id_rsa.pub qjw@172.25.254.136/236”命令,分别将密钥给两台受控主机的qjw用户:
4)在被控主机中做权力下放的免密登陆,直接输入visudo命令,然后在100行写入如下内容,将下面的“%wheel ALL=(ALL) ALL”行注释掉,因为qjw用户属于默认是属于wheel组的:
5)编辑主配置文件,将become_ask_pass=False改为False,表示不要需要输入权力转换时的密码;默认登陆用户仍然为qjw,不做更改:
6)测试,输入“ansible westos -m shell -a ‘id’ ”命令,直接免密,不需要任何密码:
8.2 用户级ansible环境设置
1)首先将配置文件恢复成之前的样子,做过的设定都注释掉。
2)进入家目录,建立一个.ansible目录,若目录存在则不用建立:
3)进入该目录,将配置文件复制到该目录下;再将主机清单复制到该目录下建立的inventory文件中:
4)编辑该目录下的配置文件内容如下,注意不要将参数写在[defaults]上面,否则无法识别会报错:
5)将该目录下的配置文件的module_name参数设定为shell,表示模块默认设定成shell,此时就不用再输入-m shell 了,因为默认就是shell模块;原始默认模块是command:
此时输入“ansible westos -a ‘hostname’”命令,免密且不需要写-m参数,因为默认是shell:
看完实验效果后,将该目录下的配置文件的module_name参数改回command模块。
注意:做完前面四个步骤后,用户级ansible环境设定就完成了。原来是root或westos用户或其他用户登陆都可以执行ansible命令,但可行使的权力不同。此时root做了该设定后,表示root用户可以使自己的ansible设定独立起来;同样的westos用户也可以做一些ansible设定使自己的ansible独立起来。总的来说用户级ansible环境设定主要是为了使ansible主机上的不同用户独立,实现不同的操作