Linux自动化运维工程师
实验所用系统为Redhat
目录
- Linux自动化运维工程师--Ansible的安装及部署
- 一、Ansible是什么
- 二、Ansible的安装
- 三、Ansible的执行
- 四、环境配置
- 五、构建Anisble清单
- 1、直接书写受管主机名或ip,每行一个
- 2、设定受管主机的组[组名称]
- 3、主机规格的范围化操作
- 4、ansible命令指定清单的正则表达式
- 六、Ansible配置文件参数详解
- 1、配置文件的分类与优先级
- 2、常用配置参数
- 七、构建用户级Ansible操作环境
Linux自动化运维工程师–Ansible的安装及部署
实验环境:
westosa–主控机,IP(172.25.254.114),网络软件仓库配置完成
westosb–受控机,IP(172.25.254.214),网络软件仓库配置完成
一、Ansible是什么
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。
二、Ansible的安装
在控制主机westosa下载ansible
。
但是anisble
在 CentOS 8 和 RHEL 8 的默认软件包仓库中是没有的,需要安装EPEL rpm 包,搭建epel 仓库。
EPEL的全称叫 Extra Packages for Enterprise Linux 。EPEL是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。装上了 EPEL之后,就相当于添加了一个第三方源。
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm /mnt ##下载epel源
yumdoenloader ansible --destdir=/mnt --resolve ##安装ansible
dnf install sshpass-1.06-9.el8.x86_64.rpm -y ##下载依赖性
dnf install ansible-2.9.11-1.el8.noarch.rpm -y
ansible --version
ansible的基本信息:
/etc/ansible/ansible.conf ##全局配置文件,默认很少修改
/etc/ansible/hosts ##全局主机清单清单文件
三、Ansible的执行
Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhoc
和playbook
:
- ad-hoc模式(点对点模式)
使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。 - playbook模式(剧本模式)
是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。
四、环境配置
首先连接受控主机,但此时被拒绝,因为主控主机没有可以控管的主机。
ansible 172.25.254.214 -m ping
列出所有受控主机查看,此时没有214主机。
ansible all --list-hosts
编辑全局主机清单文件,写入214主机,表示受控主机为214主机。
vim /etc/ansible/hosts
///
172.25.254.214 ##直接在最后一行添加
///
此时重新连接214主机,但依旧会被拒绝。因为当要控制214主机时首先会在主控主机中生成py脚本,然后远程通过sshd服务传输到被控主机中在传文件过程中需要后者的认证通过。
ansible 172.25.254.214 -m ping
当执行ansible时询问密码,输入密码可以执行成功,表示和214主机可以实现ansible的管理。
ansible 172.25.254.214 -m ping -k
那么此时就对受控主机sshd服务进行设定,使得认证可以通过。通过新建一个普通用户,让ansible主机控制受控主机,并且对其设定密码。否则会在加密时被拒绝。
###受控主机westosb
useradd devops ##在被控主机westosb中新建一个普通用户,让ansivle用该用户控制本机
echo westos | passwd --stdin devops ##设定密码,不然主控机对其进行加密时会因权限不足被拒绝
在主控机westosa对受控主机的用户进行加密。此时可以连接到受控主机的指定用户,通过此用户在受控主机新建文件时被拒绝,是因为该用户为普通用户,并不具备新建文件的权力,需要对其进行权力下放。
###主控机westosa
ssh-keygen
##生成密钥,直接回车
ssh-copy-id -i /root/.ssh/id_rsa.pub devops@172.25.254.214
##用key对指定devops用户加密
ansible 172.25.254.214 -m ping -u devops
##登录到指定用户
ansible 172.25.254.214 -m shell -a 'touch /mnt/westosfile' -u devops
##但因为普通用户,权限很小,所以并不能执行成功,需要对其进行权力下放
在受控主机对该用户进行权力下放。
visudo
///
101 devops ALL=(ALL) ALL
///
此时在主控机上通过该用户新建文件是可以成功的,但如果每次执行命令都需要输入sudo密码,是十分麻烦的。
ansible 172.25.254.214 -m shell -a 'touch /mnt/westosfile' -u devops --become -K
##--become 指定devops在执行命令时用sudo调用 -K 询问sudo密码
需要在受控主机westosb中进行权力下放时设定免密登录。
###被控主机westosb
visudo
///
101 devops ALL=(ALL) NOPASSWD:ALL
///
此时在主控机westosa中通过指定用户新建文件可以成功,并且并不需要输入密码。至此,环境配置完成。
###主控机westosa
ansible 172.25.254.214 -m shell -a 'touch /mnt/westosfile' -u devops --become
五、构建Anisble清单
清单就是ansible控制主机的列表。
/etc/ansible/hosts ##全局清单文件
1、直接书写受管主机名或ip,每行一个
node1.westos.com
node2.westos.com
172.25.254.240
2、设定受管主机的组[组名称]
- 清单查看
ansible 清单中组名称 [-i 清单文件] --list-hosts ##列出指定清单文件的受控主机
ansible ungrouped --list-hosts ##列出未在任何组中的主机
ansible all --list-hosts ##列出所有可以控管的主机
- 单层清单
[list1]
node1.westos.com
node2.westos.com
[list2]
node2.westos.com
[list3]
172.25.254.240
- 嵌套清单
[westos:children]
list1
list3
实验:
- 单层清单
cd /etc/ansible
ls
vim westos ##指定一个清单文件
///172.25.254.11
ansible all --list
ansible all -i westos --list ##-i 查看指定清单
ansible ungrouped --list-hosts ##列出未在任何组中的主机
vim /etc/ansible/hosts ##全局清单文件
///
[westos1] ##指定组的名称
172.25.254.214
[westos2]
172.25.254.114
///
ansible westos1 --list ##列出指定组中的主机
ansible westos2 --list
- 嵌套清单
vim /etc/ansible/hosts
///
[westos:children] ##嵌套清单,westos清单中有westos1和westos2两个子清单
westos1
westos2
///
ansible westos --list ##列出清单中的主机,包括1和2
[注意] :children为嵌套清单的命名格式,该清单名称为westos。
3、主机规格的范围化操作
通过指定主机名称或IP的范围可以简化Ansible主机清单
语法:
#[start:end]
[westostest]
172.25.254.[100:108]
- 多台主机
vim /etc/ansible/hosts
///
[westos2]
172.25.254.[90:100] ##多台主机
///
ansible westos2 --list
4、ansible命令指定清单的正则表达式
* ##所有
##172.25.254.*
: ##逻辑或
##westos1:linux
:& ##逻辑与
##westos1:&linux
##主机即在westos1清单也在linux清单中
:! ##逻辑非
##westos1:!linux
##在westos1中不在linux中
~ ##以关键字开头
实验:
- *—>所有
vim /etc/ansible/hosts
///
[192]
172.25.254.200
172.25.254.89
///
ansible "192*" --list ##清单中所有以192开头的清单或者清单中的主机
先编辑清单文件,加入192的ip。
- :—>或
ansible "192*:172*" --list ##带有172或者192
- :&—>与
vim /etc/ansible/hosts
///
[westos1]
172.25.254.[90:100]
192.168.0.1
[westos2]
172.25.254.92
westoslinux.westos.org
[westos:children]
westos1
westos2
///
ansible "westos1:&westos2" --list ##在1也在2
- :!—>非
ansible "westos1:!westos2" --list ##在1不在2
- ~—>以关键字开头
ansible '~(172|192)' --list ##以172或者192开头,注意弱引用与强引用
六、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
七、构建用户级Ansible操作环境
因为默认配置文件中指定用户的数量只能为1,因此需要将每个用户的配置独立设定。此时建立一个用户yun
,并设定密码。建立ansible运行时该用户使用的目录/home/yun/ansible
,进入该目录,并生成配置文件。设定该目录的所属人和所属组都为yun用户。
###westosa
useradd yun
mkdir -p /home/yun/ansible
chown yun.yun /home/yun/ansible
该配置文件基本信息需要指定清单路径,设定连接受管主机时不需要输入yes建立host_key,设定公钥登陆,即不提示输入SSH密码,设定在受管主机上登陆的用户名称为devops(此处是在环境配置时设定ansible主机通过该用户控制受控主机),设定默认模块为shell。
同时需要进行身份信息设定。
vim ansible.cfg
///
[defaults]
inventory =~/ansible/inventory ##指定清单路径
host_key_checking =False ##设定连接受管主机时不需要输入yes建立host_key
ask_pass =False ##设定公钥登陆,即不提示输入SSH密码
#roles_path = ##之后会用到,此处先注释
remote_user =devops ##设定在受管主机上登陆的用户名称为devops(此处是在环境配置时设定ansible主机通过该用户控制受控主机)
module_name =shell ##设定默认模块为shell
[privilege_escalation] ##身份信息设定
become=True
become_method=sudo
become_user=root
become_sak_pass=False
///
编辑清单文件,指定受控主机。
vim inventory
///
[westos]
172.25.254.114
172.25.254.214
///
但此时westosa主机(172.25.254.114)中并不存在devops用户,因此在root用户下建立该用户并设定密码,对其进行权力下放。
useradd devops
echo westos | passwd --stdin devops
visudo ##两台主机都需要做devops用户的权力下放
///
101 devops ALL=(ALL) NOPASSWD:ALL
///
对ssh进行加密。两台主机都要做密钥,此处是因为最开始环境配置的时候已经对214主机做过密钥加密。
ssh-copy-id -i /root/.ssh/id_rsa.pub devops@172.25.254.114 ##用key对指定devops用户加密
切换到yun用户,切入ansible目录,将root用户下的key复制到当前目录。
su - yun
cd /home/yun/ansible
scp root@172.25.254.114:/root/.ssh/id_rsa /home/yun/.ssh/id_rsa
此时便可以连接到两台主机。yun用户可以免密登录114主机和214主机的devops用户。
ansible westos2 -m ping
至此用户级环境配置完成。