Ansible 的自动化运维(一)
原创 运维大爆炸 IT运维大爆炸 2023-06-01 10:48 发表于上海 收录于合集 #自动化3个 #linux系统5个 #linux19个 #服务31个1、简介
Ansible 是近年来越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为失误。
Ansible 通过本身集成的非常丰富的模块可以实现各种管理任务,其自带模块超过上千个。更为重要的是,它操作非常简单,即使小白也可以轻松上手,但它提供的功能又非常丰富,在运维领域,几乎可以做任何事。
2、自动化运维应用场景
-
文件传输
-
应用部署
-
配置管理
-
人物流编排 (先进先出,后进后出,类似于消息队列)
3、常用的自动化运维工具(打开图片进行介绍)
-
Ansible:python,Agentless,中小型应用环境
-
Saltstack:python,一般需部署agent,执行效率更高
-
Puppet:ruby, 功能强大,配置复杂,重型,适合大型环境
-
Fabric:python,agentless
-
Chef:ruby,国内应用少
-
Cfengine
-
func
#git地址查看
https://github.com/ansible/ansible
https://github.com/saltstack/salt
同类自动化工具GitHub关注程序:
4、Ansible发展史
Michael DeHaan( Cobbler 与 Func 作者)名称来自《安德的游戏》中跨越时空的即时通信工具2012-03-09,发布0.0.1版,2015-10-17,Red Hat宣布收购官网:https://www.ansible.com/官方文档:https://docs.ansible.com/。
5、Ansible特性
-
模块化:调用特定的模块完成特定任务,支持自定义模块,可使用任何编程语言写模块。
-
Paramiko(python对ssh的实现),PyYAML,Jinja2(模板语言)三个关键模块。
-
基于Python语言实现。
-
部署简单,基于python和SSH(默认已安装),agentless,无需代理不依赖PKI(无需ssl)
-
安全,基于OpenSSH。
-
幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况。
-
支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构。
6、ansibel架构
ansible的作用以及工作结构
1、ansible简介:
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,
实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
主要包括:
(1)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(2)、playbook:剧本执行多个任务时,让节点一次性运行多个任务。
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、连接插件connection plugins:负责和被监控端实现通信;
2、ansible的架构:连接其他主机默认使用ssh协议;
7、Ansible工作原理
ANSIBLE PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件。
INVENTORY:Ansible管理主机的清单 /etc/anaible/hosts。
MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义(通常由python编写,也可以使用解释型语音,如:shell、Ruby)。
PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用。
API: 供第三方程序调用的应用程序编程接口。
ANSIBLE:组合INVENTORY、API、MODULES、PLUGINS的绿框,可以理解为是ansible命令工具,其为核心执行工具。
8、注意事项
-
执行ansible的主机一般称为管理端、主控端、中控、master或者堡垒机。
-
主控端Python版本需要2.6或以上。
-
被控端版本小于2.4,需要安装python-simplejson。
-
被控端如开启SElinux需要安装libselinux-python。
-
windows不能做为主控端。
9、安装方式
参考安装:https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html
#rpm包安装: EPEL源
yum install ansible
#编译安装:
yum -y install python-jinja2 PyYAML python-paramiko python-babel
python-crypto
tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible
#Git方式:
git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup
#pip安装:pip是安装Python包的管理器,类似yum
yum install python-pip python-devel
yum install gcc glibc-devel zibl-devel rpm-bulid openssl-devel
pip install --upgrade pip
pip install ansible --upgrade
#确认安装:
ansible --version
10、ansible 配置文件
#配置文件
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特征
/etc/ansible/hosts 主机清单
/etc/ansible/roles/ 存放角色的目录
#主配置文件
Ansible 配置文件/etc/ansible/ansible.cfg (一般保持默认)
vim /etc/ansible/ansible.cfg
[defaults]
#inventory = /etc/ansible/hosts # 主机列表配置文件
#library = /usr/share/my_modules/ # 库文件存放目录
#remote_tmp = $HOME/.ansible/tmp # 临时py命令文件存放在远程主机目录
#local_tmp = $HOME/.ansible/tmp # 本机的临时命令执行目录
#forks = 5 # 默认并发数,同时可以执行5次
#sudo_user = root # 默认sudo 用户
#ask_sudo_pass = True # 每次执行ansible命令是否询问ssh密码
#ask_pass = True # 每次执行ansible命令是否询问ssh口令
#remote_port = 22 # 远程主机的端口号(默认22)
建议优化项:
host_key_checking = False # 检查对应服务器的host_key,建议取消注释
log_path=/var/log/ansible.log # 日志文件,建议取消注释
module_name = command # 默认模块
11、Ansible相关工具
#程序
/usr/bin/ansible 主程序,临时命令执行工具
/usr/bin/ansible-doc 查看配置文档,模块功能查看工具
/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具
/usr/bin/ansible-pull 远程执行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基于Console界面与用户交互的执行工具
#利用ansible实现管理主机的主要方式
- Ad-Hoc 即利用ansible命令,主要用于临时命令使用场景。
- Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前期的规划过程。
12、inventory主机清单
ansible的主要功能在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命令。
默认inventory file为/etc/ansible/hosts,inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成。
[wd]
117.50.163.139 ansible_connection=local #指定本地连接,无需ssh配置
[db]
123.60.92.30 ansible_port=22 ansible_user=root
124.221.97.88:22
[web]
124.221.97.[87:88]
#主机清单格式
inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中,此外,目标主机使用了非默认的ssh端口,还可以在主机名称后面使用冒号加端口来表明。
13、主机列表
#ansible的Host-pattern
匹配主机的列表
All :表示所有Inventory中的所有主机
ansible all -m ping
* :通配符
ansible "*" -m ping (*表示所有主机)
ansible "123.60.92.3*" -m ping
ansible "*db" -m ping
或关系 ":"
ansible "web:db" -m ping
ansible "123.60.92.30:124.221.97.88" -m ping
逻辑与 ":&"
ansible 'web:&db' -m ping
在websrvs组并且在dbsrvs组中的主机
逻辑非 ":!"
ansible 'web:!db' -m ping
在websrvs组,但不在dbsrvs组中的主机
注意:此处为单引号
综合逻辑
ansible 'webs:db:!wd' –m ping
正则表达式
ansible "~(web|db)*" -m ping
14、ansible使用方法
#查看版本
[root@10-60-249-255 ~]# ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Apr 2 2020, 13:16:51) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
#帮助模块
ansible-doc -l 列出所有模块。
ansible-doc ping 查看指定模块帮助用法。
ansible-doc -s ping 查看指定模块帮助用(简写)。
15、ansible执行过程演示
ansible命令执行过程
-
加载自己的配置文件 默认/etc/ansible/ansible.cfg。
-
加载自己对应的模块文件,如command。
-
通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件。
-
给文件+x执行。
-
执行并返回结果。
-
删除临时py文件,sleep 0退出。
#查看对应主机的目录(实时刷新)
watch tree /root/.ansible/tmp
#查看详细信息可以看到做了删除脚本的操作
ansible all -m ping -vvvv
执行状态:(在/etc/ansible/ansible.cfg搜索colors,可以自定义)
-
绿色:执行成功并且不需要做改变的操作
-
黄色:执行成功并且对目标主机做变更
-
红色:执行失败
16、ansible常用模块
2015年底有270个模块,2016年达到540个,2018年1月12号有1378个,2018年7月15号有1852个,2019年5月25号(ansible2.7.10)有2080个,2020年3月2号有3387个模块,虽然模块众多,但最常见的也就30个左右而已,针对特定运维的业务可能只用十几个模块就够了。
常用模块帮组参考文档:
https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html
https://docs.ansible.com/ansible/2.9/modules/list_of_all_modules.html
#我们从里面选择两个模块简单介绍一下
Shell:用shell执行命令,支持通配符
> ansible all -m shell -a 'getenforce' 查看SELINUX状态
这些复杂命令,即使使用shell也可能会失败,
解决办法:写到脚本时,copy到远程执行,再把需要的结果拉回执行命令的机器
Copy:从主控端复制文件到远程主机
src : 源文件 指定拷贝文件的本地路径 (如果有/ 则拷贝目录内容,比拷贝目录本身)
dest: 指定目标路径
mode: 设置权限
backup: 备份源文件
content: 代替src 指定本机文件内容,生成目标主机文件
> ansible web -m copy -a "src=/root/test1.sh dest=/tmp/test2.sh mode=600 backup=yes"
如果目标存在,默认覆盖,此处指定先备份
> ansible web -m copy -a "content='test content\nxxx' dest=/tmp/test.txt"
指定内容,直接生成目标文件
欢迎大家扫码关注:
本公众号只写原创,不接广告、不接广告、不接广告。下期小伙伴想学习什么技术,可以私信发我吆。
运维大爆炸 收录于合集 #自动化 3个 下一篇Ansible 的自动化运维(二)文件加密 阅读 295 IT运维大爆炸 125篇原创内容 收藏此内容的人还喜欢 Postman进阶篇(八)-使用postman抓包并批量保存接口 软件测试必备技能 不看的原因
- 内容质量低
- 不看此公众号
- 内容质量低
- 不看此公众号
- 内容质量低
- 不看此公众号