1 ansible
1.1 简介
相关的自动化运维工具还有puppet,saltstack等
基于ssh,不需要客户端程序,只需要目标主机账号
1.2 概念
inventory 主机清单
playbook 剧本 用yaml写的可重复执行的任务列表
role 角色 角色用来结构化组织playbook,通过role可实现一连串功能
1.3 安装
apt install ansible
2 设置主机清单
2.1 配置文件优先级
当前目录ansible配置文件优先级最高,然后是用户home目录最低优先级是/etc/ansible,这三个按从高到底只匹配第一个,而不是三个都匹配
2.2 修改主机清单
文件位置为/etc/ansible/hosts,修改如下,可以直接放ip,也可把ip归类放在某些section下,后面批量执行任务可根据section选择对应的主机执行任务

主机改完会立即生效,可以检测下ansible是否识别了刚才写入的主机信息

2.3 配ssh用户名和密码
ansible基于ssh,ssh需要用户名和密码,这些可以在配置文件里写入

注意,主机之间第一次ssh需要指纹,如果是第一次连接主机,这会导致问题,可以通过配置取消此指纹
取消ssh指纹验证,设定playbook执行者为root:

3 运行临时命令
ansible只是一个框架,完成工作的是具体的模块,可ansible-doc -l列出所有模块
可通过ansible-doc module_name查看某个模块详细信息

如果想实现某个功能但不知道哪个模块可以实现,可用ansible-doc进行搜索
3.1 运行临时命令
ansible命令可用于执行临时命令,尝试ping功能 ansible all -m ping

报错提示需要安装软件包sshpass,尝试安装后再执行,成功

每个模块都有对应的example,可执行命令查看 ansible-doc module_name

如果想临时运行某模块但有些参数,可以用-a替代,形如:ansible all -m module_name -a 'vara="xxx" varb="""xxx"'
4 playbook
playbook用yaml编写,相比于ansible命令,playbook可以通过yaml自动化运行多个模块
playbook yaml结构由四部分组成:
target 定义要执行的playbook主机范围
variable 定义playbook执行用到的变量
task 定义在远程主机执行的任务列表
handler 定义执行完成后要调用的后续任务
yaml会自上而下顺序运行
4.1 实例
使用ansible为远程主机添加apt仓库,使用apt_repository模块,编写如下playbook yaml

运行 ansible-playbook /root/test_ansible

验证,在sources.list.d中已经添加

5 role
角色可以以某种结构话方式组织playbook,roles来源有 1linux系统自带角色(ubuntu不知道有没有) 2ansible galaxy社区角色 3 自定义角色
角色相比于剧本变化,目前了解到的和自我感觉的突出点是解耦,把host和task解耦了,应该还有其他解耦但我目前没用到,角色的task yaml文件没hosts,hosts在调用的yaml里规定
5.1 ansible galaxy社区角色
ansible-galaxy install xxx即可安装社区角色,xxx形如nginxinc.nginx

如果下载慢可以指定下载网址如加速器等,这个需通过yaml实现,将加速器网址写到yaml中即可
下载时可使用此yaml: ansible-galaxy install xxx -r accelerator_path
5.1.1 尝试一下
5.1.1.1 查看当前角色

5.1.1.2 编辑要下载的角色yaml
5.1.1.3 下载角色
5.1.1.4 查看角色
5.2 自定义角色
查看roles:ansible-galaxy list
安装完直接执行会报错

根据提示信息,查询roles是从文件里查,而默认的role文件不存在所以报错,所以要先创一个roles文件夹,再在配置文件指定查roles的文件夹路径

创建角色test:ansible-galaxy init test

建完角色,检查是否创建

新建角色是个文件夹,查看角色下有哪些文件

5.2.1 自定义角色实验
通过自定义角色test,我们希望做几件事1firewall添加http 2关闭apache2服务,并将apache2 disable 3修改用户首页的index.html,显示welcome to 主机名 on 主机地址
1 检查初始状态



2 角色要执行的task在./test/tasks/main.yml中编辑,内容如下
2.1 关闭apache2

2.2 打开firewall的http

2.3 修改kimsmith用户主页的index.html
显示目标主机用户名和ip,可以用setup模块查询,该模块可自动收集受管主机的变量
主机名可尝试搜索fqdn关键字

ip地址可搜索ip关键字

编写main.yml

3 调用刚才给角色写的main.yml
需要写个yml完成调用,该yml可在任意路径,执行时传入该yml即可
执行失败发现ansible版本太低(2.5)存在bug,安装2.9版本后重试

提示未安装firewalld模块导致报错,修改apt ubuntu版本,安装python3-firewall,再次执行仍然报错,猜测可能用python2,就会有安装了包但实际未用到的现象,发现可在/etc/ansible的host配置/ansible_python_interpreter=/usr/bin/python3解决,再次执行问题解决

4 验证结果
4.1 task one
4.2 task two

4.3 task three

把apache启动,访问网页

6 创建和使用逻辑卷
6.1 目标与环境
6.1.1 目标
在受管主机创建一个lv,然后ext4格式化
6.1.2 环境

6.2 执行
注,测了几遍不知道是不是bug,上不了外网,创的vg大小只有大于一半的pv才能正常创,否则能创出来,但大小不准
6.2.1 创pv
按理说创vg需要pv,但lvg可以直接创vg时创个pv
6.2.2 创vg
编辑完role的task,创个roles.yml调用角色的任务,然后执行ansible-playbook /root/roles.yml

在目标主机检查vg,成功创建

6.2.3 创lv

执行ansible-playbook /root/roles.yml后,检查结果
注,此处lvol规定的size没效果,即假设size为30,创出来的lv还是60,不知道为啥,上不了外网看不了github
6.2.4 格式化lv
检查上步创的lv fstype

此处格式化lv为ext4,用filesystem编写格式化yaml

检查结果,发现成功格式化

6.2.5 总结
看下脚本整体

6.2.6 报错处理功能
如果task中途报错,不会执行后面的内容,此时如果我们希望像pyhon的try...except那样,也可以实现,如下,先手动构造异常,将创的vg大小设置超过pv,再加入异常处理,然后对比查看结果
未处理异常

处理异常
脚本如下

注意,此处的block是操作符,不是随便的名字否则会报错,比如把block改为wholesale,报错如下图

查看异常处理结果:在失败处会停止执行,最后执行异常处理

7 判断主机名
此处实践如何判断/etc/ansible/hosts中主机组的名字,因为是自定义变量,所以无法用setup查询,这种变量需要在执行剧本文件时gathering facts阶段搜集,只能在剧本中调用,所以可以在剧本里对变量名进行判断
此处将主机组的名字写到文件里
一个值得注意的点是,这里的if不是进行变量引用,而是穷举所有结果都写上,每个分支加上if判断,来个例子

注意此处逻辑,inventory_hostname是当前主机在/etc/ansible/hosts规定的ip地址,groups.dev是/etc/ansible/hosts里dev主机组下所有的主机ip,列表类型,所以此处用in判断当前主机ip是否是某个主机组下的其中一个ip
看看效果,发现报错了,提示groups没有dev键,是因为/etc/ansible/hosts里主机组只有prod,没有dev主机组,如下图

所以此处groups.dev查不到dev主机组存在时,不会判断false而是异常,但groups.prod就不会报错,因为prod主机组在/etc/ansible/hosts中有定义

ansible主要基于python,参考python格式尝试修改main.yml,发现成功

如果.get不提供键不存在的返回值,in操作符会报错,所以在.get第二个参数提供一个可迭代对象,看看结果回显应该成功了

验证一下,成功

8 管理文件属性
本节使用file模块,并了解其应用
8.1 目标
创个文件夹,属主属组均为root,755,SGID,仅在prod主机组执行
再创个链接指向刚创的目录
8.2 实施

注意,state的link表示软连接,hard表示硬链接,执行

成功
9 管理密码库文件
本节使用vault模块,了解其应用
9.1 目标
对文件进行加密
9.2 实施
9.2.1 创文件

9.2.2 加密
此处将密钥放文件里,免得加密输入密码

9.2.3 在ansible配置中添加密钥路径

设置完后ansible运行会自动挂载,因此改完就ok
9.2.4 进行加密

采用AES256加密,有2^256种结果,看下加密后内容
9.2.5 如何修改加密密钥
可修改密钥通过命令,把新密码改为666,注意需要提供--ask-vault-pass,否则不会弹出输入新密码提示,导致收不到密码报错

9.2.6 查看和修改加密文件
修改,执行ansible-vault edit ./elice.yml
查看

如果没在ansible配置文件配置密钥,查看或编辑可能需要输入密码
本文介绍了Ansible的基本概念和使用方法,包括基于ssh的自动化运维,playbook的编写,主机清单的设置,模块的使用以及通过role进行任务组织。还涉及到社区角色的安装,自定义角色的创建和使用,以及错误处理和文件属性管理。此外,文章还提到了Ansible的密码库文件管理,使用vault进行文件加密。
549

被折叠的 条评论
为什么被折叠?



