saltstack之saltapi

安装

1
yum -y install salt-api

配置

cat /etc/salt/master.d/api.conf #配置证书和端口

1
2
3
4
5
rest_cherrypy:
  port: 8888
  debug: True
  ssl_crt: /etc/pki/tls/certs/localhost.crt
  ssl_key: /etc/pki/tls/private/localhost_nopass.key

cat /etc/salt/master.d/eauth.conf #设置权限

1
2
3
4
5
6
external_auth:
  pam:
    saltapi:
      - .*
      - '@wheel'
      - '@runner'

添加账号

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

启动服务

1
2
systemctl enable salt-api
systemctl start salt-api

测试

curl测试并获取token信息:

saltstack之salt命令大全

常用命令

1
2
3
4
5
6
7
8
9
salt -N 'ceph' test.ping     #测试连通性
salt -E '^server10*' test.ping           #正则匹配连通性
salt -S 192.168.150.101 test.ping      #根据agent ip地址匹配执行
salt -S 192.168.150.0/24 test.ping     #根据agent ip地址匹配执行
salt -N 'ceph' cmd.run 'df -Th' #按组查看磁盘使用
salt -N 'ceph' cmd.exec_code python 'import os; print os.system("df -Th")' #python代码执行
salt -N 'ceph' cmd.exec_code perl 'print scalar localtime' #perl代码执行
salt -G 'osrelease:6.3' cmd.run 'python -V' #根据grans信息过滤后执行
salt '*'  smbios.get system-serial-number #获取服务器硬件序列号

远程执行脚本:

1
salt -N 'ceph' salt://scripts/runme.sh  #远程执行脚本

远程拷贝文件:

1
2
3
4
5
6
7
8
salt -N 'ceph' cp.get_file salt://files/opencdn/a.txt /tmp/a.txt #agent端从master拉取文件到/tmp下
salt -N 'ceph' cp.get_file salt://files/opencdn/dir1/  /tmp   #agent端从master拉取目录到/tmp下
salt -N 'ceph' cp.get_url http://www.baidu.com  /tmp/index.html #下载url
salt -N 'ceph' cp.push /etc/fstab   #提取指定节点文件到master,默认在/var/cache/salt/master/minions/minion-id/files目录下
salt -N 'ceph' cp.push_dir /etc/modprobe.d/ glob='*.conf' #提取节点指定目录的指定配置文件
salt-cp '*' fstab /etc/fstab   #拷贝当前目录下fstab文件到节点/etc/fstab
salt-cp -E 'gpu0[1-2][1-5]' fstab /etc/fstab    #正则匹配拷贝文件
salt-cp -G 'os:CentOS*' fstab /etc/fstab   #grains匹配拷贝文件    

获取磁盘信息

1
2
3
salt -N 'ceph' disk.percent /data01  #获取磁盘使用率
salt -N 'ceph' disk.nodeusage /data01  #获取磁盘inode使用
salt -N 'ceph' xfs.info /data01 #获取xfs分区信息

文件操作

1
2
3
salt -N 'ceph' file.chown /etc/passwd root root   #修改文件权限
salt -N 'ceph' file.copy  /etc/passwd  /tmp/passwd #拷贝文件
salt -N 'ceph' file.directory_exists /etc/passwd  #判断文件是否存在

用户信息操作

1
2
3
salt -N 'ceph' user.list_users  #列出系统所有系统账号
salt -N 'ceph' user.info  lianghaiqiang  #列出用户信息
salt -N 'ceph' user.delete lianghaiqiang remove=True force=True #强制删除用户

时区、重启、任务计划

1
2
3
4
5
salt -N 'ceph' timezone.get_zone  #获取时区
salt -N 'ceph' timezone.set_zone #设置时区
salt -N 'ceph' system.reboot #重启系统
salt -N 'ceph' cron.list_tab root  #列出root计划任务
salt -N 'ceph' cron.raw_cron root  #列出root计划任务,文本格式

文件解压缩:

1
2
3
salt -N 'ceph' archive.cmd_unzip template=jinja /tmp/zipfile.zip /tmp/{{grains.id}}/ excludes=file_1,file_2
salt -N 'ceph' archive.cmd_unzip /tmp/zipfile.zip /home/strongbad/ excludes=file_1,file_2
salt -N 'ceph' archive.cmd_zip template=jinja /tmp/zipfile.zip /tmp/sourcefile1,/tmp/{{grains.id}}.txt

网络

1
2
3
4
5
6
salt -N 'ceph' network.dig www.baidu.com  #dig解析
salt -N 'ceph' network.get_hostname  #获取主机名
salt -N 'ceph' network.hw_addr eth0  #获取MAC地址
salt -N 'ceph' network.ip_addrs  #获取IP地址
salt -N 'ceph' network.ping www.baidu.com  timeout=3 #ping信息
salt -N 'ceph' pkg.install  zlib   #安装软件包

获取对象帮助信息:

如:grains/disk/pillar/pip/pkg

python编码规范

编码声明

默认不设置为ASCII,可设置为

1
# coding=<encoding name>

1
2
#!/usr/bin/python
# -*- coding: <encoding name> -*-

1
2
#!/usr/bin/python
# coding: utf-8

代码编排

  • 四个空格一个缩进,不建议使用tab,更不建议混合使用tab和空格
  • 单行最长79字符,换行可使用反斜杠,最好使用括号
  • 类和同级别函数之间空2行,类中方法之间空一行
  • 模块书写顺序: 模块说明和docstring,import,globals,constants,其他;其中import又按标准、第三方、自己编写顺序摆放,同时不建议书写在一行
  • 操作符左右各加一个空格,函数默认参数使用的赋值符左右省略空格,各种右括号前不要加空格;
  • 注释必须使用英文,最好是完整的句子,首字母大写,句后要有结束符,结束符后跟两个空格,开始下一句。如果是短语,可以省略结束符。
  • 所有的共有模块、函数、类、方法写docstrings;非共有的没有必要,但是可以写注释(在def的下一行)

命名规范

  • 尽量单独使用小写字母‘l’,大写字母‘O’等容易混淆的字母。
  • 模块命名尽量短小,使用全部小写的方式,可以使用下划线。
  • 包命名尽量短小,使用全部小写的方式,不可以使用下划线。
  • 类的命名使用CapWords的方式,模块内部使用的类采用_CapWords的方式。
  • 异常命名使用CapWords+Error后缀的方式。
  • 全局变量尽量只在模块内有效,类似C语言中的static。实现方法有两种,一是__all__机制;二是前缀一个下划线。
  • 函数命名使用全部小写的方式,可以使用下划线。
  • 常量命名使用全部大写的方式,可以使用下划线。
  • 类的属性(方法和变量)命名使用全部小写的方式,可以使用下划线。
  • 类的属性有3种作用域public、non-public和subclass API,可以理解成C++中的public、private、protected,non-public属性前,前缀一条下划线。
  • 类的属性若与关键字名字冲突,后缀一下划线,尽量不要使用缩略等其他方式。
  • 为避免与子类属性命名冲突,在类的一些属性前,前缀两条下划线。比如:类Foo中声明__a,访问时,只能通过Foo._Foo__a,避免歧义。如果子类也叫Foo,那就无能为力了。
  • 类的方法第一个参数必须是self,而静态方法第一个参数必须是cls

代码检查工具

1
pip install flake8

安装flake8成功后,打开VScode,文件->首选项->用户设置,在settings.json文件中输入"python.linting.flake8Enabled": true