ansible是一款自动化运维工具,易上手、不需要安装客户端、服务端等优点。
ansible是基于ssh协议运行的,也是一款开源工具,可以运用Python进行二次开发。
ansible目前(RHEL8)也是RHCE考试的重点内容。
Ansible服务专用术语对照表
术语 中文叫法 含义
Control node 控制节点 指的是安装了Ansible服务的主机,也被称为Ansible控制端,主要是用来发布
运行任务、调用功能模块,对其他主机进行批量控制。
Managed nodes 受控节点 指的是被Ansible服务所管理的主机,也被称为受控主机或客户端,是模块命令的被执行对象。
Inventory 主机清单 指的是受控节点的列表,可以是IP地址、主机名称或者域名。
Modules 模块 指的是上文提到的特定功能代码,默认自带有上千款功能模块,在Ansible
Galaxy有超多可供选择。
Task 任务 指的是Ansible客户端上面要被执行的操作。
Playbook 剧本 指的是通过YAML语言编写的可重复执行的任务列表,把常做的操作写入到剧本
文件中,下次可以直接重复执行一遍。
Roles 角色 从Ansible 1.2版本开始引入的新特性,用于结构化的组织Playbook,通过调
用角色实现一连串的功能。
总的来说。ansible的用法是使用一台作为控制节点(Control node)的服务器对主机清单(Inventory)中作为受控节点(Managed nodes)的客户机通过调用各种功能模块(Modules)或者用户编写的剧本(Playbook)或者调用角色(Roles)来完成单个或多个一连串的任务(Task)。
百闻不如一见,接下来就开始我们的实验吧。
1 在虚拟机设置中,将“网络适配器”的“网络连接”选项调整为“桥接模式”,进入系统后再设置为DHCP。
2 在原有软件仓库配置的下方,追加EPEL扩展软件包安装源的信息
vim /etc/yum.repos.d/rhel.repo
[EPEL]
name=EPEL
baseurl=https://dl.fedoraproject.org/pub/epel/8/Everything/x86_64/
enabled=1
gpgcheck=0
3 安装ansible
dnf install -y ansible
4 查看版本
ansible --version
5 部署五台主机作为受控节点
操作系统 IP地址 功能用途
RHEL 8 192.168.10.20 dev
RHEL 8 192.168.10.21 test
RHEL 8 192.168.10.22 prod
RHEL 8 192.168.10.23 prod
RHEL 8 192.168.10.24 balancers
登录账户:root 密码redhat
编辑主机清单
vim /etc/ansible/hosts
[dev]
192.168.10.20
[test]
192.168.10.21
[prod]
192.168.10.22
192.168.10.23
[balancers]
192.168.10.24
[all:vars]
ansible_user=root
ansible_password=redhat
查看主机清单
ansible-inventory --graph
@all:
|--@balancers:
| |--192.168.10.24
|--@dev:
| |--192.168.10.20
|--@prod:
| |--192.168.10.22
| |--192.168.10.23
|--@test:
| |--192.168.10.21
|--@ungrouped:
Ansible服务主配置文件优先级顺序
优先级 文件位置
高 ./ansible.cfg
中 ~/.ansible.cfg
低 /etc/ansible/ansible.cfg
编辑配置文件
将Ansible主配置文件中的第71行设置成默认不需要SSH协议的指纹验证,以及将第107行设置成默认执行剧本时所使用的管理员名称为root
vim /etc/ansible/ansible.cfg
71 host_key_checking = False
107 remote_user = root
将虚拟机网卡改回仅主机模式
重要命令 “ ansible-doc 模块名称 ” 查看模块用法,此命令在后续的剧本实验上,可以用来查询各个模块的示例。
ansibe-doc -l 列出所有的模块信息以供选择
Ansible服务常用模块名称及作用
模块名称 模块作用
ping 检查受管节点主机网络是否能够联通。
yum 安装、更新及卸载软件包。
yum_repository 管理主机的软件仓库配置文件。
template 复制模板文件到受管节点主机。
copy 新建、修改及复制文件。
user 创建、修改及删除用户。
group 创建、修改及删除用户组。
service 启动、关闭及查看服务状态。
get_url 从网络中下载文件。
file 设置文件权限及创建快捷方式。
cron 添加、修改及删除计划任务。
command 直接执行用户指定的命令。
shell 直接执行用户指定的命令(支持特殊字符)。
debug 输出调试或报错信息。
mount 挂载硬盘设备文件。
filesystem 格式化硬盘设备文件。
lineinfile 通过正则表达式修改文件内容。
setup 收集受管节点主机上的系统及变量信息。
firewalld 添加、修改及删除防火墙策略。
lvg 管理主机的物理卷及卷组设备。
lvol 管理主机的逻辑卷设备。
ansible命令语法格式为“ansible受管主机节点 -m模块名称[-a模块参数]”
ansible命令常用参数
参数 作用
-k 手动输入SSH协议密码
-i 指定主机清单文件
-m 指定要使用的模块名
-M 指定要使用的模块路径
-S 使用su命令
-T 设置SSH协议连接超时时间
-a 设置传递给模块的参数
--version 查看版本信息
-h 帮助信息
小试牛刀,检查一下受控主机的网络连通性
ansible all -m ping
小实验:配置受控主机的软件仓库
需求
新增软件仓库信息
仓库名称 EX294_BASE
仓库描述 EX294 base software
仓库地址 file:///media/cdrom/BaseOS
GPG签名 启用
GPG密钥文件 file:///media/cdrom/RPM-GPG-KEY-redhat-release
ansible all -m yum_repository -a 'name="EX294_BASE" description="EX294 base software" baseurl="file:///media/cdrom/BaseOS" gpgcheck=yes enabled=1 gpgkey="file:///media/cdrom/RPM-GPG-KEY-redhat-release"'
剧本就好像是批量化的脚本,采用YAML语言编写,具有强制性的格式规范
剧本文件的结构由4部分组成,分别是target、variable、task、handler
target:用于定义要执行剧本的主机范围。
variable:用于定义剧本执行时要用到的变量。
task:用于定义将在远程主机上执行的任务列表。
handler:用于定义执行完成后需要调用的后续任务。
小实验:安装软件包
需求:
编写一个剧本,要求在dev、test、prod组的主机下安装最新版本的mariadb,编写完成后执行
vim packages.yml
---
- name: 安装软件包
hosts: dev,test,prod
tasks:
- name: one
yum:
name: mariadb
state: latest
ansible-playbook packages.yml
Ansible服务的角色功能类似于编程中的封装技术—将具体的功能封装起来,用户不仅可以方便地调用它,而且甚至可以不用完全理解其中的原理。
安装系统角色
dnf install -y rhel-system-roles
查看可用角色
ansible-galaxy list
ansible系统角色描述
角色名称 作用
rhel-system-roles.kdump 配置kdump崩溃恢复服务
rhel-system-roles.network 配置网络接口
rhel-system-roles.selinux 配置SELinux策略及模式
rhel-system-roles.timesync 配置网络时间协议
rhel-system-roles.postfix 配置邮件传输服务
rhel-system-roles.firewall 配置防火墙服务
rhel-system-roles.tuned 配置系统调优选项
小实验:创建用于同步时间的剧本文件
可以把rhel-system-roles.timesync角色的剧本复制过来修改使用
cp /usr/share/doc/rhel-system-roles/timesync/example-timesync-playbook.yml timesync.yml
vim timesync.yml
---
- hosts: all
vars:
timesync_ntp_servers:
- hostname: pool.ntp.org
iburst: yes
roles:
- rhel-system-roles.timesync
Ansible Galaxy是Ansible的一个官方社区,用于共享角色和功能代码,用户可以在网站自由地共享和下载Ansible角色。该社区是管理和使用角色的不二之选。
Ansible Galaxy 官网首页:https://galaxy.ansible.com
小实验:安装nginx角色
进入Ansible Galaxy 官网,搜索到nginx角色,进入详情页,在Installation字段可以看到相应的安装方式。
ansible-galaxy install nginxinc.nginx
小实验:安装第三方网页上的角色
vim nginx.yml
---
- src: https://www.linuxprobe.com/Software/nginxinc-nginx_core-0.3.0.tar.gz
name: nginx-core
ansible-galaxy install -r nginx.yml
查看默认角色位置
vim /etc/ansible/ansible.cfg
68 #roles_path = /etc/ansible/roles
小实验:在默认角色目录下,创建apache的角色
需求
任务1:安装httpd网站服务。
任务2:运行httpd网站服务,并加入到开机启动项中。
任务3:配置防火墙,使其放行HTTP协议。
任务4:根据每台主机的变量值,生成不同的主页文件。
cd /etc/ansible/roles
ansible-galaxy init apache
cd apache
vim tasks/main.yml
---
- name: one
yum:
name: httpd
state: latest
- name: two
service:
name: httpd
state: started
enabled: yes
- name: three
firewalld:
service: http
permanent: yes
state: enabled
immediate: yes
- name: four
template:
src: index.html.j2
dest: /var/www/html/index.html
重要命令 ansible all -m setup -a 'filter="*需要查询的内容*"' ,用于查询魔法变量
查询 FQDN(Fully Qualified Domain Name,完全限定域名)
ansible all -m setup -a 'filter="*fqdn*"'
192.168.10.20 | SUCCESS => {
"ansible_facts": {
"ansible_fqdn": "linuxprobe.com",
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
查询 ip地址
ansible all -m setup -a 'filter="*ip*"'
192.168.10.20 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.10.20",
"192.168.122.1"
],
编辑主页文件
vim templates/index.html.j2
Welcome to {{ ansible_fqdn }} on {{ ansible_all_ipv4_addresses }}
编写一个用于调用apache角色的yml文件
cd ~
vim roles.yml
---
- name: 调用自建角色
hosts: all
roles:
- apache
运行剧本
ansible-playbook roles.yml
准备工作
首先在prod组的两台主机上分别添加一块硬盘设备,大小为20GB,类型为SCSI,其余选项选择默认值
小实验:创建剧本
需求:在所有受控主机上创建research卷组,大小150M,在research卷组上创建date逻辑卷,大小150M,并且格式化 ,文件系统为ext4,如果创建失败,则输出信息"Could not create logical volume of that size"
vim lv.yml
---
- name: 创建和使用逻辑卷
hosts: all
tasks:
- block:
- name: one
lvg:
vg: research
pvs: /dev/sdb
pesize: 150M
- name: two
lvol:
vg: research
lv: data
size: 150M
- name: three
filesystem:
fstype: ext4
dev: /dev/research/data
rescue:
- debug:
msg: "Could not create logical volume of that size"
执行剧本
ansible-playbook lv.yml
小实验:创建剧本
需求
若主机在dev分组中,则修改/etc/issue文件内容为Development;
若主机在test分组中,则修改/etc/issue文件内容为Test;
若主机在prod分组中,则修改/etc/issue文件内容为Production。
vim issue.yml
---
- name: 修改文件内容
hosts: all
tasks:
- name: one
copy:
content: 'Development'
dest: /etc/issue
when: "inventory_hostname in groups.dev"
- name: two
copy:
content: 'Test'
dest: /etc/issue
when: "inventory_hostname in groups.test"
- name: three
copy:
content: 'Production'
dest: /etc/issue
when: "inventory_hostname in groups.prod"
执行剧本
ansible-playbook issue.yml
小实验:创建剧本
需求:
请创建出一个名为/linuxprobe的新目录,所有者及所属组均为root管理员身份;
设置所有者和所属于组拥有对文件的完全控制权,而其他人则只有阅读和执行权限;
给予SGID特殊权限;
仅在dev主机组的主机上实施。
vim chmod.yml
---
- name: 管理文件属性
hosts: dev
tasks:
- name: one
file:
path: /linuxprobe
state: directory
owner: root
group: root
mode: '2775'
- name: two
file:
src: /linuxprobe
dest: /linuxcool
state: link
执行剧本
ansible-playbook chmod.yml
实验:加密文件内容
需求:
创建一个配置文件,使用密码对其加密
vim locker.yml
---
pw_developer: Imadev
pw_manager: Imamgr
创建保存密码的文件
vim /root/secret.txt
whenyouwishuponastar
修改权限
chmod 600 /root/secret.txt
修改主配置文件中的密码路径
vim /etc/ansible/ansible.cfg
140 vault_password_file = /root/secret.txt
ansible-vault encrypt locker.yml
查看下效果
cat locker.yml
$ANSIBLE_VAULT;1.1;AES256
38653234313839336138383931663837333533396161343730353530313038313631653439366335
3432346333346239386334663836643432353434373733310a306662303565633762313232663763
38366334316239376262656230643531656665376166663635656436363338626464333430343162
6664643035316133650a333331393538616130656136653630303239663561663237373733373638
62383234303061623865633466336636363961623039343236356336356361613736333739623961
6334303865663838623363333339396637363061626363383266
可以使用--ask-vault-pass参数进行修改密码
ansible-vault rekey --ask-vault-pass locker.yml
Vault password: 输入旧的密码
New Vault password: 输入新的密码
Confirm New Vault password: 再输入新的密码
Rekey successful
查看内容
ansible-vault view locker.yml
Vault password: 输入密码后敲击回车确认
修改内容
ansible-vault edit locker.yml