linux就该这么学-16 ansible

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

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选择对应的主机执行任务

e28aed903e074f98941955447771b0aa.png

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

643e08fccadb444fbc39427ee9077539.png

2.3 配ssh用户名和密码

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

94ac11ec919f4f2a8aad29c83371bcac.png

 注意,主机之间第一次ssh需要指纹,如果是第一次连接主机,这会导致问题,可以通过配置取消此指纹

取消ssh指纹验证,设定playbook执行者为root:

f33c04cb71944194ad23679ec079c65e.png

 3 运行临时命令

ansible只是一个框架,完成工作的是具体的模块,可ansible-doc -l列出所有模块

可通过ansible-doc module_name查看某个模块详细信息

8e13b70bca934dde97ff54780f270e26.png

如果想实现某个功能但不知道哪个模块可以实现,可用ansible-doc进行搜索

3.1 运行临时命令

ansible命令可用于执行临时命令,尝试ping功能 ansible all -m ping

629d5f7507c344d39be364c5ab613ae7.png

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

a62c1fe978c7445eb564bbbd8d66e214.png

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

558201f802f8409da87ec2ba5de0d485.png

 如果想临时运行某模块但有些参数,可以用-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

5f6a609aace34dcca84cca03f1e19825.png

 运行 ansible-playbook /root/test_ansible

6a553c8096f94493b253097216546766.png

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

bae6ed7a6be24fc7852d5b4f759a3088.png

 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

1fdcdfdc01bb4afd8fb9003cb8d02d8d.png

 如果下载慢可以指定下载网址如加速器等,这个需通过yaml实现,将加速器网址写到yaml中即可

下载时可使用此yaml: ansible-galaxy install xxx -r accelerator_path

5.1.1 尝试一下

5.1.1.1 查看当前角色

2c98b4edbaaa400eb9e54c8c0f87e7fa.png

5.1.1.2 编辑要下载的角色yaml

3a0aaafd7e5d44a593f6e41a7c9aca2c.png 5.1.1.3 下载角色

e0c57596108949488e9a2b249e77d2b1.png 5.1.1.4 查看角色

1b6349601d68446592b99bda91eebd4a.png  

5.2 自定义角色 

查看roles:ansible-galaxy list

安装完直接执行会报错

551f9f4cfb2a453cb202bcea13a6e8d7.png

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

ea7f693966e84bb4aa322a356cffc362.png

 创建角色test:ansible-galaxy init test

facf354cd67a4e4a9e5038a9dc0e9104.png

建完角色,检查是否创建

5767e4e1317f4b1d864bf2c73c2e084c.png

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

c759400c2e664e20bd879178bea7290b.png

 5.2.1 自定义角色实验

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

1 检查初始状态

b78e11940cf047bba285f8e5f18c83fe.png ca94d17c9f0e4a48817674463b437a89.png

f59fb18fb658492387106f23b34f1ddf.png

5e859407c6924accb140c8bfcb60e330.png

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

2.1 关闭apache2

8c9e714b3c30480da7849b79deb669e9.png

 2.2 打开firewall的http

2cd54d358b954a948f56b9038ffbcf0c.png

 2.3 修改kimsmith用户主页的index.html

显示目标主机用户名和ip,可以用setup模块查询,该模块可自动收集受管主机的变量

主机名可尝试搜索fqdn关键字 

e25034486d1444a58e05a0a2e7363de7.png

 ip地址可搜索ip关键字

5c24574c1b1c41c38eba5f391c93be6f.png

 编写main.yml

db00e1dbe9de445eb3ace6ae43b0d55a.png

 3 调用刚才给角色写的main.yml

需要写个yml完成调用,该yml可在任意路径,执行时传入该yml即可

执行失败发现ansible版本太低(2.5)存在bug,安装2.9版本后重试

9229f5d7967f4b8c9d0d435647811de7.png

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

fe86cec8591e4259a3bea55a3e325e46.png

4 验证结果

4.1 task one

ca7fdbb71fd043f3a4b7131f30cd626f.png 4.2 task two 

dc2adfeab2ac47c78243e7e4628ef867.png

4.3 task three

128e4c1698f34905a48d31713806a734.png

把apache启动,访问网页

1d604630975048a786237698e5ea561e.png

6 创建和使用逻辑卷

6.1 目标与环境

6.1.1 目标

 在受管主机创建一个lv,然后ext4格式化

6.1.2 环境

e7962d8aa7a847049f6e16a2c23b2ef6.png

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

c2f1b88ad9a04de4a88038b128d00757.png

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

98bf811401824e419d6fa8d73cb4aadd.png

 6.2.3 创lv

 4457587841574ce5934021a659fa9df6.png

执行ansible-playbook /root/roles.yml后,检查结果

7ba6eac456af4055b8029e44720b5370.png 注,此处lvol规定的size没效果,即假设size为30,创出来的lv还是60,不知道为啥,上不了外网看不了github

6.2.4 格式化lv

检查上步创的lv fstype

3eb8cbea13b64a44a7d68131e2b622c2.png

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

7266a3b6c4284abe84814a9b56a028eb.png

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

ff9159e048e1481aa392ee67aae9831a.png

 6.2.5 总结

看下脚本整体

e802b3ed310949e4945746cd94411e6d.png

6.2.6 报错处理功能

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

未处理异常

263a8a8483ba477d9f43e4902aa4b0e0.png

 处理异常

脚本如下

4b9fbaf5e58548a8aa30d0c95a84c970.png

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

5ec852ee0ac04491999193ed8ea82fef.png

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

08443a020fd94993bdd1847f200771d8.png

 7 判断主机名

此处实践如何判断/etc/ansible/hosts中主机组的名字,因为是自定义变量,所以无法用setup查询,这种变量需要在执行剧本文件时gathering facts阶段搜集,只能在剧本中调用,所以可以在剧本里对变量名进行判断

此处将主机组的名字写到文件里

一个值得注意的点是,这里的if不是进行变量引用,而是穷举所有结果都写上,每个分支加上if判断,来个例子

0be83959c4c84d2f979e7e5d6a68e7a6.png

注意此处逻辑,inventory_hostname是当前主机在/etc/ansible/hosts规定的ip地址,groups.dev是/etc/ansible/hosts里dev主机组下所有的主机ip,列表类型,所以此处用in判断当前主机ip是否是某个主机组下的其中一个ip

 看看效果,发现报错了,提示groups没有dev键,是因为/etc/ansible/hosts里主机组只有prod,没有dev主机组,如下图

5f340036eb69424e984ce8f11cfc2800.png

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

5f21d41c9233440da4734b81a1455326.png

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

0b6c73dd82a84f5b92a133a945a30416.png

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

2118e1f23a0a48cbaf74e9528f959875.png

验证一下,成功

a5841a40e9c7462c80688e5d9b35f962.png

 8 管理文件属性

本节使用file模块,并了解其应用

8.1 目标

创个文件夹,属主属组均为root,755,SGID,仅在prod主机组执行

再创个链接指向刚创的目录

8.2 实施

8780510db74b4718948840b31d142430.png

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

 432716b3a4634b49b7d860d655e4dd9f.png

 成功

9 管理密码库文件

本节使用vault模块,了解其应用

9.1 目标

对文件进行加密

9.2 实施

9.2.1 创文件

5507a80f673341d58a67dbc819fb9feb.png

 9.2.2 加密

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

ad32dd30d4664dfeabc3231ef973dd56.png

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

963b6ee75cc449569b87f0a05b1831f4.png

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

 9.2.4 进行加密

711eff85419e44a3bce4b163f0f04d3f.png

采用AES256加密,有2^256种结果,看下加密后内容

80e9e6541f1b4d0b990440965aaf9180.png 9.2.5 如何修改加密密钥

可修改密钥通过命令,把新密码改为666,注意需要提供--ask-vault-pass,否则不会弹出输入新密码提示,导致收不到密码报错

c645568c9bb74e4daafca3b994a95889.png

9.2.6 查看和修改加密文件

修改,执行ansible-vault edit ./elice.yml

32466632b3774dd8a3a7e2ad2c49a87e.png 

 查看

818dff5bc1214cf7a08115b87fa3d37d.png

 如果没在ansible配置文件配置密钥,查看或编辑可能需要输入密码

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值