运维自动化之salt

2023-11-20 21:08
文章标签 运维 自动化 salt

本文主要是介绍运维自动化之salt,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:http://wiki.saltstack.cn/reproduction/om-auto-salt

参考:http://blog.lightcloud.cn/?p=251

  • 转载出处: http://blog.lightcloud.cn/?p=251

  • 作者: halfss

目录

  1. 引言: 关于运维
  2. saltstack的基本介绍
  3. salt的安装
    1. 服务端
      1. 安装
      2. 配置文件
      3. 运行
    2. 客户端
      1. 安装
      2. 配置文件
      3. 运行
    3. 基础知识
  4. salt的使用
    1. 基础知识
      1. targeting
      2. nodegroup
      3. grains
      4. pillar
    2. 状态管理
      1. state
        1. state语法
        2. state的逻辑关系
      2. highstate
    3. salt schedule
  5. 实时管理
    1. cmd.run
    2. module
    3. 无master
  6. salt开发
    1. saltclient管理salt
    2. salt api
  7. 参考文档
  8. 关于我

引言: 关于运维

运维的工作主要在2方面:

  1. 状态的管理
  2. 系统性能调优

这里主要简介下运维状态的管理:

  • 对于运维来说,基于状态的配置管理已经向自动化迈进了一大步,以状态为核心的运维,让状态本身有了可管理性;在运维过程中我们会发现,同样的一个配置,我们会在不同的时间,不同的地点一次在一次的配置,这个时候,配置管理就有了重复性;有的甚至是原封不动的重复,而另外一些则是按照一定的规律在发展,这些按照一定规律发展的配置,就是可预测的.综上我认识的,我们运维工作的本身是可管理,可重复,可预测的.基于这样的理念,我们就可以更高一步的推进我们的运维自动化,甚至到智能化.

看到这里,我理想中的运维自动化的配置管理平台应该有如下功能:

  1. 对状态的配置及管理(最基本的)
  2. 可以及时的对系统状态进行调整并能看到结果(可以方便的实时升级系统状态)
  3. 可以对其本身做方便的第三方管理(借助其API,直接给状态制定好其发展方向)

加分项:

  1. 开发语言单一
  2. 架构简单,灵活
  3. 有不差的安全性
  4. 没有商业版

下面是现有比较有代表性的自动化配置管理工具(以下仅基于开源版本进行介绍):

名称

理念

优缺点

puppet

从运维的角度去做配置管理(运维人员做给运维用的)

架构简单,系统比较成熟/不便于第三方管理

chef

从研发的角度去做配置管理(研发人员做给运维用的)

较便于第三方管理,对自身(节点,变量,cookbook)的管理较方便,有自己的dashboard,cookbook支持版本管理,自从cookbook的版本管理/架构复杂,开发语言较多,(安全问题)

以上2者都比较侧重于状态的管理,对单个或者多个状态的临时调整或者管理较差, 2个都有商业版,让我这个用开源版的很自卑

这里我们也能看到,2个配置功能都没能达到我理想中的状态,那就暂用chef吧,直到有一天,了解到了saltstack看到了这句话:“ 系统配置的自动化不仅可预测,可重复, 还具有可管理性”(http://wiki.saltstack.cn/reproduction/dive-into-saltstack ),这尼玛才是运维自动化的未来啊,于是毫无节操的开始学习salt,而且发现越学越喜欢;在我使用puppet及chef的时候都没有使用salt的感觉,太爽了。所以我这里仅仅介绍几本的语法不涉及实际用例,salt的安装非常方便,所以你在看本文档的时候希望你能真正的动手去做一下,然后你就会爱上salt了

  • 附::如果你会python,salt基本是不需要怎么学的,而我正好了解一点py,不过这最多占我选择salt的20%。

saltstack的基本介绍

salt是一个新的基础平台管理工具。很短的时间即可运行并使用起来, 扩展性足以支撑管理上万台服务器,数秒钟即可完成数据传递. 经常被描述为 Func加强版+Puppet精简版。

salt的整个架构都是基于消息来实现.所以能够提供横强的拓展性,灵活性,实时性;不夸了,看实际的slat是什么样的

不过salt还是一个很年轻的东西,还有很多地方不够完善,做的不够好,不过我相信这些都只是时间问题。

注:以下文档仅仅为基本内容,相关知识点的深入学习,请看相应文档连接

salt的安装

安装有很多途径,作为一个centos的用户,我选择rpm

首先添加RPM源:

rpm -ivh http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm

附:实际生产中我是自建源

epel中关于salt的包:

包名

描述

salt-api.noarch

A web api for to access salt the parallel remote execution system

salt-master.noarch

Management component for salt, a parallel remote execution system

salt-minion.noarch

Client component for salt, a parallel remote execution system

salt.noarch

A parallel remote execution system

salt-cloud.noarch

Generic cloud provisioning tool

服务端

安装

yum install salt-master

配置文件
  • 文件名称: /etc/salt/master
  • 配置文件字段选项介绍: http://docs.saltstack.com/ref/configuration/master.html

  • 最基本字段: interface (服务端监听IP)

运行
  • 调试模式:

salt-master  -l debug

后台运行:

salt-master  -d 

作为centos管理员,我选择:

/etc/init.d/salt-master start

master默认监听两个端口, 4505(publish_port)为salt的消息发布系统,4506(ret_port)为salt客户端与服务端通信的端口,所以确保客户端能跟服务端的这2个端口通信

客户端

安装

yum install salt-minion

配置文件
  • 配置文件: /etc/salt/minion
  • 配置文件选项介绍: http://docs.saltstack.com/ref/configuration/minion.html

  • 最基本字段: master: 服务端主机名 id: 客户端主机名(在服务端看到的客户端的名字)

运行

调试模式

salt-minion  -l debug

后台运行

salt-minion  -d  

作为centos管理员,我选择:

/etc/init.d/salt-minion start

注意事项:

  1. minion 默认和主机名salt的主机通信
  2. 关于配置文件
    • salt的配置文件均为yaml风格
    • $key: $value #注意冒号后有一个空格

基础知识

salt minion和master的认证过程:

  1. minion在第一次启动时,会在/etc/salt/pki/minion/下自动生成minion.pem(private key), minion.pub(public key),然后将minion.pub发送给master
  2. master在接收到minion的public key后,通过salt-key命令accept minion public key,这样在master的/etc/salt/pki/master/minions下的将会存放以minion id命名的public key, 然后master就能对minion发送指令了

如下:

启动服务端:

/etc/init.d/salt-minion restart

启动客户端:

/etc/init.d/salt-minion restart

服务端查看key:

# salt-key 
Accepted Keys:
Unaccepted Keys:
minion1
Rejected Keys:

服务端接受key

salt-key -a minion1

测试:

salt 'minion1' test.ping
   minion1:
     True
  • 附:salt更多命令及手册

salt '*' sys.doc

salt的使用

基础知识

targeting

salt '*' test.ping

引号中以实现很强大的minion的过滤与匹配技术

文档:http://docs.saltstack.com/topics/targeting/compound.html

常用命令:

salt 'shell正则' 命令
salt -E 'prel 正则'
salt -N $group 命令
salt -L 'server_id1,server_id2,server_id3'  命令

示例:

salt -C 'webserv* and G@os:Debian or E@web-dc1-srv.*' test.ping

nodegroup

对minion进行分组

文档: http://docs.saltstack.com/topics/targeting/nodegroups.html

在master的配置文件中按如下格式定义:

nodegroups:
  group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com or bl*.domain.com'
  group2: 'G@os:Debian and foo.domain.com'

在state或者pillar中引用的时候如下:

base:
  group1:
    - match: nodegroup    
    - webserver

grains

minion基本信息的管理

文档:http://docs.saltstack.com/topics/targeting/grains.html

基本使用:

salt '*' grains.ls  查看grains分类
salt '*' grains.items 查看grains所有信息
salt '*' grains.item osrelease 查看grains某个信息

示例:

salt '*' grains.item osrelease
  minoin1:
    osrelease: 6.2

在用salt进行管理客户端的时候或者写state的时候都可以引用grains的变量

pillar

salt敏感信息的管理,只有匹配到的节点才能看到和使用

文档:http://docs.saltstack.com/topics/tutorials/pillar.html

默认:pillar数据定义文件存储路径:/srv/pillar

入口文件:/srv/pillar/top.sls

格式:

base:
  "targeting":
    - $pillar            #名字为pillar.sls的文件来存放对匹配到的minion的变量

$pillar.sls

#基本:
$key: $value
#对应state引用方式: {{ pillar['$key'] }} 

#复杂:
users:
  thatch: 1000
  shouse: 1001
  utahdave: 1002
  redbeard: 1003   
#state引用方式:
#{% for user, uid in pillar.get('users', {}).items() %}
#  {{user}}:
#    user.present:
#      - uid: {{uid}}
#{% endfor %}

查看节点的pillar数据:

salt 'client2' pillar.data

同步pillar:

salt '*' saltutil.refresh_pillar

附:这里我们可以看到,pallar中也可以使用jinja(后面会提到)做一些处理

状态管理

state

salt基于minion进行状态的管理

state语法
  • 文档: http://docs.saltstack.com/ref/states/all/index.html

  • 结构:

$ID:  #state的名字
   $state:     #要管理的模块类型
     - $State states #该模块的状态

示例:

vim:
  pkg:    
    {% if grains['os_family'] == 'RedHat' %}    
    - name: vim-enhanced    
    {% elif grains['os'] == 'Debian' %}    
    - name: vim-nox    
    {% elif grains['os'] == 'Ubuntu' %}    
    - name: vim-nox    
    {% endif %}    
    - installed

如果是redhard系列的就安装 vim-enhanced,如果系统是Debian或者Ubuntu就安装vim-nox

附:state默认使用jinja(http://jinja.pocoo.org/ )的模板语法,文档地址: http://jinja.pocoo.org/docs/templates/

state的逻辑关系
  • 文档:http://docs.saltstack.com/ref/states/ordering.html

require:依赖某个state,在运行此state前,先运行依赖的state,依赖可以有多个

httpd:
  pkg:
    - installed
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://httpd/httpd.conf
    - require:
      - pkg: httpd

watch:在某个state变化时运行此模块

redis:
  pkg:
    - latest
  file.managed:
    - source: salt://redis/redis.conf
    - name: /etc/redis.conf
    - require:
      - pkg: redis
    service.running:
      - enable: True
      - watch:
      - file: /etc/redis.conf
      - pkg: redis

附:watch除具备require功能外,还增了关注状态的功能

order:优先级比require和watch低,有order指定的state比没有order指定的优先级高

vim:
  pkg.installed:
    - order: 1

想让某个state最后一个运行,可以用last

highstate

给minion永久下添加状态

文档: http://docs.saltstack.com/ref/states/highstate.html

默认配置文件:/srv/salt/top.sls

语法:

'*':
  - core
  - wsproxy

/srv/salt/目录结构:

├── core.sls
├── top.sls
└── wsproxy    
       ├── init.sls    
       ├── websocket.py
       └── websockify

应用:

salt "minion1" state.highstate

测试模式:

salt "minion1" state.highstate -v test=True

salt schedule

默认的state只有在服务端调用的时候才执行,很多时候我们希望minon自觉的去保持在某个状态

文档:http://docs.saltstack.com/topics/jobs/schedule.html

#cat /srv/pillar/top.sls 
base:
  "*":
    - schedule
#cat /srv/pillar/schedule.sls
schedule:
  highstate:
  function: state.highstate
  minutes: 30

如上配置后,minion会每30分钟从master拉去一次配置,进行自我配置

实时管理

有时候我们需要临时的查看一台或多台机器上的某个文件,或者执行某个命令

cmd.run

  • 用法: salt '$targeting' cmd.run '$cmd'
  • 示例:salt '*' cmd.run 'hostname'

执行下这样的命令,马上就感受到效果了,速度还贼快

module

同时,salt也将一些常用的命令做了集成

  • 文档:http://docs.saltstack.com/ref/modules/all/index.html

这里几乎涵盖了我们所有的常用命令

比如:

#查看所有节点磁盘使用情况
salt '*' disk.usage

无master

  • 文档:http://docs.saltstack.com/topics/tutorials/quickstart.html

主要应该在测试和salt单机管理的时候

salt开发

saltclient管理salt

只有才master才可以,salt全部用python,这里也用python

文档:http://docs.saltstack.com/ref/python-api.html

示例:

import salt.client
client = salt.client.LocalClient()
ret = client.cmd('*', 'cmd.run', ['ls -l'])
print ret

salt api

salt api我现在还没用,不过我也没搞定,如果你搞定了,我会非常感谢你能分享下的。

参考文档

  1. salt中文wiki:http://wiki.saltstack.cn/

    • 很不错的文章:http://wiki.saltstack.cn/reproduction/dive-into-saltstack

  2. salt官网http://saltstack.com/
    • 官网文档:http://docs.saltstack.com/

关于我

author weibo:halfss (http://weibo.com/halfss)

salt交流QQ群:294953305


这篇关于运维自动化之salt的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/397435

相关文章

Python自动化处理手机验证码

《Python自动化处理手机验证码》手机验证码是一种常见的身份验证手段,广泛应用于用户注册、登录、交易确认等场景,下面我们来看看如何使用Python自动化处理手机验证码吧... 目录一、获取手机验证码1.1 通过短信接收验证码1.2 使用第三方短信接收服务1.3 使用ADB读取手机短信1.4 通过API获取

Rust中的Drop特性之解读自动化资源清理的魔法

《Rust中的Drop特性之解读自动化资源清理的魔法》Rust通过Drop特性实现了自动清理机制,确保资源在对象超出作用域时自动释放,避免了手动管理资源时可能出现的内存泄漏或双重释放问题,智能指针如B... 目录自动清理机制:Rust 的析构函数提前释放资源:std::mem::drop android的妙

Python自动化Office文档处理全攻略

《Python自动化Office文档处理全攻略》在日常办公中,处理Word、Excel和PDF等Office文档是再常见不过的任务,手动操作这些文档不仅耗时耗力,还容易出错,幸运的是,Python提供... 目录一、自动化处理Word文档1. 安装python-docx库2. 读取Word文档内容3. 修改

Python自动化办公之合并多个Excel

《Python自动化办公之合并多个Excel》在日常的办公自动化工作中,尤其是处理大量数据时,合并多个Excel表格是一个常见且繁琐的任务,下面小编就来为大家介绍一下如何使用Python轻松实现合... 目录为什么选择 python 自动化目标使用 Python 合并多个 Excel 文件安装所需库示例代码

10个Python自动化办公的脚本分享

《10个Python自动化办公的脚本分享》在日常办公中,我们常常会被繁琐、重复的任务占据大量时间,本文为大家分享了10个实用的Python自动化办公案例及源码,希望对大家有所帮助... 目录1. 批量处理 Excel 文件2. 自动发送邮件3. 批量重命名文件4. 数据清洗5. 生成 PPT6. 自动化测试

10个Python Excel自动化脚本分享

《10个PythonExcel自动化脚本分享》在数据处理和分析的过程中,Excel文件是我们日常工作中常见的格式,本文将分享10个实用的Excel自动化脚本,希望可以帮助大家更轻松地掌握这些技能... 目录1. Excel单元格批量填充2. 设置行高与列宽3. 根据条件删除行4. 创建新的Excel工作表5

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创

Python Invoke自动化任务库的使用

《PythonInvoke自动化任务库的使用》Invoke是一个强大的Python库,用于编写自动化脚本,本文就来介绍一下PythonInvoke自动化任务库的使用,具有一定的参考价值,感兴趣的可以... 目录什么是 Invoke?如何安装 Invoke?Invoke 基础1. 运行测试2. 构建文档3.

Windows自动化Python pyautogui RPA操作实现

《Windows自动化PythonpyautoguiRPA操作实现》本文详细介绍了使用Python的pyautogui库进行Windows自动化操作的实现方法,文中通过示例代码介绍的非常详细,对大... 目录依赖包睡眠:鼠标事件:杀死进程:获取所有窗口的名称:显示窗口:根据图片找元素:输入文字:打开应用:依

Jenkins中自动化部署Spring Boot项目的全过程

《Jenkins中自动化部署SpringBoot项目的全过程》:本文主要介绍如何使用Jenkins从Git仓库拉取SpringBoot项目并进行自动化部署,通过配置Jenkins任务,实现项目的... 目录准备工作启动 Jenkins配置 Jenkins创建及配置任务源码管理构建触发器构建构建后操作构建任务