ansible基础
[toc]
ansible
- 批量管理服务器的工具
- 2015年被红帽公司收购
- 使用Python语言编写的
- 基于ssh进行管理,所以不需要在被管端安装任何软件
- ansible在管理远程主机的时候,主要是通过各种模块进行操作的
环境准备
主机名 |
IP地址 |
角色 |
node1 |
192.168.88.11 |
被控制节点(test) |
node2 |
192.168.88.12 |
被控制节点(proxy) |
node3 |
192.168.88.13 |
被控制节点(web1) |
node4 |
192.168.88.14 |
被控制节点(web2) |
node5 |
192.168.88.15 |
被控制节点(database) |
control |
192.168.88.253 |
控制节点(manager) |
- 6台主机,需要配置主机名、IP地址、YUM。关闭SELINUX和防火墙
- control节点要求:
- 配置名称解析,能够通过名字访问所有节点
- 配置可以通过ssh到所有节点免密登陆
- 拷贝
/linux-soft/2/ansible_soft.tar.gz
到control,并解压安装
配置ansible管理环境
- 因为要管理的远程主机可能不一样。所以具有相同管理方式的配置放到一个目录下。
ansible管理
- ansible进行远程管理的两个方法:
- adhoc临时命令。就是在命令行上执行管理命令。
- playbook剧本。把管理任务用特定格式写到文件中。
- 无论哪种方式,都是通过模块加参数进行管理。
adhoc临时命令
- 语法:
- 测试到远程主机的连通性
ansible模块
- 模块基本信息查看
- 学习模块,主要知道实现某种功能,需要哪个模块。
- 模块的使用方式都一样。主要是查看该模块有哪些参数。
command模块
- ansible默认模块,用于在远程主机上执行任意命令
- command不支持shell特性,如管道、重定向。
shell模块
- 与command模块类似,但是支持shell特性,如管道、重定向。
script模块
- 用于在远程主机上执行脚本
file模块
- 可以创建文件、目录、链接等,还可以修改权限、属性等
- 常用的选项:
- path:指定文件路径
- owner:设置文件所有者
- group:设置文件所属组
- state:状态。touch表示创建文件,directory表示创建目录,link表示创建软链接,absent表示删除
- mode:设置权限
- src:source的简写,源
- dest:destination的简写,目标
copy模块
- 用于将文件从控制端拷贝到被控端
- 常用选项:
- src:源。控制端的文件路径
- dest:目标。被控制端的文件路径
- content:内容。需要写到文件中的内容
fetch模块
- 与copy模块相反,copy是上传,fetch是下载
- 常用选项:
- src:源。被控制端的文件路径
- dest:目标。控制端的文件路径
lineinfile模块
- 用于确保存目标文件中有某一行内容
- 常用选项:
- path:待修改的文件路径
- line:写入文件的一行内容
- regexp:正则表达式,用于查找文件中的内容
replace模块
- lineinfile会替换一行,replace可以替换关键词
- 常用选项:
- path:待修改的文件路径
- replace:将正则表达式查到的内容,替换成replace的内容
- regexp:正则表达式,用于查找文件中的内容
文件操作综合练习
- 所有操作均对test组中的主机生效
- 在目标主机上创建/tmp/mydemo目录,属主和属组都是adm,权限为0777
- 将控制端的/etc/hosts文件上传到目标主机的/tmp/mydemo目录中,属主和属组都是adm,权限为0600
- 替换目标主机/tmp/mydemo/hosts文件中的node5为server5
- 将目标主机/tmp/mydemo/hosts文件下载到控制端的当前目录
user模块
- 实现linux用户管理
- 常用选项:
- name:待创建的用户名
- uid:用户ID
- group:设置主组
- groups:设置附加组
- home:设置家目录
- password:设置用户密码
- state:状态。present表示创建,它是默认选项。absent表示删除
- remove:删除家目录、邮箱等。值为yes或true都可以。
group模块
- 创建、删除组
- 常用选项:
- name:待创建的组名
- gid:组的ID号
- state:present表示创建,它是默认选项。absent表示删除
ansible模块
yum_repository
- 用于配置yum
- 常用选项:
- file: 指定文件名
- 其他选项,请与文件内容对照
yum模块
- 用于rpm软件包管理,如安装、升级、卸载
- 常用选项:
- name:包名
- state:状态。present表示安装,如果已安装则忽略;latest表示安装或升级到最新版本;absent表示卸载。
service模块
- 用于控制服务。启动、关闭、重启、开机自启。
- 常用选项:
- name:控制的服务名
- state:started表示启动;stopped表示关闭;restarted表示重启
- enabled:yes表示设置开机自启;no表示设置开机不要自启。
逻辑卷相关模块
- 逻辑卷可以动态管理存储空间。可以对逻辑卷进行扩容或缩减。
- 可以把硬盘或分区转换成物理卷PV;再把1到多个PV组合成卷组VG;然后在VG上划分逻辑卷LV。LV可以像普通分区一样,进行格式化、挂载。
- 关闭虚拟机node1,为其添加2块20GB的硬盘
- LINUX下KVM虚拟机新加的硬盘,名称是
/dev/vdb
和/dev/vdc
- vmware虚拟机新加的硬盘,名称是
/dev/sdb
和/dev/sdc
- 如果选nvme硬盘,名称可能是
/dev/nvme0n1
和/dev/nvme0n2
lvg模块
- 创建、删除卷组,修改卷组大小
- 常用选项:
- vg:定义卷组名。vg:volume group
- pvs:由哪些物理卷构成。pvs:physical volumes
lvol模块
- 创建、删除逻辑卷,修改逻辑卷大小
- 常用选项:
- vg:指定在哪个卷组上创建逻辑卷
- lv:创建的逻辑卷名。lv:logical volume
- size:逻辑卷的大小,不写单位,以M为单位
filesystem模块
- 用于格式化,也就是创建文件系统
- 常用选项:
- fstype:指定文件系统类型
- dev:指定要格式化的设备,可以是分区,可以是逻辑卷
mount模块
- 用于挂载文件系统
- 常用选项:
- path:挂载点。如果挂载点不存在,自动创建。
- src:待挂载的设备
- fstype:文件系统类型
- state:mounted,表示永久挂载
Playbook剧本
- 常用于复杂任务的管理,以及管理经常要完成的任务
- playbook也是通过模块和它的参数,在特定主机上执行任务
- playbook是一个文件,该文件中需要通过yaml格式进行书写
YAML
- YAML Ain't a Markup Language:YAML不是一个标记语言
yaml语法规范
- yaml文件的文件名,一般以yml或yaml作为扩展名
- 文件一般以
---
作为第一行,不是必须的,但是常用 - 键值对使用冒号
:
表示,冒号后面必须有空格。 - 数组使用
-
表示,-
后面必须有空格。 - 相同的层级必须有相同的缩进。如果缩进不对,则有语法错误。每一级缩进,建议2个空格。
- 全文不能使用tab,必须使用空格。
配置vim适应yaml语法
编写playbook
- 一个剧本(即playbook),可以包含多个play
- 每个play用于在指定的主机上,通过模块和参数执行相应的任务
- 每个play可以包含多个任务。
- 任务有模块和参数构成。
-
|
和>
的区别:|
它保留换行符,>
把多行合并为一行
- playbook示例
硬盘管理
- 常用的分区表类型有:MBR(主引导记录)、GPT(GUID分区表)
- MBR最多支持4个主分区,或3个主分区加1个扩展分区。最大支持2.2TB左右的硬盘
- GPT最多支持128个主分区。支持大硬盘
parted模块
- 用于硬盘分区管理
- 常用选项:
- device:待分区的设备
- number:分区编号
- state:present表示创建,absent表示删除
- part_start:分区的起始位置,不写表示从开头
- part_end:表示分区的结束位置,不写表示到结尾
playbook
模块
ansible变量
facts变量
- facts翻译过来就是事实。
- facts变量是ansible自带的预定义变量,用于描述被控端软硬件信息。
- facts变量通过setup模块获得。
- facts变量是一个大的由
{}
构成的键值对字典。在{}
中,有很多层级的嵌套。可以通过参数过滤出第一个层级的内容。
- 常用的facts变量
- ansible_all_ipv4_addresses:所有的IPV4地址
- ansible_bios_version:BIOS版本信息
- ansible_memtotal_mb:总内存大小
- ansible_hostname:主机名
- 在playbook中使用变量
自定义变量
- 引入变量,可以方便Playbook重用。比如装包的playbook,包名使用变量。多次执行playbook,只要改变变量名即可,不用编写新的playbook。
- ansible支持10种以上的变量定义方式。常用的变量来源如下:
- inventory变量。变量来自于主机清单文件
- facts变量。
- playbook变量。变量在playbook中定义。
- 变量文件。专门创建用于保存变量的文件。推荐变量写入单独的文件。
补充模块
firewalld模块
- 用于配置防火墙的模块
- 常用选项:
- port:声明端口
- permanent:永久生效,但不会立即生效
- immediate:立即生效,临时生效
- state:enabled,放行;disabled拒绝
- 防火墙一般默认拒绝,明确写入允许的服务。
- 有一些服务有名字,有些服务没有名字。但是最终都是基于TCP或UDP的某些端口。比如http服务基于TCP80端口。服务名和端口号对应关系的说明文件是:
/etc/services
- 配置服务器的防火墙,一般来说只要配置开放哪些服务或端口即可。没有明确开放的,都默认拒绝。
- 应用
- 在test组中的主机上安装并启动httpd
- 客户端访问服务器的http服务
- 在test组中的主机上安装并启动firewalld
- 客户端访问服务器的http服务
- 在test组中的主机上开放http服务
template模块
- copy模块可以上传文件,但是文件内容固定
- template模块可以上传具有特定格式的文件(如文件中包含变量)
- 当远程主机接收到文件之后,文件中的变量将会变成具体的值
- template模块上传的文件,使用的语法叫Jinja2。
- 常用选项:
- src:要上传的文件
- dest:目标文件路径
进阶语法
错误处理
- 当Playbook中包含很多任务时,当某一个任务遇到错误,它将崩溃,终止执行
- 可以指定某一个任务如果出现错误,则忽略它
- 通过全局设置,无论哪个任务出现问题,都要忽略
触发执行任务
- 通过handlers定义触发执行的任务
- handlers中定义的任务,不是一定会执行的
- 在tasks中定义的任务,通过notify关键通知handlers中的哪个任务要执行
- 只有tasks中的任务状态是changed才会进行通知。
when条件
- 只有满足某一条件时,才执行任务
- 常用的操作符:
- ==:相等
- !=:不等
-
>
:大于 -
<
:小于 -
<=
:小于等于 -
>=
:大于等于
- 多个条件或以使用and或or进行连接
- when表达式中的变量,可以不使用
{{}}
cowsay:
[root@node1 ~]# yum install -y cowsay-3.04-4.el7.noarch.rpm [root@node1 ~]# cowsay hello world # 默认是奶牛形象 [root@node1 ~]# cowsay -l # 查看可用形象 [root@node1 ~]# cowsay -f sheep hello world [root@node1 ~]# cowsay -l > ss.txt [root@node1 ~]# vim ss.txt # 删除第1行的说明 [root@node1 ~]# for i in $(cat ss.txt) > do > echo "--------------$i----------------" > cowsay -f $i hello > sleep 3 > echo "--------------------------------" > done
任务块
- 可以通过block关键字,将多个任务组合到一起
- 可以将整个block任务组,一起控制是否要执行
rescue和always
- block和rescue、always联合使用:
- block中的任务都成功,rescue中的任务不执行
- block中的任务出现失败(failed),rescue中的任务执行
- block中的任务不管怎么样,always中的任务总是执行
loop循环
- 相当于shell中for循环
- ansible中循环用到的变量名是固定的,叫item
role角色
- 为了实现playbook重用,可以使用role角色
- 角色role相当于把任务打散,放到不同的目录中
- 再把一些固定的值,如用户名、软件包、服务等,用变量来表示
- role角色定义好之后,可以在其他playbook中直接调用
- ansible的公共角色仓库:https://galaxy.ansible.com/
role练习
- 创建名为pkgs的角色。用于装包。包名使用变量pkg代表
- 创建inst_http.yml,调用pkgs角色,安装httpd
- 创建inst_php.yml,调用pkgs角色,安装php
ansible加解密文件
- ansible加解密文件使用ansible-vault命令
sudo命令
- 一般用于普通用户执行需要root权限的命令
- 在node1上配置zhangsan拥有sudo权限
特殊的主机清单变量
- 如果远程主机没有使用免密登陆,如果远程主机ssh不是标准的22端口,可以设置特殊的主机清单变量
-
ansible_ssh_user
:指定登陆远程主机的用户名 -
ansible_ssh_pass
:指定登陆远程主机的密码 -
ansible_ssh_port
:指定登陆远程主机的端口号