一、salt的概念

  salt是一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的报被安装,指定的服务在运行)。一个分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则挑选出来的节点)上执行命令和查询数据。开发其的目的是为远程执行提供最好的解决方案,并使远程执行变得更好,更快,更简单。

  saltstack(中国用户组www.saltstack.cn)基于Python开发,c/s架构支持多平台,比puppet轻量,在远程执行命令时非常快捷,配置和使用比puppet容易,能实现puppet几乎所有的功能。

  saltstack的优势:有master端和minion端,执行的信息比较稳定,不容易丢失信息,或者出现失联主机的情况;有封装好的http-api,可以直接启动salt-api就可以通过http协议进行调用。不需要进行第二次的封装。

二、saltstack的安装

  基于centos6和centos7的差异,在两个不同的操作系统中安装saltstack也是不一样的

  参考网址:https://docs.saltstack.com/en/latest/topics/installation/rhel.html
  centos6需要先安装扩展源,然后在进行安装:

  Master端:

      yum install -y salt-master

      yum install -y salt-api

  Minion端:

      yum install -y salt-minion

  源码安装:http://note.youdao.com/noteshare?id=881bbdbb6fd7bca9f74360aa052b79a4&sub=EEDE33154E13432FA9198021015C5C25
 

三、saltstack的设置

  1.master与minion的认证

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

  salt-key -L 或者salt-key 显示所有的key
  salt-key -D :删除所有认证主机id证书
  salt-key -d keys_values -y
  salt-key -A:接收所有id证书请求
  salt-key -a id :接受单个id证书请求

  2.saltstack远程执行机器

  (1)-E, --pcre,通过正则表达式进行匹配:
  salt -E 'web(9|10)*' test.ping -t 1
  (2)-L, --list, 主机id进行过滤:
  salt -L "*app*" cmd.run "df -h"
  (3) -G, --grain, 根据被控主机的grains信息进行过滤
  salt -G 'role:nginx' cmd.run "ls /export"
  (4) -I, --pillar, 根据被控主机的pillar信息进行过滤
  salt -I 'myname:xiang' test.ping -t 5
  (5) -S, --ipcidr, 根据minion的ip地址进行匹配
  salt -S 192.168.1.1 test.ping
  salt -S 192.168.1.0/24 test.ping
  salt -S 192.168.0.0/16 test.ping
  salt -S 192.0.0.0/8 test.ping
  (6)检查客户端是否挂掉:
  salt-run manage.status |head
  salt-run manage.down

  3.saltstack配置文件详解

  saltstack占用两个端口4505和4506:

  确保master端的4505和4506端口开通
   Minion的key确实别master接受
  通过test.ping 模块,双方都可以ping通

  配置文件详解:http://note.youdao.com/noteshare?id=ef288d8d0abb8f3e8bf6aa5b87bfabd3&sub=wcp1478526434731795

  4.saltstack的几种模块介绍

  Runner 模块     在master端执行的  salt-run
  Module 模块    通过master同步到minion端, 在minion执行
         salt-call saltutil.sync_modules
         salt-call saltutil.sync_all:包括:beacons:
         clouds:    engines:    grains:    log_handlers:    modules:
         output:    proxymodules:    renderers:    returners:    sdb:
         states:    utils:

  Grins 模块    记录minion的属性key:value
  Pillar模块      记录所有minion通用的属性,然后同步到minion端
        salt-call saltutil.refresh_pillar
        salt ‘*’ saltutil.refresh_pillar

    cmd模块       salt  ‘*’ cmd.run “df -h”
    ping模块  salt ‘*’ test.ping –t 5
      cp 模块
        file_roots:
        base:
        - /export/salt/root
        salt根目录:在master中file_roots定义的路径,salt://test.txt相当于/export/salt/root/test.txt
        salt 'wms5test1.app.172.17.23.176' cp.get_file salt://nscd.conf /tmp/xiang.txt

  

  cron模块:
        salt '*' cron.raw_cron root     (查看定时任务)
        salt '*' cron.set_job root '*' '*' '*' '*' 1 /export/scripts/rm_log.sh
        salt '*' cron.rm_job root /export/scripts/rm_log.sh   (写全没效果)

  dnsutil模块
        salt '*' dnsutil.hosts_append /etc/hosts 127.0.0.1 xiang.com
        salt '*' dnsutil.hosts_remove /etc/hosts xiang.com

  file模块:
        salt '*' file.chown /etc/passwd root root
        salt '*' file.copy /path/to/src /path/to/dst
        salt '*' file.file_exists /etc/hosts
        salt '*' file.directory_exists /etc/
        salt '*' file.get_mod /etc/passwd
        salt '*' file.set_mod /etc/passwd 0644
        salt '*' file.mkdir /tmp/test
        salt '*' file.sed /export/servers/nginx/conf/nginx.conf 'debug' 'warn'
        salt '*' file.append /tmp/test.txt "welcome xiang"
        salt '*' file.remove /tmp/1.txt

  network模块:
        salt '*' network.dig www.qq.com
        salt '*' network.ping www.qq.com
        salt '*' network.ip_addrs

  pkg包管理模块:
        管理yum, apt-get等
        salt '*' pkg.install php
        salt '*' pkg.remove php
        salt '*' pkg.upgrade    (升级所有的软件包)

  service模块
        salt '*' service.enable nginx
        salt '*' service.disable nginx
        salt '*' service.restart nginx

  Grains模块
        自定义grians(在minion上定义的)
        grains是在minion启动时搜集一些信息,如操作系统类型,网卡,内核版本,cpu架构等
        salt "*" grains.ls    列出所有grains项目名字
        salt "*app.*" grains.items  列出所有grains项目以及值
        grains的信息并不是动态的,并不会实时变化,它只是在minion启动时收集到的
        我们可以根据grains收集到的一些信息,做一些配置管理工作
        在minion上:vim /etc/salt/grains
        role: nginx
        env: test
        重启service salt-minion restart
        获取grians:
        salt "*" grains.item role env
        或者:
        salt -G "*" role:nginx cmd.run "hostname“
        salt ‘*’grains.items

  Pillar模块
        pillar(在master上定义)(yaml语法)
        在配置文件中找pillar的文件路劲:

        找到以后,mkdir  /export/salt/pillar
        vim top.sls
        base:
        "*":
        - test
        vim test.sls
        conf: xiang
        然后刷新pillar: salt '*' saltutil.refresh_pillar
        验证:salt '*' pillar.items conf
        或者: salt -I 'conf:xiang' test.ping

  5.saltstack的api

  salt-api有两种方式,一种是函数的形式,有定义好的函数,可以直接调用,直接写Python代码调用函数或者类就可以了。

  第二种形式是salt-api有封装好的http协议,需要启动一个服务端

  (1)加载master的配置文件

  1. import salt.config
  2. master_opts = salt.config.client_config(‘/etc/salt/master’)
  3. print(‘master_opts’)

  (2)加载minion的配置文件

  1. import salt.config
  2. Minion_opts = salt.config.minion_config(‘/etc/salt/minion’)

  (3)在master上执行各种模块

  

  1. >>> import salt.client
  2. >>> local = salt.client.LocalClient(‘/etc/salt/minion’)#不加也可以,加上最好
  3. >>> local.cmd('*', "test.ping")
  4. {'192.168.48.129': True}
  5. >> local.cmd('*', "cmd.run", "w")
  6. {'192.168.48.129': ' 12:17:38 up 5:58, 1 user, load average: 0.00, 0.01, 0.05\nUSER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT\nroot pts/0 192.168.48.1 11:14 2:50 0.89s 0.89s python'}

  如果一次要执行多个模块

  1. local.cmd('*', ['test.ping', 'cmd.run'], [[], ['whoami']])
  2. {'192.168.48.129': {'test.ping': True, 'cmd.run': 'root'}}

  自定义的模块

  1. >>> local.cmd('*', "jd.meminfo", "")
  2. {'192.168.48.129': {'meminfo': '0.31'}}

  (4)如果对与执行时间过长,没法直接返回的,我们就可以通过异步执行的形式进行返回cmd_async和get_cache_returns(jid)
  一下代码只能只能在master上执行,而且是只能在master上才可以使用

  1. __opts__ = salt.config.minion_config('/etc/salt/minion')
  2. conf_file = __opts__['conf_file']
  3. client = salt.client.LocalClient(conf_file)
  4. jid = client.cmd_async(minion, function, params)
  5. wait_time = 0
  6. sleep_interval = 1
  7. while wait_time < timeout:
  8. print('wait {0} seconds'.format(sleep_interval))
  9. time.sleep(sleep_interval)
  10. returns = client.get_cache_returns(jid)
  11. if returns:
  12. return returns
  13. wait_time += sleep_interval

  (5)客户端执行salt命令

  1. >>> import salt.config
  2. >>> import salt.client
  3. >>> caller = salt.client.Caller(‘/etc/salt/minion’)
  4. >>> caller.cmd("test.ping")
  5. True

  类似于shell命令的salt-call,可以在minion端执行ssh命令,测试连通性

  (6)master端执行salt-run

  1. >>> import salt.config
  2. >>> import salt.runner
  3. >>> __opts__ = salt.config.client_config('/etc/salt/master')
  4. >>> runermaster = salt.runner.RunnerClient(__opts__)
  5. >>> runnerMaster.cmd('jobs.list_jobs', [])
  6. 查看所有的
  7. >>>runnerMaster.cmd('manage.status')
  8. down:
  9. up:
  10. - 192.168.48.129
  11. {'down': [], 'up': ['192.168.48.129']}

  (7)Grains

  1. >>> import salt.config
  2. >>> import salt.loader
  3. >>> __opts__ = salt.config.minion_config("/etc/salt/minion")
  4. >>> __grains__ = salt.loader.grains(__opts__)
  5. >>> __grains__['id']
  6. '192.168.48.129‘
  7. 其他的一些变量
  8. import salt.config
  9. import salt.loader
  10.  
  11. __opts__ = salt.config.minion_config('/etc/salt/minion')
  12. __grains__ = salt.loader.grains(__opts__)
  13. __opts__['grains'] = __grains__
  14. __utils__ = salt.loader.utils(__opts__)
  15. __salt__ = salt.loader.minion_mods(__opts__, utils=__utils__)
  16. __salt__['test.ping']()

  (8)saltstack的内置变量

  在Python的交互环境中,这些变量是不生效的,只有在自定义的模块,或者salt执行时才生效

  1. __opts__ 配置文件,类型
  2. __salt__ 执行modules
  3. __salt__['cmd.run']('fdisk -l')
  4. __salt__['network.ip_addrs']()
  5. __pillar__ pillar
  6. __grains__ grains
  7.  
  8. __context__
  9. if not 'cp.fileclient' in __context__:
  10. __context__['cp.fileclient'] = salt.fileclient.get_file_client(__opts__)

四、saltstack的httpapi

  1.在官网更新yum源信息

  2.yum安装:

  1. yum install -y gcc make python-devel libffi-devel salt-api openssl
  2. Pip install cherrypy

  生成证书

  1. #cd /etc/salt
  2. #mkdir keycrt
  3. #cd keycrt
  4. #openssl genrsa –out key.pem 4098
  5. #openssl req –new –x 509 –key key.pem –out cert.pem –days 1826

  3.配置用户以及权限

  a.首先需要在master上检查配置文件

  1. default_include: master.d/*.conf
  2. interface: 192.168.48.128
  3. conf_file: /etc/salt/master
  4. pki_dir: /etc/salt/pki/master
  5. auto_accept: True
  6. file_roots:
  7. base:
  8. - /srv/salt/
  9. log_file: /var/log/salt/master
  10. log_level_logfile: debug

  b.配置salt-api的配置文件

  1. #cd /etc/salt/master.d/
  2. #ls
  3. api.conf eauth.conf
  4. # cat api.conf
  5. rest_cherrypy:
  6. port: 8000
  7. ssl_crt: /etc/salt/keycrt/cert.pem
  8. # cat eauth.conf
  9. external_auth:
  10. pam:
  11. saltapi:
  12. - .*
  13. - '@wheel'
  14. - '@runner'

  c.创建用户

  1. useradd -M -s /sbin/nologin/ saltapi
  2. echo saltapi |passwd saltapi --stdin

  注:这个用户名和上面的saltapi要对应一致

  d.启动salt-api

  1. systemctl restart salt-api
  2. netstat anp |grep 8000

  4.对于Ubuntu系统,可能使用https也是没法使用的,我们可以使用http协议,具体配置如下:

  1. # cat api.conf
  2. rest_cherrypy:
  3. port: 8000
  4. disable_ssl: True
  5. #ssl_crt: /etc/salt/keycrt/cert.pem
  6. #ssl_key: /etc/salt/keycrt/key.pem
  7.  
  8. 注意以上的: disable_ssl: True
  9. 然后把ssl秘钥和公钥注释掉,eauth.conf不发生变化

  a.获取tocken:http协议的

  1. curl -X POST -k http://192.168.48.134:8000/login -d username='saltapi' -d password='saltapi' -d eauth='pam' |python -mjson.tool
  2. % Total % Received % Xferd Average Speed Time Time Time Current
  3. Dload Upload Total Spent Left Speed
  4. 100 240 100 197 100 43 45 9 0:00:04 0:00:04 --:--:-- 45
  5. {
  6. "return": [
  7. {
  8. "eauth": "pam",
  9. "expire": 1517235285.554001,
  10. "perms": [
  11. ".*",
  12. "@wheel",
  13. "@runner"
  14. ],
  15. "start": 1517192085.554001,
  16. "token": "105ee1f28109d67855ce7898e75e173a678f5174",
  17. "user": "saltapi"
  18. }
  19. ]
  20. }

  获取tocken:http协议的(centos7的)

  1. ]# curl -X POST -k https://192.168.48.131:8000/login -d username='saltapi' -d password='saltapi' -d eauth='pam' |python -mjson.tool
  2. % Total % Received % Xferd Average Speed Time Time Time Current
  3. Dload Upload Total Spent Left Speed
  4. 100 240 100 197 100 43 908 198 --:--:-- --:--:-- --:--:-- 912
  5. {
  6. "return": [
  7. {
  8. "eauth": "pam",
  9. "expire": 1517235312.537542,
  10. "perms": [
  11. ".*",
  12. "@wheel",
  13. "@runner"
  14. ],
  15. "start": 1517192112.537541,
  16. "token": "bd5922438e9ae10db039816728c2b86f9462a0bb",
  17. "user": "saltapi"
  18. }
  19. ]
  20. }

  b.通过postman来获取tocken

  Headers里面是用来存放headers的信息的
  Body里面来存放数据的,常用的data数据就是x-www-form-urlencoded

  form-data 是用来存放页面form表单数据的

  只要salt-api不重启,tocken就不会过期,salt-api重启以后,tocken就会过期

  c.通过postman来获取执行module

  c.通过curl来获取执行module

  1. # curl -k http://192.168.48.134:8000 -H "Accept: application/x-yaml" -H "X-Auth-Token: ec623ed62de7dd62cfdadb94ad0044b7f46c9549" -d client='local' -d tgt='*' -d fun='test.ping'
  2. return:
  3. 192.168.48.129: true
  4.  
  5. 运行runner
  6. root@ling-virtual-machine:/etc/salt/master.d# curl -k http://192.168.48.134:8000 -H "Accept: application/x-yaml" -H "X-Auth-Token: ec623ed62de7dd62cfdadb94ad0044b7f46c9549" -d client='runner' -d fun='manage.status'
  7. return:
  8. - down: []
  9. up:
  10. - 192.168.48.129

  

python之saltstack二次开发的更多相关文章

  1. saltstack自动化运维系列⑩SaltStack二次开发初探

    saltstack自动化运维系列⑩SaltStack二次开发初探 1.当salt运行在公网或者网络环境较差的条件下,需要配置timeout时间vim /etc/salt/master timeout: ...

  2. Python什么是二次开发的意义?python在.net项目采用

    任何人都知道python在.net该项目是做什么的啊? 辅助用途,用作"二次开发"..net站点的话python主要是CGI才用.能够用python编写B/S程序. 解释一下二次开 ...

  3. Autocad中使用命令来调用python对Autocad二次开发打包后的exe程序

    在Autocad中直接调用Python二次开发程序是有必要的,下面介绍一种方法来实现这个功能: 其基本思路是:先将二次开发的程序打包为可执行程序exe,然后编写lsp文件,该文件写入调用exe程序的语 ...

  4. saltstack二次开发(一)

    Saltstack简介 Salt是一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的包被安装,指定的服务在运行),一个分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则 ...

  5. saltstack二次开发(三)

    以下代码实现的功能: 通过saltstack的httpapi在minion上安装软件. vim saltapi.py #!/usr/bin/env python # -*- coding: utf-8 ...

  6. saltstack二次开发(二)

    Saltstack的api Salt-api有两种方式,一种是函数的形式,有人家定义好的函数,我们可以直接调用,直接写python代码调用函数或者类就可以了.第二种形式是salt-api有封装好的ht ...

  7. Python之虚拟机操作:利用VIX二次开发,实现自己的pyvix(系列一)成果展示和python实例

    在日常工作中,需要使用python脚本去自动化控制VMware虚拟机,现有的pyvix功能较少,而且不适合个人编程习惯,故萌发了开发一个berlin版本pyvix的想法,暂且叫其OpenPyVix.O ...

  8. [Python] 利用Django进行Web开发系列(二)

    1 编写第一个静态页面——Hello world页面 在上一篇博客<[Python] 利用Django进行Web开发系列(一)>中,我们创建了自己的目录mysite. Step1:创建视图 ...

  9. 程序员带你十天快速入门Python,玩转电脑软件开发(二)

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...

随机推荐

  1. Bootstrap Multiselect

    Getting Started Link the Required Files First, the jQuery library needs to be included. Then Twitter ...

  2. 几句代码简单实现IoC容器

    前言 最近在调试EasyNetQ代码的时候发现里面有一段代码,就是IoC容器的简单实现,跟着他的代码敲了一遍,发现了奇妙之处.当然也是因为我才疏学浅导致孤陋寡闻了.他的思路就是通过动态调用构造函数生成 ...

  3. jpa多条件查询

    首先继承JpaSpecificationExecutor<T>接口 需要用到JpaSpecificationExecutor<T>中的Page<T> findAll ...

  4. Spring通过注解装配Bean

    通过注解实现ServiceImpl业务 一.使用@Component装配Bean 1. 定义类:User 在类上面加@Component注解,在属性上面加@Value值 package com.wbg ...

  5. PAT——1016. 部分A+B

    正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA.例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6. 现给定A.DA.B.DB,请编 ...

  6. rabbitmq+topic+java

    可参照github代码:https://github.com/rabbitmq/rabbitmq-tutorials/blob/master/java/EmitLogTopic.java 1. 新建m ...

  7. Jstorm TimeCacheMap源代码分析

    /*** Eclipse Class Decompiler plugin, copyright (c) 2016 Chen Chao (cnfree2000@hotmail.com) ***/ pac ...

  8. react 之 ref

    react提供一个refs的安全口,做到‘接触’或调用 从render()返回的组件实例的方法.DOM节点. 用法:1. ref Callback属性 ref 属性可以是一个回调函数,此函数会在这个组 ...

  9. jsp内置对象pageContext如何在Servlet中获取值

    pageContext javax.servlet.jsp.PageContext 的实例,该对象代表该JSP 页面上下文,使用该对象可以访问页面中的共享数据.常用的方法有getServletCont ...

  10. JS异步编程 (2) - Promise、Generator、async/await

    JS异步编程 (2) - Promise.Generator.async/await 上篇文章我们讲了下JS异步编程的相关知识,比如什么是异步,为什么要使用异步编程以及在浏览器中JS如何实现异步的.最 ...