当前位置: 首页 > news >正文

Ansible自动化运维

目录

一、ansible概述

1.Ansible简介

2.Ansible工作机制

3.Ansible特性

二、Asible的安装

1)、设置EPEL仓库, Ansible仓库默认不在yum仓库中

2)、 使用yum安装Ansible

3)、 查看ansible的版本

三、Ansible基本使用 

1、配置主机清单文件

 2、测试

四、Ansible组件 -- inventory

五、Ansible组件 -- Ad-Hoc

六、Ansible组件 -- facts

七、Ansible组件 -- PlayBook

YAML介绍

所有的yum文件都必须以.yml或者.yaml结尾。


一、ansible概述

1.Ansible简介

 —基于 Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使用YAML 及 Jinja2模板语言,更强的远程命令执行操作。

Ansible 基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible自己本身纯主要的程序是不能运行任何东西的,可以把它完全当成一个平台,在平台集合了各种各样的模块,用模块实现它想要实现的功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。

2.Ansible工作机制

     connection plugins:连接插件,负责和被监控端实现通信,有SSH,ZEROMQ等,默认使用SSH连接
​        host inventory:主机清单,是一个配置文件里面定义监控的主机(用来记录所有被你远程操作机器的名单)
​        modules : 模块,核心模块、command模块、自定义模块等
​        plugins : modules功能的补充,包括连接插件,邮件插件等
​        playbook:编排,定义 Ansible 多任务配置文件,非必需

3.Ansible特性

    1)、no agents:不需要在被管控主机上安装任何客户端,更新时,只需在操作机上进行一次更新即可
    2)、no server:无服务器端,使用时直接运行命令即可
    3)、modules in any languages:基于模块工作,可使用任意语言开发模块
    4)、yaml,not code:使用yaml语言定制剧本playbook
    5)、ssh by default:基于SSH工作
    6)、strong multi-tier solution:可实现多级指挥

二、Asible的安装

1)、设置EPEL仓库, Ansible仓库默认不在yum仓库中

[root@ansible1 ~]# yum -y install epel-release  安装扩展源,启用epel仓库

[root@ansible1 ~]# yum list | grep -i ansible    看哪个软件是哪个源装的

2)、 使用yum安装Ansible

[root@ansible1 ~]# yum install ansible -y

3)、 查看ansible的版本

[root@ansible1 ~]# ansible --version 
ansible 2.9.27

三、Ansible基本使用 

1、配置主机清单文件

主机清单文件
​            定义所管理的主机组及主机,可以在主配置文件中指定清单文件位置和名称
​            默认位置/etc/ansible/hosts
​ 主配置文件:
​            /etc/ansible/ansible.cfg 
​            主要设置一些ansible初始化的信息,比如日志存放路径、模块、插件等配置信息

[root@ansible1 ~]# vim /etc/ansible/ansible.cfg   修改主配置文件的位置/名字

 [root@ansible1 ~]# vim /etc/ansible/hosts

 配置ssh公钥认证:

控制节点需要发送ssh公钥给所有非被控制节点。主机解析。

 2、测试

语法

# ansible  <pattern>  -m <module_name>  -a <arguments>
pattern--主机清单里定义的主机组名,主机名,IP,别名等,all表示所有的主机,支持通配符,正则

-m module_name: 模块名称,默认为command
-a arguments:   传递给模块的参数  以~开头,匹配正则

最常用的模块:能直接让你用这个模块执行系统命令(在对面机器)
    command   默认模块  可以不加-m
    shell

执行shell命令

[root@ansible1 ~]#  ansible 192.168.22.169 -m shell -a 'touch /tmp/b.txt'  给ip169创建b.txt

[root@ansible1 ~]#  ansible 192.168.22.169 -m shell -a 'rm -rf /tmp/*'   删除b.txt

[root@ansible1 ~]# ansible 192.168.22.169 -m shell -a 'touch /tmp/c.txt;echo hello > /tmp/c.txt'  同时执行两条命令,创建一个c.txt,并且把hello重定向到c.txt
[root@ansible1 ~]# ansible w* -m shell -a 'touch /tmp/c.txt;echo hello > /tmp/c.txt'  所有以c开头的机器全部都执行。

执行command命令

ansible web1 -m command -a 'uptime'

ansible web1 -a 'uptime'

因为默认模块就是command,所以上面命令可以不加-m

同时指定多台机器

ansible web1,web2,web3 -m ping

使用ping模块检查ansible节点的连通性:

ansible web1 -m ping -o   (-o是通用的,加上-o就是把执行结果变成一行)

使用ssh账户和密码

-u  用户    //指定ssh账户
-k             //指定使用ssh密码(注意:如果设置了公钥认证,这里写什么密码都可以)

ansible w1 -a 'uptime' -u root -k    如果这台机器没有传公钥,远程ssh,默认是以root账户,root密码,所以在这里指定用户名,密码。(一般用的少,都会给被操纵机器加公钥)

SSH password: 
w1 | SUCCESS | rc=0 >>
给节点增加用户  

ansible 192.168.22.169 -a "useradd tom"

重定向输出到本地文件中

[root@ansible1 ~]ansible 192.168.22.169 -a "df -h" > /tmp/a.txt
[root@ansible1 ~]cat /tmp/a.txt 

四、Ansible组件 -- inventory

inventory文件通常用于定义要管理主机及其认证信息,例如ssh登录用户名、密码以及key相关信息。

[root@ansible1 ~]# vim /etc/ansible/hosts    使用[]标签指定主机组

 [root@ansible1 ~]# ansible db_servers -m shell -a 'echo hello > /tmp/a.txt'   对两台机器同时生效

查看组内主机列表

[root@ansible1 ~]# ansible db_servers --list-hosts

查看组内主机列表

ansible w1 -a 'uptime' -i web2.host  手动指定其他任意位置的清单

五、Ansible组件 -- Ad-Hoc

ad hoc 临时的,在ansible中是指需要快速执行,并且不需要保存的命令。其实就是执行简单的命令,对于复杂的命令则需要playbook。

ansible-doc命令获取模块列表及模块使用格式

[root@ansible1 ~]# ansible-doc -l       -l               获取列表
[root@ansible1 ~]# ansible-doc yum
[root@ansible1 ~]# ansible-doc -s yum ( -s module_name   获取指定模块的使用信息)

执行命令

-m shell
-f  2    指定定要使用的并行进程数,默认为5个。

[root@ansible1 ~]# grep forks /etc/ansible/ansible.cfg
#forks          = 5

[root@ansible1 ~]# ansible all -m shell -a 'hostname' -o -f 3     all所有的机器,3台机器去处理,相当于并发控制。机器多的时候用得上

复制文件  -m copy

得有cp命令,源文件,目标文件

ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts owner=root group=root mode=644 backup=yes'

注意:src指定的是ansible本地机器上的文件

ansible all -m shell -a 'cp /tmp/a.txt /tmp/b.txt'

注意:如果想拷贝远程机器上的文件则需要使用remote_src=yes选项
# ansible 192.168.22.169 -m copy -a "src=/tmp/cc.txt dest=/tmp/dd.txt remote_src=yes"

用户管理
-m user

添加用户
    [root@ansible1 ~]# echo '123' | openssl passwd -1 -stdin  产生一个加密的密码
    $2$hXe3alXf$4VGhWAbRGA6tm4NMJznSf1
    [root@ansible1 ~]# ansible 192.168.22.169 -m user -a 'name=lisi password="$2$hXe3alXf$4VGhWAbRGA6tm4NMJznSf1"' -o

测试  看密码是不是123   su - lisi

删除用户
    [root@ansible1 ~]# ansible 192.168.22.169 -m user -a "name=lisi state=absent" -o

使用变量需要用双引:

[root@ansible1 ~]# pass=`echo '1' | openssl passwd -1 -stdin`  (把密码交给一个变量,ansible是可以加变量的,但是外边不能用单引号了)

[root@ansible1 ~]# ansible 192.168.22.169 -m user -a "name=lisi password=$pass" -o  (变成双引就好了)

使用命令替换需要用双引:
    [root@ansible1 ~]# ansible 192.168.22.169 -m user -a "name=lisi password=`echo '1234' | openssl passwd -1 -stdin" -o

软件包管理      -m yum

安装软件:
    [root@ansible1 ~]# ansible 192.168.22.169 -m yum  -a  'name=httpd state=latest/installed/present' 

latest直接安装最新版本

删除软件:
    [root@ansible1 ~]# ansible 192.168.22.169 -m yum  -a  'name=httpd state=removed/absent' 

服务管理     -m service
[root@ansible1 ~]# ansible 192.168.22.169 -m service -a 'name=httpd state=started enabled=yes' 

systemctl list-unit-files    查看是不是 开机启动

六、Ansible组件 -- facts

最主要的功能:用来获取被操控机器的基本信息

facts组件是Ansible用于采集被管理主机信息的一个功能,可以使用setup模块查看主机的有的facts信息。

组件的名字叫facts,但要是想用组件获取信息用的是setup模块。

[root@ansible1 ~]#  ansible 192.168.22.169  -m setup     可以拿到被操控机器的所有信息

[root@ansible1 ~]#  ansible 192.168.22.169 -m setup -a 'filter=ansible_all_ipv4_addresses'

将所有主机的信息输入到/tmp/facts目录下:
每台主机的信息输入到主机名文件中(/etc/ansible/hosts里的主机名)
[root@ansible1 ansible]# ansible all -m setup --tree /tmp/facts 

[root@ansible1 ~]# cd /tmp/
[root@ansible1 tmp]# ls
facts
[root@ansible1 tmp]# cd facts/
[root@ansible1 facts]# ls
192.168.22.169
[root@ansible1 facts]# cat 192.168.22.169

[root@ansible1 facts]# ansible 192.168.22.169 -m setup -a 'filter=ansible_*_mb'  查看主机内存信息

[root@ansible1 facts]# ansible 192.168.22.169 -m shell -a "ip a"    参数忘了可以直接 ip a 拿到ip地址

七、Ansible组件 -- PlayBook

playbook介绍
playbook是由一个或多个”play”组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来将,所谓的task无法是调用ansible的一个module。

Playbook是Ansible的配置,部署,编排语言。他们可以被描述为一个需要希望远程主机执行命令的方案,或者一组IT程序运行的命令集合。
当执行一些简单的改动时ansible命令是非常有用的,然而它真的作用在于它的脚本能力。当对一台机器做环境初始化的时候往往需要不止做一件事情,这时使用playbook会更加适合。通过playbook你可以一次在多台机器执行多个指令。通过这种预先设计的配置保持了机器的配置统一,并很简单的执行日常任务。
Playbook还开创了很多特性,它可以允许你传输某个命令的状态到后面的指令,如你可以从一台机器的文件中抓取内容并附为变量,然后在另一台机器中使用,这使得你可以实现一些复杂的部署机制,这是ansible命令无法实现的。

YAML介绍

Ansible使用标准的YAML解析器,使用YAML文件语法即可书写playbook。
YAML是一个可读性高的用来表达资料序列的格式,YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001首次发表了这种语言。
YAML Ain’t Makup Language,即YAML不是XML。不过,在开发这种语言时,YAML的意思是:Yet Another  Makrup  Language(仍是一种标记语言),其特性:YAML的可读性好、YAML和脚本的交互性好、YAML有一个一致的信息模型、YAML易于实现、 YAML可以基于流来处理、YAML表达能力强,扩展性好。

所有的yum文件都必须以.yml或者.yaml结尾。

playbook的基础组件

name 定义playbook或者task的名称

hosts playbook中的每一个paly的目的都是为了让某个或某些以某个指定用户的身份执行任务。hosts用于指定要执行指定任务的主机,其可以是一个或多个由冒号分割主机组。与命令模式下的ansible匹配规则一样

user remote_user则用于指定远程主机上的执行任务的用户,也可以使用user

tasks 任务列表 play的主体部分是task list. task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。

vars 定义变量

vars_files 定义变量文件

notify 任务执行结果如果是发生更改了的则触发定义在handler的任务执行

handlers 用于当前关注的资源发生变化时采取一定指定的操作

include 能包含的包括task,handler和playbook 可以在include的时候传递变量

简单playbook

vim test.yml   # 固定后缀为yml或者yaml

文档以---开头,没有也可以

#两部分
#1.字典 映射 map dic
#     key value的形式出现
#     凡是value为非嵌套结构的,直接写在key的后面,冒号后面必须加空格
#     凡是value为嵌套结构的,换行,冒号后面不需加空格
#2.list 列表
#     每个列表都是以-开头的,-后面必须带空格
#     [1,2,3,[4,5,6]]
#     - 1
#       2
#       3
#       - 4
#         5
#         6
#语法规则
#1.区分大小写
#2.同级元素缩进必须一致,缩进的空格数量不限
#3.缩进尽量用空格,少用tab。

相关文章:

  • 多线程【锁策略与CAS的ABA问题】
  • 清华系激光雷达公司,成了量产元年最大的黑马
  • 基于springboot的球员转会管理系统的设计与实现-计算机毕业设计源码+LW文档
  • 【Arduino与MFRC522握手】
  • 生成式对抗网络(GAN)【第六章】
  • 了解 Flutter 开发者们的 IDE 使用情况
  • linux下的权限
  • AI 杀疯了,NovelAI开源教程
  • 【深度学习】卷积神经网络之图像分类|CNN、AlexNet、VGG、GoogLeNet、ResNet
  • 手把手完成智慧路灯的开发,完成设备上云【华为云IoT】
  • SpringBoot数据层测试事务回滚
  • 【计算机毕业设计选题】10套易过的精品毕设项目分享(源码+论文)
  • 【CVAdd】Filter 滤波器
  • 常用安卓开发技巧汇总
  • Vue组件库实现按需引入可以这么做
  • 网络传输文件的问题
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Asm.js的简单介绍
  • ES6 ...操作符
  • IndexedDB
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • miaov-React 最佳入门
  • nodejs调试方法
  • pdf文件如何在线转换为jpg图片
  • python3 使用 asyncio 代替线程
  • Python打包系统简单入门
  • REST架构的思考
  • Vue实战(四)登录/注册页的实现
  • 不上全站https的网站你们就等着被恶心死吧
  • 关于extract.autodesk.io的一些说明
  • 普通函数和构造函数的区别
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 译自由幺半群
  • 我们雇佣了一只大猴子...
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • # 透过事物看本质的能力怎么培养?
  • $GOPATH/go.mod exists but should not goland
  • (1)STL算法之遍历容器
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (Python) SOAP Web Service (HTTP POST)
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (void) (_x == _y)的作用
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (规划)24届春招和25届暑假实习路线准备规划
  • (黑马点评)二、短信登录功能实现
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (转)iOS字体
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .NET 表达式计算:Expression Evaluator
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NetCore 如何动态路由