zoukankan      html  css  js  c++  java
  • day33-20180626笔记

    笔记:Saltstack二次开发

    一、saltstack简介

    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的密钥安装
    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证书请求


    
    
    四、saltstack的配置文件详解
    Saltstack占用两个端口4505和4506
    1. 确保master端的4505和4506端口开通
    2. Minion的key确实别master接受
    3. 通过test.ping 模块,双方都可以ping通

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


    五、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
    1. cmd模块
    salt  ‘*’ cmd.run “df -h”

    2. ping模块
    salt ‘*’ test.ping –t 5

    3. 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 
    4. 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   (写全没效果)


    5.dnsutil模块
    salt '*' dnsutil.hosts_append /etc/hosts 127.0.0.1 xiang.com
    salt '*' dnsutil.hosts_remove /etc/hosts xiang.com
    6. 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
    7.network模块:
    salt '*' network.dig www.qq.com
    salt '*' network.ping www.qq.com
    salt '*' network.ip_addrs

    8.pkg包管理模块:
    管理yum, apt-get等
    salt '*' pkg.install php
    salt '*' pkg.remove php
    salt '*' pkg.upgrade    (升级所有的软件包)
    9.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
    
    
    六、saltstack的api
    Salt-api有两种方式,一种是函数的形式,有人家定义好的函数,我们可以直接调用,直接写python代码调用函数或者类就可以了。
    第二种形式是salt-api有封装好的http协议的,我们需要启动一个服务端。

    安装:
    yum install –y salt-api


    加载master的配置文件
    import salt.config
    master_opts = salt.config.client_config(‘/etc/salt/master’)
    print(‘master_opts’)

    2. 加载minion的配置文件
    import salt.config
    Minion_opts = salt.config.minion_config(‘/etc/salt/minion’)
    
    
    3. 在master上执行各种模块:
    >>> import salt.client
    >>> local = salt.client.LocalClient(‘/etc/salt/minion’)#不加也可以,加上最好
    >>> local.cmd('*', "test.ping")
    {'192.168.48.129': True}
    >> local.cmd('*', "cmd.run", "w")
    {'192.168.48.129': ' 12:17:38 up 5:58, 1 user, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.48.1 11:14 2:50 0.89s 0.89s python'}

    如果一次要执行多个模块
    local.cmd('*', ['test.ping', 'cmd.run'], [[], ['whoami']])
    {'192.168.48.129': {'test.ping': True, 'cmd.run': 'root'}}

    自定义的模块:
    >>> local.cmd('*', "jd.meminfo", "")
    {'192.168.48.129': {'meminfo': '0.31'}}
    
    
    4. 如果对于执行时间过长,没法直接返回的,我们就可以通过异步执行的形式进行返回
    cmd_async和get_cache_returns(jid)
    一下代码只能只能在master上执行,而且是只能在master上才可以使用
    __opts__ = salt.config.minion_config('/etc/salt/minion')
    conf_file = __opts__['conf_file']
    client = salt.client.LocalClient(conf_file)
    jid = client.cmd_async(minion, function, params)
    wait_time = 0
    sleep_interval = 1
    while wait_time < timeout:
    print('wait {0} seconds'.format(sleep_interval))
    time.sleep(sleep_interval)
    returns = client.get_cache_returns(jid)
    if returns:
    return returns
    wait_time += sleep_interval
    5. 客户端执行salt命令:

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

    类似shell命令的salt-call,可以在minion端执行salt的命令,测试连通性什么的
    
    
    6. Master端执行salt-run

    >>> import salt.config
    >>> import salt.runner
    >>> __opts__ = salt.config.client_config('/etc/salt/master')
    >>> runermaster = salt.runner.RunnerClient(__opts__)
    >>> runnerMaster.cmd('jobs.list_jobs', [])
    查看所有的
    >>>runnerMaster.cmd('manage.status')
    down:
    up:
    - 192.168.48.129
    {'down': [], 'up': ['192.168.48.129']}

    7. Grains
    >>> import salt.config
    >>> import salt.loader
    >>> __opts__ = salt.config.minion_config("/etc/salt/minion")
    >>> __grains__ = salt.loader.grains(__opts__)
    >>> __grains__['id']
    '192.168.48.129‘
    其他的一些变量
    import salt.config
    import salt.loader

    __opts__ = salt.config.minion_config('/etc/salt/minion')
    __grains__ = salt.loader.grains(__opts__)
    __opts__['grains'] = __grains__
    __utils__ = salt.loader.utils(__opts__)
    __salt__ = salt.loader.minion_mods(__opts__, utils=__utils__)
    __salt__['test.ping']()


    7. Salt的内置环境变量:
    在python的交互环境中,这些变量是不生效的,只有在自定义的模块,活着salt执行时才生效

    __opts__ 配置文件,类型
    __salt__ 执行modules
    __salt__['cmd.run']('fdisk -l')
    __salt__['network.ip_addrs']()
    __pillar__ pillar
    __grains__ grains

    __context__
    if not 'cp.fileclient' in __context__:
    __context__['cp.fileclient'] = salt.fileclient.get_file_client(__opts__)

    六、saltstack的httpapi
    在官网跟新yum源信息:
    yum安装
    yum install -y gcc make python-devel libffi-devel salt-api openssl
    pip install cherrypy

    生成证书:
    #cd /etc/salt
    #mkdir keycrt
    #cd keycrt
    #openssl genrsa –out key.pem 4096
    #openssl req –new –x 509 –key key.pem –out cert.pem –days 1826


    3. 配置用户以及权限:
    首先需要在master上检查配置文件:
    default_include: master.d/*.conf
    interface: 192.168.48.128
    conf_file: /etc/salt/master
    pki_dir: /etc/salt/pki/master
    auto_accept: True
    file_roots:
    base:
    - /srv/salt/
    log_file: /var/log/salt/master
    log_level_logfile: debug
    
    
    b. 配置salt-api的配置文件:
    [root@localhost master.d]# cd /etc/salt/master.d/
    [root@localhost master.d]# ls
    api.conf eauth.conf
    [root@localhost master.d]#
    [root@localhost master.d]# cat api.conf
    rest_cherrypy:
    port: 8000
    ssl_crt: /etc/salt/keycrt/cert.pem
    ssl_key: /etc/salt/keycrt/key.pem
    [root@localhost master.d]# cat eauth.conf
    external_auth:
    pam:
    saltapi:
    - .*
    - '@wheel'
    - '@runner'
    
    
    创建用户:
    c. 创建用户
    useradd -M -s /sbin/nologin/ saltapi
    echo “saltapi” |passwd saltapi --stdin


    注意这个应用名和上面的saltapi要对应一致。

    启动salt-api

    systemctl restart salt-api
    netstat –anp |grep 8000

    对于ubuntu系统,我们可能使用https也是没法使用,我们可以使用http协议,具体的配置如下:
    root@ling-virtual-machine:/etc/salt/master.d# cat api.conf
    rest_cherrypy:
    port: 8000
    disable_ssl: True
    #ssl_crt: /etc/salt/keycrt/cert.pem
    #ssl_key: /etc/salt/keycrt/key.pem


    注意以上的: disable_ssl: True
    然后把ssl秘钥和公钥注释掉,eauth.conf不发生变化

    获取tocken:   http协议的
    curl -X POST -k http://192.168.48.134:8000/login -d username='saltapi' -d password='saltapi' -d eauth='pam' |python -mjson.tool
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    100 240 100 197 100 43 45 9 0:00:04 0:00:04 --:--:-- 45
    {
    "return": [
    {
    "eauth": "pam",
    "expire": 1517235285.554001,
    "perms": [
    ".*",
    "@wheel",
    "@runner"
    ],
    "start": 1517192085.554001,
    "token": "105ee1f28109d67855ce7898e75e173a678f5174",
    "user": "saltapi"
    }
    ]
    }

    获取tokon:   https协议的(centos7)
    [root@localhost master.d]# curl -X POST -k https://192.168.48.131:8000/login -d username='saltapi' -d password='saltapi' -d eauth='pam' |python -mjson.tool
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    100 240 100 197 100 43 908 198 --:--:-- --:--:-- --:--:-- 912
    {
    "return": [
    {
    "eauth": "pam",
    "expire": 1517235312.537542,
    "perms": [
    ".*",
    "@wheel",
    "@runner"
    ],
    "start": 1517192112.537541,
    "token": "bd5922438e9ae10db039816728c2b86f9462a0bb",
    "user": "saltapi"
    }
    ]
    }

    通过postman来获取token

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

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

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


    通过curl来获取执行module:
    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='local' -d tgt='*' -d fun='test.ping'
    return:
    192.168.48.129: true

    运行runner
    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'
    return:
    - down: []
    up:
    - 192.168.48.129
    
    



  • 相关阅读:
    Shell脚本实现用户数据导入
    Sping Cloud 微服务框架学习
    Redis学习笔记
    HTML+CSS实现简单三级菜单
    CSS Float浮动所带来的奇怪现象
    CSS如何清除浮动流的多种方案
    ECMAScript/JS 基础知识讲解
    Python的生成器
    Python包的导入说明
    Paramiko模块简单使用
  • 原文地址:https://www.cnblogs.com/ivan-yang/p/9240464.html
Copyright © 2011-2022 走看看