码迷,mamicode.com
首页 > 其他好文 > 详细

saltstack学习笔记

时间:2015-04-27 15:31:52      阅读:231      评论:0      收藏:0      [点我收藏+]

标签: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 

根据报错一步一步调吧- -




 




saltstack学习笔记

标签:python、salt

原文地址:http://msorry.blog.51cto.com/2206834/1639039

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!