ansible
【背景】
ansible首次发布于2012年,作者Michael DeHaan
Michael DeHaan也是Cobbler的作者
于2015年被RedHat收购
Ansible是一款自动化运维工具,基于Python开发(控制端需要有python环境)
批量系统部署、程序部署、运行命令等功能【特色】
1.基于ssh做远程管理,被控制端必须开启ssh服务
2.模块丰富
3.社区活跃
4.支持自定义模块
5.支持异构IT架构
6.部署简单,容易上手【下载】
dnf -y install ansible-core ansible-navigator
ansible-core 主程序包
ansible-navigator 9版本,可以调用容器中模块的包【配置】
主配置文件:/etc/ansible/ansible.cfg
Ansible配置文件查找顺序:
首先检测ANSIBLE_CONFIG变量定义的配置文件
其次检查当前目录下的ansible.cfg文件
再次检查当前用户家目录下的.ansible.cfg文件
最后检查/etc/ansible/ansible.cfg文件
/etc/ansible/ansible.cfg里可参考,执行ansible-config init –disabled > /tmp/ansible.cfg可看到真实配置## 写配置
mkdir ansible;cd ansible;vim ansible.cfg
# 加空格只是为了美观
[defaults]
inventory = ./jadehosts # ˈɪnvəntɔːri (建筑物里的物品、家具等的)清单;指定主机清单
remote_user = jade # 指定用户,不写默认root
[privilege_escalation] # 权限相关配置
become=True # 是否需要切换用户
become_method=sudo # 以什么样的形式切换
become_user=root # 切换成什么用户
become_ask_pass=False # 切换时是否需要输入密码
vim ./jadehosts // 配置主机ip或域名
[test]
node1
[webserver]
node[3:4]
[test2]
node2
[qiantaozu:children]
test
webserver# 检查配置是否正确,查看所有主机列表
ansible all --list-hosts
ansible node1,qiantaozu -m ping
# ansible执行结果颜色区分:红色(报错);绿色(成功);黄色(执行发生改变了)
## 配置机器免密
#生成秘钥、传公钥给受管主机
ssh-keygen -f /root/.ssh/id_rsa -N ' '
ls /root/.ssh/
#传输命令之一ssh-copy-id 主机
for i in node{1..5} ;do ssh-copy-id $i;done
#检查是否免密
ansible node1 -m ping
# 虽说模块名是ping,但不走icmp协议的策略,和平时的ping不一样,这里的ping只检测能否ssh、有无python环境,都ok返回success
【ansible ad-hoc命令行】
ansible ad-hoc是一种通过命令行批量管理的方式,适合执行一些临时性简单任务
语法格式:ansible 主机集合 -m 模块名 -a “参数” (不指定-m,默认command)
默认模块为【command】:把linux操作系统中所有可执行的命令,传递给被管理主机,直接执行命令
ansible node1 -m command -a “uptime”
查看模块帮助
ansible-doc command
ansible-doc -l | wc -l # 统计有多少个模块
【常用模块】
shell模块
与command模块区别:
command模块不支持bash特性,如管道和重定向等功能
所有需要调用shell的功能都无法使用
shell模块会启动shell执行命令,不可以使用shell模块执行交互命令,如vim、top等
ansible node1 -m command -a 'ps &' # ps放到后台,报错 |
script模块
script允许在本地写脚本,拷贝到被管理端并执行脚本
可以是shell、python、perl脚本,可以没有-x
vim test.sh |
file模块
可以创建文件、目录、链接;修改权限与属性等
幂等性:任意次执行所产生的影响均与一次执行的影响相同
# 新建文件 |
copy模块
将文件拷贝到远程主机
backup=yes如果目标主机有同名文件,先备份
幂等性
# 新建测试文件 |
fetch模块
与copy作用相反,将其他主机的文件拷贝到本地
# 将远程主机的hostname文件下载到本地家目录(避免多个主机同名文件,fetch会在拷贝时新增对应主机名的目录) |
lineinfile|replace模块
幂等性
## 在修改单个文件的单行内容时可以使用lineinfile模块 |
user模块
# 远程test组中所有主机,并创建系统用户tuser1,state不写默认是present(创建) |
group模块
# 创建stugp组,state不写默认present |
yum_repository模块
可以创建、修改yum源配置文件
# 新建一个yum源配置文件/etc/yum.repos.d/myyum.repo |
yum模块
安装卸载升级软件包
state:present(安装) absent(卸载) latest(升级) |
service模块
服务管理模块,启动、关闭、重启服务等
state:started(开启) stopped(停止) restarted(重启)
enabled=yes(开机自启)
# 开启服务 |
分区、逻辑卷相关模块
state:present(创建) absent(删除)
【part】模块:对硬盘分区
# 安装新collection,可以使用parted等模块 |
【filesystem】模块:用于格式化(创建文件系统)
fstype 指定文件系统类型
dev 指定要格式化的设备,可以是分区、逻辑卷
# 格式化为ext4文件系统类型 |
【mount】模块:用于挂载文件系统
path 挂载点,若挂载点不存在,自动创建
src 待挂载的设备
fstype 文件系统类型
state=mounted 永久挂载
# 装包,9以上ansible基础包不包含mount,需下载额外的包(/var/www/html就是访问ip对应的物理路径) |
【lvg】模块:创建、删除卷组(vg)、修改卷组大小
# 先建个分区 |
【lvol】模块:创建、删除逻辑卷(lv)、修改逻辑卷大小
# 创建逻辑卷,名为mylv,大小50M(从上边创建的myvg卷组中) |
firewalld模块
state:present enabled(添加) disabled(删除)
# 查看帮助文档(不在基础包里,在ansible-posix里) |
setup模块
ansible_factes用于采集被管理设备的系统信息(内存、网卡)
所有收集的信息都被保存在变量中
每次执行playbook默认第一个任务就是Gathering Fact
使用setup模块可以查看收集到的facts信息
有父子关系使用.表示
# 查看收集到的信息 |
debug模块
# 查看node1主机有关的魔法变量,如果该任务写成剧本,由于剧本会自动收集普通变量,所以到时还会看到除了魔法变量之外的普通变量,如ip、内存大小等 |
get_url模块
# 从网络下载文件 |
【ansible playbook】
ansible playbook:剧本
①将经常需要执行的任务写入一个文件(剧本)
②剧本中可以包含多个任务
③剧本写好后,随时根据剧本,执行相关的任务命令
④playbook剧本要求按照yaml格式编写
⑤适合执行周期性经常执行的复杂任务
语法格式:
- yaml格式 |
vim写yaml小技巧
vim ~/.vimrc # 只对对应用户有效 |
playbook格式
# 配置yum源、装包 |
debug模块
可以显示变量的值,可以辅助排错
var:引用变量不需要{{}} |
vim debug.yaml |
template模块
copy模块可以将一个文件拷贝给远程主机,但是希望每个文件内容都不一样,需要用到template
如何给所有web主机拷贝index.html内容是各自的IP地址、含有变量
ansible可以利用jinja2模板引擎读取变量
在playbook中调用变量,也是jinja2的功能 |
使用template模块将含有变量的文件上传到webserver组中的主机
mkdir template |
replace模块
vim /root/hardware.txt |
ansible容器运行playbook
# 1安装navigator软件包 |
##【ansible变量】
inventory变量(主机清单文件变量)
在主机清单配置文件中定义变量,可以针对主机或组
vim hosts |
魔法变量
ansible的内置变量
# 常用变量: |
playbook变量
在playbook中定义变量
使用vars关键词
vim playbook_var.yml |
变量文件
单独定义个变量文件
在playbook中使用vars_files调用该变量文件
优先级是最高的
vim variables.yml |
【ansible高级语法】
handlers
可以通过handlers定义一组任务
仅当某个任务触发(notify)handlers时才执行相应的任务
如果有多个notify触发执行handlers任务,也仅执行一次
仅当任务的执行状态为changed时handlers任务才执行
handlers任务在所有其他任务都执行后才执行
vim handlers.yml |
when条件判断
条件为真时执行
常见条件操作符:== != > >= < <= |
# 远程主机剩余内存不足800M,则关闭NetworkManager服务 |
fail模块
任务执行失败则终止任务
ansible node1 -m setup -a "filter=ansible_dev*" |
block任务块
使用block可以将多个任务合并为一个组
可以将整个block任务组,一起控制是否要执行
# block结合when使用时,当条件成立,执行一组任务 |
vim block-rescue-always.yml |
loop循环
相当于for
循环用到的变量名是固定的:item
vim simple-loop.yaml |
【ansible角色】
在实际生产环境中,为实现不同功能会编写大量playbook,而且每个playbook还可能会调用其他文件(如变量文件)
对于海量的、无规律的文件,管理较麻烦
ansible从1.2版本开始支持roles
roles是管理ansible文件的一种规范(目录结构)
roles会按照标准的规范,自动到特定的目录和文件中读取数据
roles规范的目录结构
defaults/main.yml:定义变量的缺省值,优先级较低
files目录:存储静态文件的目录
handlers/main.yml:定义handlers
meta/main.yml:作者、版本等描述信息
README.md:整个role的描述信息
tasks/main.yml:定义任务
templates目录:存放动态数据文件的地方(模版文件)
vars/main.yml:定义变量,优先级高
roles应用
# 配置,在defaults下添加roles_path行,自定义role存放位置 |
手工创建角色
# 创建角色相关目录,roles是配置文件中指定的存放角色总目录,http是创建的角色,tasks是存放角色任务的目录 |
使用命令创建角色
ansible-galaxy命令可以创建、管理自己的roles |
使用网络下载安装角色
galaxy.ansible.com/ui/ 可以看到别人写好的角色
vim roles.yml |
安装系统自带角色
# 安装系统自带角色 |
【ansible vault】
ansible有时需要访问一些敏感数据,如密码、key等
使用ansible-vault可以加密或解密数据
–encrypt:加密
–decrypt:解密
–view:查看
–rekey:修改密码
# 新建测试文件 |
说些什么吧!