标签:python、salt
saltstack
一.安装
1.EPEL(yum源)
rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm
2.安装主控端
yum install salt-master -y
chkconfig salt-master on
service salt-master start
3.安装被控端
yum install salt-minion -y
chkconfig salt-minion on
service salt-minion start
4.更新防火墙
iptables -I INPUT -m state --state new -m tcp -p tcp --dport 4505 -j ACCEPT
iptables -I INPUT -m state --state new -m tcp -p tcp --dport 4506 -j ACCEPT
二.使用
1.命令行常用
salt-key -L #查询所有被控端主机ID证书
salt-key -D #删除所有认证主机ID证书
salt-key -d xxx #删除指定主机ID证书
salt-key -A #接受所有ID证书请求
salt-key -a xxx #接受单个ID证书请求
salt ‘*‘ cmd.run ‘free -m‘ # 分发命令到所有clent
salt ‘*‘ cp.cache_local_file /etc/hosts # 分发文件到clent的cache目录
salt -E ‘^wab*‘ cmd.run ‘free -m‘ #正则表达式匹配分发
salt -G ‘mem_totle:32232‘ test.ping #根据主机的grain信息进行二次匹配,重要
salt -I ‘appname‘ test.ping #根据主机的pillar信息进行二次匹配,重要
salt -C ‘E@^wab* and not G@mem_totle:32232‘ #根据条件运算符not、and、or去匹配不同规则的主机,用法比较灵活,可以运用多种方式组合匹配
salt -L ‘clent1,clent2,clent3‘ cmd.run ‘free -m‘ #列表匹配client
salt -N group1 cmd.run ‘free -m‘ #根据自定义组匹配,组配置 vim /etc/salt/master
nodegroups:
group1: ‘clent1,clent2‘
group2: ‘clent3,clent4‘
salt -S group1 10.1.11.0/24 ‘free -m‘ #根据IP地址匹配
2.cmd模块,执行命令
salt ‘*‘ cmd.run ‘free -m‘
api调用使用
import salt
client=salt.client.LocalClient()
client.cmd(‘*‘,‘cmd.run‘,[‘free -m‘]) #执行命令
3.archive模块,压缩功能
salt ‘*‘ archive.gunzip /tmp/sourcefile.txt.gz # gzip方式解压 /tmp/sourcefile.txt.gz
salt ‘*‘ archive.gzip /tmp/sourcefile.txt #gzip方式压缩/tmp/sourcefile.txt
api调用使用
import salt
client=salt.client.LocalClient()
client.cmd(‘*‘,‘archive.gzip‘,[‘/tmp/sourcefile.txt ‘])
4.cp模块,远程文件、目录复制
salt ‘*‘ cp.cache_local_file /etc/hosts #将主控的/etc/hosts文件分发到被控机的cache目录,默认/var/cache/salt/minion
salt ‘*‘ cp.get_dir salt://dir1 /root/ #主控机的file_roots目录下的dir1目录,发送到被控机的/root/下
salt ‘*‘ cp.get_file salt://file1 /root/ #主控机的file_roots目录下的file1文件,发送到被控机的/root/下
api调用
import salt
client=salt.client.LocalClient()
client.cmd(‘*‘,‘cp.get_file‘,[‘salt://file1‘,‘/root/‘])
5.dnsutil模块,HOST相关操作
salt ‘*‘ dnsutil.hosts_append /etc/hosts 127.0.0.1 www.baidu.com,www2.baidu.com #添加主机记录
salt ‘*‘ dnsutil.hosts_remove /etc/hosts www2.baidu.com #删除主机记录
api
import salt
client=salt.client.LocalClient()
client.cmd(‘*‘,‘dnsutil.hosts_append‘,[‘/etc/hosts‘,‘127.0.0.1‘,‘www.baidu.com‘])
6.cron模块,crontab相关操作
salt ‘*‘ cron.raw_cron root #查看被控机root用户名下的任务
salt ‘*‘ cron.set_job root ‘0‘ ‘0‘ ‘*‘ ‘*‘ ‘*‘ ‘echo 3 > /proc/sys/vm/drop_caches‘ #插入任务
salt ‘*‘ cron.rm_job root ‘echo 3 > /proc/sys/vm/drop_caches‘ #删除任务
7.file模块,文件读写、权限、查找、校验等
salt ‘*‘ file.check_hash /etc/hosts md5=XXXX #校验文件md5是否为指定的,一致则返回True
salt ‘*‘ file.chown /etc/passwd root root #更改文件主root
salt ‘*‘ file.set_mode /etc/passwd 755 #更改文件权限为755
salt ‘*‘ file.get_mode /etc/passwd #获取文件权限
salt ‘*‘ file.copy /source_file /back_file #复制被控机自身文件到另一个位置
salt ‘*‘ file.directory_exists /etc #检查文件是否存在
salt ‘*‘ file.remove /root/test #删除文件
api
import salt
client=salt.client.LocalClient()
client.cmd(‘*‘,‘file.remove‘,[‘/root/test ‘])
三.grains组件,被控端给主控端的机器信息
1.常用命令示例
salt ‘*‘ grains.ls #查看被控主机信息项目列表
salt ‘*‘ grains.items #查看被控主机所有grains信息
salt ‘*‘ grains.item ‘cpu_model‘ # 查看被控主机的单项信息(cpu_model)
salt -G ‘cpu_model:Intel*‘ cmd.run ‘hostname‘ #匹配CPU为intel*的服务器
salt --grain-pcre ‘cpu_model:Intel*‘ cmd.run ‘hostname‘ #正则表达式匹配
2.定义grains模块
主控端扩展模块
salt ‘*‘ saltutil.sync_all #下发模块
salt ‘*‘ sys.reload_modules #被控端加载模块
salt ‘*‘ sys.grains.items #验证模块已经生效了
四.pillar组件,主控端用来分发全局变量到所有被控端的一个接口
1.开启配置
vim /etc/salt/master
pillar_roots:
base:
- /srv/salt/pillar/ #定义pillar路径
pillar_opts: True #开启pillar选项
install -d /srv/salt/pillar/
进入后创建top.sls
2.使用示例
salt ‘*‘ pillar.data #查看主控端对被控端的所有pillar内容
salt ‘*‘ pillar.item XX #查看某一项pillar内容
salt ‘*‘ saltutil.refresh_pillar #刷新被控机的pillar数据(更改过pillar后要运行)
3.结合模板、grains编写sls文件
示例:
-------------------------------------------------------
cat /srv/pillar/top.sls
base:‘*‘:- packages
cat /srv/pillar/packages.sls
{%if grains[‘os‘]==‘RedHat‘%}wab_app: httpd git: git{%elif grains[‘os‘]==‘CentOs‘%}web_app: tomcat git: git-core{% endif %}
------------------------------------------------------
api使用方法
给state或jinja调用,跟字典使用方法类似
pillar[‘http‘][‘httpd‘]
五.state模块,核心功能,
1.定义pillar,为给state提供配置单
如上定义方法
2.定义state
目录位置 /srv/salt/
cat top.sls
base:‘*‘:- http
cat apache/init.sls
http:
pkg:
- installed
- name: {{ pillar[‘http‘][‘httpd‘] }}
service.running:
- name: {{ pillar[‘http‘][‘httpd‘] }}
- require:
- pkg: {{ pillar[‘http‘][‘httpd‘] }}
3.执行state
salt ‘*‘ state.highstate
六.实现集中化管理步骤
1,确认环境
2,确认被控端分组
3,配置grains, 因为nginx的配置中有两个参数要参考被控机的max_open_file,但默认的grains里没有这个值,所以要自定义一个grains[‘max_open_file‘]来收集,提供给后面jinja编写nginx的配置文件时调用
vim get_max_open_file.py
!----------------------
import commands
def get_max_open_file():
grains={}
grains[‘max_open_file‘] = 65535
try :
num=commands.getoutput(‘ulimit -n‘)
except :
pass
grains[‘max_open_file‘] = num
return grains
---------------------!
salt ‘*‘ saltutil.sync_all #下发模块
salt ‘*‘ sys.reload_modules #被控端加载模块
salt ‘*‘ sys.grains.items #验证下有没有grains,如果没有就说明脚本有报错
4,配置pillar:使用分组规则定义pillar,不同组引用各自的sls,如:
top.sls
!-------------------------------------------
base:
test1group: #想要作为匹配的值
- match: nodegroup #匹配方法,匹配master配置文件里定义的nodegroup里叫test1group的值,下同
- web1server #引用私有配置
test2group
-match: nodegroup
-web2server
------------------------------------------!
定义私有配置
web1server
!-----------------------------------------
nginx: #私有pillar名
root: /data/www #私有参数
-----------------------------------------!
web2server
!-----------------------------------------
nginx:
root: /home/www
-----------------------------------------!
检查pillar生效
selt ‘host1‘ pillar.item nginx
4.配置state,已经在pillar里确认了nginx的家目录,下面用jinja模板,通过grains收集的数据来确定其他可变nginx配置,然后执行安装
定义tot.sls,所有主机都去匹配‘nginx‘规则
!--------------------------
base:
‘*‘:
- nginx
--------------------------!
nginx.sls
!------------------------
nginx:
pkg:
- installed
file.managed:
- source: salt://nginx/nginx.conf
- name: /etc/nginx/nginx.conf
- user: root
- group: root
- mode: 644
- template: jinja
service.running:
- enable: True
- reload: True
- watch:
- file: /etc/nginx/nginx.conf
- pkg: nginx
---------------------------------!
定义nginx的jinja模板,位置是/srv/salt/nginx/nginx.conf,各种调用、、
!-----------------------------------------------
user root root;
worker_processes {{ grains[‘num_cpus‘] }}; #重点
{%if grains[‘num_cpus‘] == 4%}
worker_cpu_affinity 1000 0100 0010 0001;
{%elif grains[‘num_cpus‘] == 8%}
worker_cpu_affinity 10000000 01000000 00100000 00010000 00001000 00000100 00000010 00000001;
{%endif%}
error_log /data/logs/error.log;
pid logs/nginx.pid;
worker_rlimit_nofile {{grains[‘max_open_file‘]}}; #重点
events {
use epoll;
worker_connections {{grains[‘max_open_file‘]}}; #重点
}
http {
include mime.types;
default_type application/octet-stream;
log_format main ‘"$http_X_Cluster_Client_Ip" - $remote_user [$time_local] "$request" ‘
‘$status $body_bytes_sent "$http_referer" ‘
‘"$http_user_agent" $http_x_forwarded_for‘ "$http_referer" ;
fastcgi_intercept_errors on;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2 keys_zone=zha_cache:200m max_size=2m;
sendfile on;
tcp_nopush off;
keepalive_timeout 65;
tcp_nodelay on;
server_tokens off;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_proxied any;
gzip_comp_level 6;
gzip_http_version 1.1;
gzip_types text/plain application/x-javascript text/css application/xml ;
gzip_disable "MSIE [1-6]\.";
server {
listen 9000 default;
server_name localhost;
location / {
root {{ pillar[‘nginx‘][‘root‘] }} ; #重点
index index.html;
}
access_log off;
}
include /usr/local/nginx/conf/vhost/*.conf;
}
---------------------------------------------------------------------------!
5.最后一步
salt ‘*‘ state.highstate
根据报错一步一步调吧- -
标签:python、salt
原文地址:http://msorry.blog.51cto.com/2206834/1639039