saltstack

基于python开发的,用于批量控制管理服务器 . saltstack与ansible对比

saltstack系统中的角色

salt-master : 管理端

salt-minion : 被管理端

salt-syncdic: salt代理(用于分布式管理)

分布式部署:

认证

saltstack系统中的角色之间采用证书的方式认证(安全)

认证方式:salt-minion向salt-master发送证书申请,salt-master签收证书

部署

参考: Salt Project Package Repo

sudo rpm --import https://repo.saltproject.io/py3/redhat/8/x86_64/latest/SALTSTACK-GPG-KEY.pub

curl -fsSL https://repo.saltproject.io/py3/redhat/8/x86_64/latest.repo | sudo tee /etc/yum.repos.d/salt.repo

sudo yum clean expire-cache

salt-minion, salt-master, 及其他 Salt 组件

sudo yum install salt-master
sudo yum install salt-minion
sudo yum install salt-ssh
sudo yum install salt-syndic
sudo yum install salt-cloud
sudo yum install salt-api   # 提供saltstackt https python 调用

主机安装salt-master,salt-api 被管控机安装salt-minion

若无法安装可使用如下方式安装 依赖地址

yum install https://repo.saltproject.io/py3/redhat/7/x86_64/3001/salt-master-3001.8-1.el7.noarch.rpm

yum install https://repo.saltproject.io/py3/redhat/7/x86_64/3001/salt-api-3001.8-1.el7.noarch.rpm

  salt-master.noarch 0:3001.8-1.el7   
  hwdata.x86_64 0:0.252-9.7.el7             libtirpc.x86_64 0:0.2.4-0.16.el7           
  pciutils.x86_64 0:3.5.1-3.el7             pciutils-libs.x86_64 0:3.5.1-3.el7         
  python3.x86_64 0:3.6.8-18.el7             python3-libs.x86_64 0:3.6.8-18.el7         
  python3-pip.noarch 0:9.0.3-8.el7          python3-setuptools.noarch 0:39.2.0-10.el7  
  python36-PyYAML.x86_64 0:3.13-1.el7       python36-chardet.noarch 0:3.0.4-12.el7     
  python36-distro.noarch 0:1.5.0-1.el7      python36-idna.noarch 0:2.10-1.el7          
  python36-jinja2.noarch 0:2.11.1-1.el7     python36-m2crypto.x86_64 0:0.35.2-5.el7    
  python36-markupsafe.x86_64 0:0.23-4.el7   python36-msgpack.x86_64 0:0.6.2-2.el7      
  python36-psutil.x86_64 0:5.6.7-1.el7      python36-pycurl.x86_64 0:7.43.0-8.el7      
  python36-pysocks.noarch 0:1.6.8-7.el7     python36-requests.noarch 0:2.14.2-2.el7    
  python36-six.noarch 0:1.14.0-3.el7        python36-urllib3.noarch 0:1.25.6-2.el7     
  python36-zmq.x86_64 0:17.0.0-5.el7        salt.noarch 0:3001.8-1.el7                 
  systemd-python.x86_64 0:219-78.el7_9.5   

yum install pyOpenSSL  # salt-api 使用,用于提供https

日志位置:

/var/log/salt

启动 salt-master:

systemctl start salt-master.service

salt-master 默认使用的端口: 4505(用于内部通信),4506(用于与minion通信)

启动 salt-minion:

修改minion配置文件 vim /etc/salt/minion ,配置主机信息

master: 主机IP

id: minion自己的IP

启动 minion:systemctl start salt-minion.service 

删除salt-key
删除指定minion的key
salt-key -d salt-minion2.example.com
删除所有minion的key
salt-key -D -y

证书签收

master配置自动接收minion key

minion启动后会向master发送证书,master需要签收证书才能实现对minion的管控

master查看证书信息: salt-key -L

Accepted Keys:  # 已经接收的
Denied Keys:    # 已经拒绝的
Unaccepted Keys:# 未接收的
Rejected Keys:

签收证书: salt-key -A -y

salt-minion 和salt-master 认证机制如下:

  1. minion端生成一个秘钥对,并产生一个ID值,minion服务会安装ID值命名的公钥发送给 master ,直到接受为止
  2. master认证完毕后,会将minion 端发送来的,以ID值命名的公钥存放在 /etc/salt/pki/master/minions 目录中
  3. master认证完毕后,会将自身的公钥发送给 minion,并存储为 /etc/salt/pki/minion/minion_master.pub.
  4. master 秘钥对默认存储在/etc/salt/pki/master/master.pub /etc/salt/pki/master/master.pem(salt master私钥)
  5. master 端认证的公钥存储在:/etc/salt/pki/master/minions/
  6. minion 秘钥对默认存储在/etc/salt/pki/minion/minion.pub /etc/salt/pki/minion/minion.pem(salt minion私钥)
  7. minion 存放的master公钥/etc/salt/pki/minion/minion_master.pub

其他命令

grains 用于保存minion的信息(系统版本,内存大小,CPU个数等信息)

salt '192.168.3.44' grains.items

常用模块

查看所有模块:

salt '192.168.3.44' sys.list_modules  

acl,    aliases,    alternatives,    apache,    archive,    artifactory,    blockdev,    btrfs,    buildout,   cloud,    cmd,    composer,    config,    container_resource,    cp,    cron,    data,    defaults,  devmap,    dig,    disk,    django,    dnsmasq,    dnsutil,    drbd,    elasticsearch,    environ,  etcd,    event,    extfs,    file,   gem,    genesis,    git,    grains,    group,    grub,    hashutil,  hg,    hipchat,    hosts,    http,    img,    incron,    ini,    introspect,    ip,    iptables,    jboss7,  jboss7_cli,    key,    kmod,    locale,    locate,    logrotate,    lowpkg,    match,    mine,  modjk,    mount,    network,    openstack_config,    pagerduty,    pillar,    pip,    pkg,   pkg_resource,    postfix,    publish,    puppet,    pyenv,    raid,    random,    random_org,  rbenv,    ret,    rsync,    runit,    rvm,    s3,    saltutil,    schedule,    scsi,    sdb,    seed, selinux,    serverdensity_device,    service,    shadow,    slack,    smtp,    sqlite3,    ssh,  state,    status,   supervisord,    sys,    sysctl,    syslog_ng,    system,    test,    timezone,  user,    vbox_guest,    virtualenv,    webutil,    xfs

查看模块提供的常用方法:

salt '192.168.3.44' sys.list_functions user  #查看user模块提供的方法

查看具体方法的使用说明:

salt '192.168.3.44' sys.doc user.add

test.ping 测试minion通信

salt '*' test.ping

cmd.run 执行命令

salt '*' cmd.run 'df -h'
salt '*' cmd.run 'netstat -antp |grep python'
salt '*' cmd.run 'rpm -q vsftpd'
...

pkg 软件管理模块

salt '*' pkg.install vsftpd  # 安装vsftpd

服务管理模块 sevice

salt '*' service.start vsftpd
salt '*' service.stop vsftpd
salt '*' service.status vsftpd

常用模块命令及API

 salt-api

生成https秘钥

cd /etc/pki/tls/certs/
[root@localhost certs]# make testcert  # 生成证书
umask 77 ; \
/usr/bin/openssl genrsa -aes128 2048 > /etc/pki/tls/private/localhost.key
Generating RSA private key, 2048 bit long modulus
................................+++
.+++
e is 65537 (0x10001)
Enter pass phrase:  # 密码
Verifying - Enter pass phrase:  # 确认密码
umask 77 ; \
/usr/bin/openssl req -utf8 -new -key /etc/pki/tls/private/localhost.key -x509 -days 365 -out /etc/pki/tls/certs/localhost.crt 
Enter pass phrase for /etc/pki/tls/private/localhost.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:bj
Locality Name (eg, city) [Default City]:bj
Organization Name (eg, company) [Default Company Ltd]:bj
Organizational Unit Name (eg, section) []:bj         
Common Name (eg, your name or your server's hostname) []:salt-master
Email Address []:bj@qq.com

将有密码秘钥改完无密码可使用

cd /etc/pki/tls/private
[root@localhost private]# openssl rsa -in localhost.key -out localhost-nopass.key 
Enter pass phrase for localhost.key:  # 上一步设置的密码
writing RSA key


chmod 644 /etc/pki/tls/certs/localhost.crt /etc/pki/tls/private/localhost.key /etc/pki/tls/private/localhost-nopass.key 

创建salt-api的系统用户,用来认证

useradd -M -s /sbin/nologin saltapi
passwd saltapi

编辑salt-api相关配置文件

vim /etc/salt/master

default_include: master.d/*.conf
vim /etc/salt/master.d/eauth.conf

external_auth:
    pam:          # 使用pam模块认证
        saltapi:  # 认证用户
            - .*  # 认证用户saltapi可使用的模块
vim /etc/salt/master.d/api.conf
rest_cherrypy:
    port: 8001   # salt-api使用的端口
    ssl_crt: /etc/pki/tls/certs/localhost.crt
    ssl_key: /etc/pki/tls/private/localhost-nopass.key

启动salt-api

systemctl restart salt-master.service
systemctl start salt-api.service

salt-api 基于https协议提供两个url地址:

  • https://x.x.x.x:port/login  # 调用saltAPI,实现用户认证,返回用户令牌
  • https://x.x.x.x:port  # 调用saltmaster的功能模块

验证是否启动:

# 验证登录:
curl -k https://192.168.3.46:8001/login -H "Accept: application/x-yaml" -d username="saltapi" -d password="123456" -d eauth="pam"

# 返回:
return:
- eauth: pam
  expire: 1648217755.235411
  perms:
  - .*
  start: 1648174555.2354097
  token: 3f21964714ff7300d4b0dd4d8e5f410019eb1871
  user: saltapi


# 验证test.ping
curl -k https://192.168.3.46:8001/ -H "Accept: application/x-yaml" -H "X-Auth-Token:3f21964714ff7300d4b0dd4d8e5f410019eb1871" -d client="local" -d tgt="*" -d fun="test.ping"

# 返回:
return:
- 192.168.3.44: false
  192.168.3.47: true

python调用

import requests
import json


salt_api_url = 'https://192.168.3.46:8001'
salt_api_url_login = 'https://192.168.3.46:8001/login'
salt_api_user = 'saltapi'
salt_api_passwd = '123456'

requests.packages.urllib3.disable_warnings()
def get_salt_api_token():
    data = {
        'username': salt_api_user,
        'password': salt_api_passwd,
        'eauth': 'pam'  # 选择的认证模块
    }

    head = {
        'Content-Type': 'application/json'  # 接收json数据
    }
    res = requests.post(
        url=salt_api_url_login,
        data=json.dumps(data),
        headers=head,
        verify=False  # 向https发送请求会验证证书,此参数是取消验证证书
    )
    salt_api_token = json.loads(res.text).get('return')[0].get('token')
    return salt_api_token


# 调用models模块
# 1.无参数模块

# test.ping 模块
def test_ping(salt_api_token):
    head = {
        'Content-Type': 'application/json',
        'X-Auth-Token': salt_api_token
    }

    data = {
        'client': 'local_async',  # client 表示调用方式, local:同步调用
        'tgt': '*',  # tgt 表示要操作的minion, 值为minion_id
        'fun': 'test.ping',  # 调用的模块方法名
        # 'arg': ''  # 模块需要用的参数
    }

    res = requests.post(url=salt_api_url, data=json.dumps(data), headers=head, verify=False)
    print(json.loads(res.text))  # {'return': [{'192.168.3.47': True, '192.168.3.44': False}]}


# 2.调用有参模块
def cmd_run(salt_api_token):
    head = {
        'Content-Type': 'application/json',
        'X-Auth-Token': salt_api_token
    }

    data = {
        'client': 'local',  # client 表示调用方式, local:同步调用
        'tgt': '192.168.3.47',  # tgt 表示要操作的minion, 值为minion_id
        'fun': 'cmd.run',  # 调用的模块方法名
        'arg': 'df -h'  # 模块需要用的参数
    }

    res = requests.post(url=salt_api_url, data=json.dumps(data), headers=head, verify=False)
    print(json.loads(res.text))


if __name__ == '__main__':
    # get_salt_api_token()
    token = '7fe67213e4821a82f905292bb56c5ffa2a36faf5'
    test_ping(token)
    # cmd_run(token)

 python调用salt-api

saltstack运维工具

saltstack的rest接口salt-api开发使用指南_峰云,就她了。的技术博客_51CTO博客

salt api开发指南_运维个西瓜的博客-CSDN博客

 Saltstack异步执行命令(十三) - shhnwangjian - 博客园

Salt Master报错:Minion did not return. [No response]_东城绝神的博客-CSDN博客

Salt开发

Installation

 saltstack配置文件介绍

salt job 相关操作 链接  链接 链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值