Ansible 的自动化运维(一)

Ansible 的自动化运维(一)

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篇原创内容
 
 
关注后可发消息
 
 
posted @ 2023-06-24 09:25  往事已成昨天  阅读(97)  评论(0编辑  收藏  举报