设为首页 收藏本站
查看: 1111|回复: 0

[经验分享] 集中化管理平台saltstack--原理及部署

[复制链接]

尚未签到

发表于 2018-7-31 10:04:17 | 显示全部楼层 |阅读模式
  简介
  SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,一般可以理解为简化版的puppet和加强版的func。SaltStack基于Python语言实现,结合轻量级消息队列(ZeroMQ)
  与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。有如下特性:
  (1)、部署简单、方便;
  (2)、支持大部分UNIX/Linux及Windows环境;
  (3)、主从集中化管理;
  (4)、配置简单、功能强大、扩展性强;
  (5)、主控端(master)和被控端(minion)基于证书认证,安全可靠;
  (6)、支持API及自定义模块,可通过Python轻松扩展。
  通过部署SaltStack环境,我们可以在成千上万台服务器上做到批量执行命令,根据不同业务特性进行配置集中化管理、分发文件、采集服务器数据、操作系统基础及软件包管理等,SaltStack是运维人员提高工作效率、规范业务配置与操作的利器。
  SaltStack master启动后默认监听4505和4506两个端口。
  4505(publish_port)为saltstack的消息发布系统,
  4506(ret_port)为saltstack被控端与服务端通信的端口。
  如果使用lsof 查看4505端口,会发现所有的minion在4505端口持续保持在ESTABLISHED状态。minion与master之间的通信模式如下:
DSC0000.png

  被控端直接于主控端的zeromq建立长连接,接收广播到的任务消息并执行。即在主控端配置iptables规则:
  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
  saltstack认证原理:
  1)、minion在第一次启动时,会在/etc/salt/pki/minion/(该路径在/etc/salt/minion里面设置)下自动生成minion.pem(private key)和 minion.pub(public key),然后将 minion.pub发送给master。
  2)、master在接收到minion的public key后,通过salt-key命令accept minion public key,这样在

  master的/etc/salt/pki/master/minions下的将会存放以minion>  能对minion发送指令了。
  依赖情况:
DSC0001.png

  SaltStack的通信模式分为2种模式:ZeroMQ、REAT,鉴于REAT目前还不是太稳定,选择ZeroMQ模式
  安装
  本例采用centos6。5默认的Python2。6。6。。若更改Python版本,
  同时要修改
  # vim /usr/bin/yum。
  此处仅介绍通过yum安装saltstack。
  默认的yum 源没有saltstack包,需要改为epel 源。
  https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
  若安装时出现报错:
  Error: Package: salt-2015.5.10-2.el6.noarch (epel)
  Requires: python-requests
  Error: Package: salt-2015.5.10-2.el6.noarch (epel)
  Requires: PyYAML
  You could try using --skip-broken to work around the problem
  You could try running: rpm -Va --nofiles --nodigest
  需要在/etc/yum.repos.d/加上centos自带的yum源--CentOS-Base.repo。
  master端安装:yum -y install salt-master
  chkconfig salt-master on
  minion端安装:yum -y install salt-minion
  chkconfig salt-minion on
  调整salt配置并检验
  注:saltstack的配置文件格式都是YAML 的,配置的时候需要注意语法
  master端:
  vi /etc/salt/master
  interface: masterIP                 #绑定master通信IP。
  auto_accept: True                  #设为自动认证,避免繁琐的手动运行salt-key确认证书信任。
  file_roots:                      #指定salt文件根目录的位置
  base:
  - /srv/salt
  更改完成后启动该服务
  minion端:
  vi /etc/salt/minion
  master: masterIP                   #绑定master主机IP地址。
  id: JYD-test-2                    #更改被控端主机识别id,建议用主机名来配置
  更改完成后启动该服务
  应用
  salt-key -L            # 显示当前所有被控端id
  -D   删除所有认证id

  -d>  -A   接受所有id证书请求

  -a>  salt '*' test.ping                  # 测试所有主机的连通性(此处*为通配符)
  salt -E '^JYD-test.*' cmd.run 'free -m'     # -E使用正则,cmd.run执行远程命令
  -L  以主机id名列表的形式操作部分主机
  -G  根据被控主机的grains过滤(后续详细介绍)
  -I  根据被控主机的pillar过滤 (后续详细介绍)
  -N  根据分组名称过滤(分组在/etc/salt/master里定义)
  -C  根据条件符not and or 匹配
  -S  根据被控主机的IP或子网匹配
  常用模块学习
  (1)、cp模块(实现远程文件、目录的复制,以及下载URL文件等操作)(参数 cache_local_file、get_file、get_dir、get_url)
  ## 将主服务器file_roots指定位置下的目录复制到被控主机
  # salt '*' cp.get_dir salt://hellotest /data
  ##将主服务器file_roots指定位置下的文件复制到被控主机
  # salt '*' cp.get_file salt://hellotest/rocketzhang /root/rocketzhang
  ## 下载指定URL内容到被控主机指定位置
  # salt '*' cp.get_url http://xxx.xyz.com/download/0/files.tgz /root/files.tgz
  API调用:client.cmd('*','cp.get_dir',['salt://path/to/dir','/minion/dest'])
  (2)、cmd模块(实现远程的命令行调用执行,默认是root权限,使用注意)
  # salt '*' cmd.run 'netstat -ntlp'
  API调用:client.cmd('*','cmd.run',['命令'])
  ★此模块较常用,可实现多个模块的功能。
  (3)、cron模块(实现被控主机的crontab操作)(raw_cron查,cron.set_job加,rm_job删)
  ## 为指定的被控主机、root用户添加crontab信息
  # salt '*' cron.set_job root '*/5' '*' '*' '*' '*' 'date >/dev/null 2>&1'
  # salt '*' cron.raw_cron root
  ## 删除指定的被控主机、root用户的crontab信息
  # salt '*' cron.rm_job root 'date >/dev/null 2>&1'
  API调用:client.cmd('*','cron.rm_job',['root','命令']
  (4)、dnsutil模块(实现被控主机通用DNS操作)
  ## 为被控主机添加指定的hosts主机配置项
  # salt '*' dnsutil.hosts_append /etc/hosts 127.0.0.1 test.com
  API调用:client.cmd('*','dnsutil.hosts_remove',['/etc/hosts','域名']
  (5)、file模块(被控主机文件常见操作,包括文件读写、权限、查找、校验等)(参数有check_hash md5加密值对比、get_sum 指定加密方式、chown、copy、dirctory_exists目录是否存在、stats、get_mode、set_mode、mkdir、sed内容修改、append追加、remove)
  # salt '*' file.get_sum /etc/resolv.conf md5
  # salt '*' file.stats /etc/resolv.conf
  API调用:client.cmd('*',fiel.append /文件 "增加字段")
  (6)、archive模块,在系统层面实现压缩包的调用(gzip,gunzip,tar,unzip等)
  # salt '*' archive.gzip /tmp/abc.txt
  API调用:client.cmd('*','archive.gunzip ',['/tmp/qq.gz'])
  (7)、network模块(返回被控主机网络信息)(参数有 dig、ping、traceroute 跟域名,hwaddr 跟网卡、in_subnet 跟网段、interfaces、ip_addrs、subnet 无字段)
  # salt '*' network.ip_addrs
  # salt '*' network.interfaces
  API调用:client.cmd('*','network.in_subnet','网段')
  (8)、pkg包管理模块(被控主机程序包管理,如yum、apt-get等)(参数有 install、remove 跟软件包,upgrade升级所有)
  # salt '*' pkg.install nmap
  # salt '*' pkg.file_list nmap
  API调用:client.cmd('*','pkg.upgrade')
  (9)、service 服务模块(被控主机程序包服务管理)(参数有 enable、disable、reload、restart、start、stop、status)
  # salt '*' service.enable crond
  # salt '*' service.reload crond
  API调用:client.cmd('*','service.stop' 'httpd')
  1、安装
  安装saltstack用EPEL源安装简单快捷,实际部署的时候可以将saltstack相关的rpm包放到本地的yum源用本地源安装。
  安装EPEL源:
  [root@saltstack ~]#wget -c http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
  [root@saltstack ~]#rpm -ivh epel-release-6-8.noarch.rpm
  安装salt-master,如果master要对自己进行配置管理则服务器master端本地也要安装minion
  [root@saltstack ~]#yum install salt-master
  #安装salt-minion可选
  [root@saltstack ~]#yum install salt-minion
  2、修改配置文件并启动服务。saltstack配置比较简单,一般不需要修改太多的参数。
  salt-master端,暂时没有什么配置的,默认就好。
  [root@saltstack ~]# grep -Ev "^#|^$" /etc/salt/master
  file_roots:
  base:
  - /srv/salt
  pillar_roots:
  base:
  - /srv/pillar
  [root@saltstack ~]# salt-master -d
  salt-minion端,配置 “master”项指向master的IP地址,配置 “id” 项为主机名(一般用主机名,也可以配成其它的标识符)
  [root@minion01 ~]# grep -Ev "^#|^$" /etc/salt/minion
  master: 192.168.186.134
  id: minion01
  [root@minion01 ~]# salt-minion -d
  [root@minion01 ~]#
  [root@minion02 ~]# grep -Ev "^#|^$" /etc/salt/minion
  master: 192.168.186.134
  id: minion02
  [root@minion02 ~]# salt-minion -d
  [root@minion02 ~]#
  3、master认证端添minion的key,并做简单的存活测试。
  salt-key管理所有的key,-L参数列出所有的key.”Unaccepted Keys”就是所有未认证minion端的key。
  [root@saltstack ~]#salt-key -L
  Accepted Keys:
  Unaccepted Keys:
  minion01
  minion02
  Rejected Keys:
  -A参数接纳(认证)所有未被接纳(认证)的key,-a参数认证单个指定的key。
  [root@saltstack ~]#salt-key -A
  
  The following keys are going to be accepted:
  Unaccepted Keys:
  minion01
  minion02
  Proceed? [n/Y] y
  Key for minion minion01 accepted.
  Key for minion minion02 accepted.
  再查看下所有key的情况,可以看到”Accepted Keys”已经认证的key。
  [root@saltstack ~]# salt-key -L
  Accepted Keys:
  minion01
  minion02
  Unaccepted Keys:
  Rejected Keys:
  用test.ping测试下minion端的存活,可以从返回值看到minion01和minion02在线
  [root@saltstack ~]# salt \* test.ping
  minion01:
  True
  minion02:
  True
  [root@saltstack ~]#
  用test.ping命令测试时,如果等待的返回时间较长有可能是某些minion已经不在线了,可以用salt-run来查看所有minion的存活状态。
  [root@saltstack ~]# salt-run manage.status
  down:
  up:
  - minion01
  - minion02
  [root@saltstack ~]#
  salt相关的管理命令:
  salt-run manage.up# 查看存活的minion
  salt-run manage.down           # 查看死掉的minion
  salt-run manage.down removekeys=True    # 查看down掉的minion,并将其删除
  salt-run manage.status            # 查看minion的相关状态
  salt-run manage.versions# 查看salt的所有master和minion的版本信息
  salt-run jobs.active# 查看哪些系统任务还在处理中
  salt-run jobs.list_jobs# 显示所有的已完成或部分完成的任务信息

  salt '*' saltutil.running# 查看运行的jobs>  salt \* saltutil.kill_job 20151209034239907625 # kill掉进程ID
  salt -d# 查看帮助文档
  salt -d|grep service# 查看service相关模块命令
  salt '*' sys.doc# 查看帮助文档
  salt-key  -L            # 查询所有接收到的证书
  salt-key  -a <证书名>   # 接收单个证书
  salt-key  -A            # 接受所有证书
  salt-key  -d <证书名>  # 删除单个证书
  salt-key  -D            # 删除所有证书
  salt '*' service.get_all# 获取主机所有服务
  salt '*' service.reload sshd# 重载sshd服务
  salt '*' pkg.list_pkgs # 显示软件包版本列表
  salt '*' pkg.version python# 显示软件包版本信息
  salt '*' pkg.install httpd# 安装软件包
  salt 'node1.com' service.status mysql# 查看mysql服务状态
  salt 'node1.com' service.start mysql# 启动mysql服务
  salt 'node1.com' cmd.run 'service mysql status'# 与上面一样查看服务
  salt '*' sys.list_modules# 模块列表
  salt-cp '*'  /etc/hosts   /etc/hosts# 把master上的hosts文件分发到所有主机
  salt '*' cp.get_file salt://ceshi/b /tmp/test# 把salt-master端相应的文件,分发文件到minion端
  salt '*' cp.get_dir salt://zabbix /tmp# 把salt-master端相应的目录,分发文件到minion端
  salt '*' file.copy /tmp/zabbix.sls /tmp/sls# 把salt-master端对应文件拷贝到minion端相应目录下
  salt '*' cmd.run 'uptime' # 远程命令执行测试
  远程执行脚本:
  'cmd.script:'
  salt '*' cmd.script salt://scripts/runme.sh
  salt '*' cmd.script salt://scripts/runme.sh 'arg1 arg2 "arg 3"'
  salt '*' cmd.script salt://scripts/windows_task.ps1 args=' -Input c:\tmp\infile.txt' shell='powershell'
  salt '*' cmd.script salt://scripts/runme.sh stdin='one\ntwo\nthree\nfour\nfive\n'
  'cmd.shell:'
  This passes the cmd argument directly to the shell
  salt '*' cmd.shell "ls -l | awk '/foo/{print \$2}'"
  salt '*' cmd.shell template=jinja "ls -l /tmp/`grains`.`id` | awk '/foo/{print \$2}'"
  salt '*' cmd.shell "Get-ChildItem C:\ " shell='powershell'
  salt '*' cmd.shell "grep f" stdin='one\ntwo\nthree\nfour\nfive\n'
  salt '*' cmd.shell cmd='sed -e s/=/:/g'
  'cmd.shells:'
  salt '*' cmd.shells
  'cmd.tty:'
  salt '*' cmd.tty tty0 'This is a test'
  salt '*' cmd.tty pts3 'This is a test'
  'cmd.which:'
  salt '*' cmd.which cat
  grains选项:
  salt '*' grains.ls                    # 查看grains分类
  salt '*' grains.items                      # 查看grains所有信息
  salt '*' grains.item osrelease                  # 查看grains某个信息
  说明:state模块是salt state的管理模块,可以通过state模块简单的对minion操作sls状态
  salt 'node1.com' state.highstate            # 更新指定minons的所有sls状态
  salt 'node1.com' state.running              # 查看当前运行的sls状态
  相关例子:
  [root@master ~]# salt \* saltutil.running
  node02.saltstack.com:
  |_
  ----------
  arg:
  -  egrep -v ^#
  fun:
  cmd.run
  jid:
  20170221141733009548
  pid:
  5922
  ret:
  tgt:
  *
  tgt_type:
  glob
  user:
  root
  |_
  ----------
  arg:
  - egrep -v ^#
  fun:
  cmd.run
  jid:
  20170221141748160358
  pid:
  5927
  ret:
  tgt:
  *
  tgt_type:
  glob
  user:
  root
  node01.saltstack.com:
  |_
  ----------
  arg:
  -  egrep -v ^#
  fun:
  cmd.run
  jid:
  20170221141733009548
  pid:
  6252
  ret:
  tgt:
  *
  tgt_type:
  glob
  user:
  root
  |_
  ----------
  arg:
  - egrep -v ^#
  fun:
  cmd.run
  jid:
  20170221141748160358
  pid:
  6256
  ret:
  tgt:
  *
  tgt_type:
  glob
  user:
  root
  [root@master ~]# salt \* saltutil.kill_job 20170221141748160358
  node01.saltstack.com:
  Signal 9 sent to job 20170221141748160358 at pid 6256
  node02.saltstack.com:
  Signal 9 sent to job 20170221141748160358 at pid 5927
  [root@master ~]# salt \* saltutil.kill_job 20170221141733009548
  node02.saltstack.com:
  Signal 9 sent to job 20170221141733009548 at pid 5922
  node01.saltstack.com:
  Signal 9 sent to job 20170221141733009548 at pid 6252
  [root@master ~]# salt \* saltutil.running
  node01.saltstack.com:
  node02.saltstack.com:
  [root@master ~]# salt-run manage.versions
  Master:
  2015.5.10
  Up to date:
  ----------
  node01.saltstack.com:
  2015.5.10
  node02.saltstack.com:
  2015.5.10
  [root@RS1 states]# salt-run manage.status
  down:
  up:
  - minion.saltstack.com
  - minion2.saltstack.com
  [root@RS1 ~]# salt-run manage.versions
  #查看salt的所有master和minion的版本信息
  Master:
  2015.5.10
  Up to date:
  ----------
  minion.saltstack.com:
  2015.5.10
  minion2.saltstack.com:
  2015.5.10
  [root@RS1 ~]# salt '*' test.ping -v
  # 使用-v参数,能够查看到job的jid
  Executing job with jid 20170214142709337088
  -------------------------------------------
  minion.saltstack.com:
  True
  minion2.saltstack.com:
  True
  说明:每执行一个任务,都会有一个对应的jid
  [root@RS1 ~]# salt '*' saltutil.running
  # 查看minion当前正在运的jobs
  minion2.saltstack.com:
  |_
  ----------
  arg:
  fun:
  state.highstate
  jid:
  20170214143846076337
  pid:
  5488
  ret:
  tgt:
  *
  tgt_type:
  glob
  user:
  root
  minion.saltstack.com:
  |_
  ----------
  arg:
  fun:
  state.highstate
  jid:
  20170214143846076337
  pid:
  6384
  ret:
  tgt:
  *
  tgt_type:
  glob
  user:
  root
  [root@RS1 ~]# salt '*' saltutil.kill_job 20170214143846076337
  #取消正在执行的某个jid,例如:20170214143846076337
  [root@master ~]# salt-run jobs.list_jobs
  20170221155927733273:
  ----------
  Arguments:
  Function:
  state.running
  StartTime:
  2017, Feb 21 15:59:27.733273
  Target:
  node01.saltstack.com
  Target-type:
  glob
  User:
  root
  20170221160325920754:
  ----------
  Arguments:
  Function:
  sys.doc
  StartTime:
  2017, Feb 21 16:03:25.920754
  Target:
  *
  Target-type:
  glob
  User:
  root
  20170221161556599324:
  ----------
  Arguments:
  - cat
  Function:
  cmd.which
  StartTime:
  2017, Feb 21 16:15:56.599324
  Target:
  *
  Target-type:
  glob
  User:
  root
  20170221161641114901:
  ----------
  Arguments:
  Function:
  grains.ls
  StartTime:
  2017, Feb 21 16:16:41.114901
  Target:
  *
  Target-type:
  glob
  User:
  root
  目的:用Saltstack工具去部署批量服务器,自动化安装(卸载)服务(比如MySQL)。
  [root@node2 ~]# ll
  总用量 304228
  -rw-r--r-- 1 root root 311516309 3月  10 2015 mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz
  -rwxr-xr-x 1 root root      6628 3月  25 12:52 MySQL_二进制安装.sh
  -rwxr-xr-x 1 root root       590 3月  25 12:53 MySQL_二进制卸载.sh
  [root@node2 ~]#
  1、查看Master和minion状态。
  Masternode2192.168.1.221
  minionnode4192.168.1.223
  1.1)查看master状态信息:
  [root@node2 ~]# netstat -atupn|grep --color -E '4505|4506'
  tcp        0      0 0.0.0.0:4505                0.0.0.0:*                   LISTEN      2897/python2.6
  tcp        0      0 0.0.0.0:4506                0.0.0.0:*                   LISTEN      2915/python2.6
  tcp        0      0 192.168.1.221:4505          192.168.1.223:58448         ESTABLISHED 2897/python2.6
  tcp        0      0 192.168.1.221:4506          192.168.1.223:53904         ESTABLISHED 2915/python2.6
  [root@node2 ~]#
  1.2)查看当前的salt key信息(minion)我只配置了一个:
  [root@node2 ~]# salt-key -L
  Accepted Keys:
  node4
  Denied Keys:
  Unaccepted Keys:
  Rejected Keys:
  [root@node2 ~]#
  1.3)查看minion状态信息:
  [root@node2 ~]# salt 'node4' cmd.run 'netstat -atupn|grep python'
  node4:
  tcp        0      0 192.168.1.223:53904         192.168.1.221:4506          ESTABLISHED 2846/python2.6
  tcp        0      0 192.168.1.223:58448         192.168.1.221:4505          ESTABLISHED 2846/python2.6
  [root@node2 ~]#
  1.4)分发Shell脚本和包并授权:
  1.4.1)常用cp模块介绍:(其它模块可看我其它相关博客)
  cp.get_file   从主服务器下载目录
  cp.get_dir    从主服务器下载文件
  cp.get_url    从服务器下载指定URL文件
  [root@node2 ~]# salt 'node4' cp.get_file salt://mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz /root/mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz
  node4:
  /root/mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz
  [root@node2 ~]#
  [root@node2 ~]# salt 'node4' cp.get_file salt://MySQL_install.sh /root/MySQL_install.sh
  node4:
  /root/MySQL_install.sh
  [root@node2 ~]# salt 'node4' cp.get_file salt://MySQL_remove.sh /root/MySQL_remove.sh
  node4:
  /root/MySQL_remove.sh
  [root@node2 ~]#
  1.4.2)minion查看;
  [root@node4 ~]# ll
  总用量 304232
  -rw-r--r-- 1 root root 311516309 3月  25 14:06 mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz
  -rw-r--r-- 1 root root      6628 3月  25 14:09 MySQL_install.sh
  -rw-r--r-- 1 root root       590 3月  25 14:10 MySQL_remove.sh
  [root@node4 ~]#
  1.4.3)脚本加权:
  [root@node2 ~]# salt 'node4' cmd.run 'chmod +x /root/*.sh'
  node4:
  [root@node2 ~]#
  1.5)脚本安装:
  1.5.1)安装
  [root@node2 ~]# salt 'node4' cmd.run '/root/MySQL_install.sh'
  node4:
  ?[37;32m  开始MySQL的安装! ?[0m
  ?[37;32m MySQL安装目录已经创建完成![/usr/local/mysql下] ?[0m
  ########################################################!
  ?[37;32m MySQL需要的的用户和组创建完成! ?[0m
  ########################################################!
  安装MySQL需要的基本依赖包!
  ?[37;32m MySQL需要的基本依赖包已安装完成! ?[0m
  ########################################################!
  初始化MySQL!
  ?[37;32m MySQL初始化成功! ?[0m
  ########################################################!
  更改MySQL权限属组权限
  ?[37;32m 更改MySQL目录权限属组权限成功! ?[0m
  ########################################################!
  创建并配置mysql的启动文件!
  ?[37;32m MySQL启动文件已经创建配置完成! ?[0m
  ########################################################!
  导入优化好的my.cnf到/etc/下
  ?[37;32m MySQL的配置文件已准备完毕! ?[0m
  ########################################################!
  启动MySQL服务
  ?[37;32m MySQL服务启动成功! ?[0m
  ########################################################!
  配置MySQL的root账号密码!
  ?[37;32m MySQL的root默认账号密码是renzhiyuan ?[0m
  ########################################################!
  [root@node2 ~]#
  1.5.2)卸载:
  [root@node2 ~]# salt 'node4' cmd.run '/root/MySQL_remove.sh'
  node4:
  ?[37;32m 开始MySQL卸载! ?[0m
  ########################################################!
  ?[37;32m MySQL卸载成功! ?[0m
  ########################################################!
  [root@node2 ~]#
  saltstack-master配置文件详解
  vim /etc/salt/master
  interface: 192.168.28.141       #绑定到本地的某个网络地址
  publish_port: 4505              #默认端口4505,设置master与minion通信端口
  user: root                      #运行salt进程的用户
  max_open_files: 100000          #master可以打开的最大句柄数
  worker_threads: 5               #启动用来接收或应答minion的线程数
  ret_port: 4506                  #master用来发送命令或接受minions的命令执行返回信息
  pidfile: /var/run/salt-master.pid #指定master的pid文件位置
  root_dir: /                     #该目录为salt运行的根目录,改变它可以使salt从另外一个目录运行,好比chroot
  pki_dir: /etc/salt/pki/master   #存放pki认证密钥
  cachedir: /var/cache/salt       #存放缓存信息,salt工作执行的命令信息
  verify_env: True                #启动验证和设置权限配置目录
  keep_jobs: 24                   #保持工作信息的过期时间,单位小时
  job_cache: True                 #设置master维护的工作缓存.当minions超过5000台时,它将很好的承担这个大的架构
  timeout: 5                      #master命令执可以接受的延迟时间
  output: nested                  #salt命令的输出格式
  minion_data_cache: True         #关于minion信息存储在master上的参数,主要是pilar和grains数据
  auto_accept: False              #默认值False. master自动接受所有发送公钥的minion
  file_recv: False                #允许minion推送文件到master上
  file_recv_max_size: 100         #默认值100,设置一个hard-limit文档大小推送到master端
  state_top: top.sls              #状态入口文件
  renderer: yaml_jinja            #使用渲染器用来渲染minions的状态数据
  failhard: False                 #当单个的状态执行失败后,将会通知所有的状态停止运行
  saltstack的master以及minion的安装
  master:
  查看主机解析(如果内网有自己的DNS主从,那就更省事情了)
  [root@master ~]# cat /etc/hosts
  127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
  ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
  10.10.10.140mastermaster.saltstack.com
  10.10.10.141node01node01.saltstack.com
  10.10.10.142node02node02.saltstack.com
  安装外部epel源,然后安装salt-master
  [root@master ~]# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
  [root@master ~]# yum -y install salt-master
  [root@master ~]# /etc/init.d/salt-master start
  Starting salt-master daemon:                               [确定]
  [root@master ~]# chkconfig --add salt-master
  [root@master ~]# chkconfig salt-master on
  [root@master ~]# chkconfig --list | grep salt-master
  salt-master    0:关闭1:关闭2:启用3:启用4:启用5:启用6:关闭
  [root@master ~]# netstat -tunlp | grep python
  tcp        0      0 0.0.0.0:4505                0.0.0.0:*                   LISTEN      2907/python2.6
  tcp        0      0 0.0.0.0:4506                0.0.0.0:*                   LISTEN      2927/python2.6
  备注:
  a) SaltStack是基于python进行开发,server端监听的是4505以及4506两个端口
  b) SaltStack master启动后默认监听4505和4506两个端口。
  4505(publish_port)为saltstack的消息发布系统,
  4506(ret_port)为saltstack客户端与服务端通信的端口。
  c) 如果使用lsof 查看4505端口,会发现所有的minion在4505端口持续保持在ESTABLISHED状态。
  [root@master ~]# lsof -i :4505

  COMMAND    PID USER   FD   TYPE DEVICE>  salt-mast 2907 root   12u  IPv4  16492      0t0  TCP *:4505 (LISTEN)
  [root@master ~]# lsof -i :4506

  COMMAND    PID USER   FD   TYPE DEVICE>  salt-mast 2927 root   20u  IPv4  16519      0t0  TCP *:4506 (LISTEN)
  进入salt的目录,查看目录结构:
  [root@master ~]# cd /etc/salt/
  [root@master salt]# tree
  .
  ├── master
  ├── pki
  │   └── master
  │       ├── master.pem
  │       ├── master.pub
  │       ├── minions
  │       ├── minions_autosign
  │       ├── minions_denied
  │       ├── minions_pre
  │       ├── minions_rejected
  │       └── ssh
  │           ├── salt-ssh.rsa
  │           └── salt-ssh.rsa.pub
  ├── roster
  ├── roster.bak
  └── roster.org
  8 directories, 8 files
  备注:/etc/salt/master这个文件,为saltstack master的主配置文件
  salt master端的几个重要命令说明:
  [root@master ~]# rpm -ql salt-master
  /etc/rc.d/init.d/salt-master        # salt-master服务器启动脚本
  /etc/salt/master               # salt master配置文件
  /usr/bin/salt                 # salt master核心操作命令
  /usr/bin/salt-cp                # salt文件传输命令
  /usr/bin/salt-key              # salt证书管理命令
  /usr/bin/salt-master            # salt master服务命令
  /usr/bin/salt-run              # salt master runner命令
  /usr/bin/salt-unity
  /usr/share/man/man1/salt-cp.1.gz
  /usr/share/man/man1/salt-key.1.gz
  /usr/share/man/man1/salt-master.1.gz
  /usr/share/man/man1/salt-run.1.gz
  /usr/share/man/man1/salt-unity.1.gz
  /usr/share/man/man7/salt.7.gz
  minion:
  安装和配置minion端
  [root@node01 ~]#  rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
  [root@node01 ~]#  yum -y install salt-minion
  [root@node01 ~]# /etc/init.d/salt-minion start
  Starting salt-minion daemon:                               [确定]
  [root@node01 ~]# chkconfig --list | grep salt
  salt-minion    0:关闭1:关闭2:启用3:启用4:启用5:启用6:关闭
  [root@node01 ~]# tree /etc/salt/
  /etc/salt/
  ├── minion
  ├── minion.d
  ├── minion_id
  └── pki
  └── minion
  ├── minion.pem
  └── minion.pub
  3 directories, 4 files
  You have new mail in /var/spool/mail/root
  [root@node01 ~]# cd /etc/salt/
  修改前备份minion端配置文件(运维要养成好习惯)
  [root@node01 salt]# cp minion minion.bak
  设置master的名称:(这里也可以写为master: 10.10.10.140)
  [root@node01 salt]# sed -i "16s/#master: salt/master: master.saltstack.com/" /etc/salt/minion
  设置minion端的ID
  [root@node01 salt]# sed -i "78s/#id:/id: minion.saltstack.com/" /etc/salt/minion
  [root@node01 salt]# diff /etc/salt/minion /etc/salt/minion.bak
  16c16
  < master: master.saltstack.com
  ---
  > #master: salt
  78c78

  <>  ---
  > #id:
  [root@node01 salt]# egrep -v '#|^$' /etc/salt/minion |uniq
  id: node01.saltstack.com
  [root@node01 salt]# /etc/init.d/salt-minion restart
  Stopping salt-minion daemon:                               [确定]
  Starting salt-minion daemon:
  [确定]
  在master端接受指定的key:
  [root@master ~]# salt-key -L
  Accepted Keys:
  Denied Keys:
  Unaccepted Keys:
  node01.saltstack.com
  Rejected Keys:
  说明:使用salt-key -L表明查看key的信息
  [root@master ~]# salt-key -a node01.saltstack.com
  The following keys are going to be accepted:
  Unaccepted Keys:
  node01.saltstack.com
  Proceed? [n/Y] Y
  Key for minion node01.saltstack.com accepted.
  说明:如上所示,在服务端允许node01.saltstack.com成为被信任的key
  [root@master ~]# salt-key -L
  Accepted Keys:
  node01.saltstack.com
  Denied Keys:
  Unaccepted Keys:
  Rejected Keys:
  salt minion端的几个重要命令说明:
  [root@node01 ~]# rpm -ql salt-minion
  /etc/rc.d/init.d/salt-minion        # salt minion服务启动脚本
  /etc/salt/minion               # salt minion配置文件
  /usr/bin/salt-call               # salt call拉取命令
  /usr/bin/salt-minion            # salt minion服务命令
  /usr/share/man/man1/salt-call.1.gz
  /usr/share/man/man1/salt-minion.1.gz
  使用salt推送几个常用的命令进行测试:
  [root@master ~]# salt '*' test.ping
  node01.saltstack.com:
  True
  说明:返回值为True,表明执行的结果是正确的
  [root@master ~]# salt 'node01.saltstack.com' cmd.run 'df -h'
  node01.saltstack.com:
  Filesystem      Size  Used Avail Use% Mounted on
  /dev/sda5        14G  8.4G  4.5G  66% /
  tmpfs           932M   84K  932M   1% /dev/shm
  /dev/sda1       190M   42M  139M  23% /boot
  /dev/sda3       2.0G   18M  1.8G   1% /tmp
  [root@master ~]# salt 'node01.saltstack.com' cmd.run 'ntpdate -u 10.203.10.20'
  node01.saltstack.com:
  15 Feb 13:37:12 ntpdate[9245]: step time server 10.203.10.20 offset -28800.128648 sec
  补充信息:salt-cp是个非常常用的命令,下面举例说明下常见的用法
  [root@master ~]# echo "welcome to China">>test.txt
  [root@master ~]# salt-cp '*' test.txt /tmp/
  {'node01.saltstack.com': {'/tmp/test.txt': True},
  'node02.saltstack.com': {'/tmp/test.txt': True}}
  [root@master ~]# salt '*' cmd.run 'cat /tmp/test.txt'
  node01.saltstack.com:
  welcome to China
  node02.saltstack.com:
  welcome to China
  [root@master ~]# salt-cp -E 'node[0-9][1-9].saltstack.com' test.txt /tmp/test2.txt
  {'node01.saltstack.com': {'/tmp/test2.txt': True},
  'node02.saltstack.com': {'/tmp/test2.txt': True}}
  [root@master ~]# salt-cp -G 'os:CentOS' test.txt /tmp/test3.txt
  {'node01.saltstack.com': {'/tmp/test3.txt': True},
  'node02.saltstack.com': {'/tmp/test3.txt': True}}
  到此,salt的master以及minion端的安装就已完成
  saltstack项目实战_安装nginx
  创建nginx所需目录
  [root@node1 ~]# cd /data/etc/salt/
  [root@node1 salt]# mkdir -p nginx/files
  [root@node1 salt]# cd nginx/files/
  [root@node1 files]# wget http://nginx.org/download/nginx-1.11.3.tar.gz
  [root@node1 salt]# tree nginx/
  nginx/
  |-- conf.sls
  |-- files
  |   |-- nginx
  |   |-- nginx-1.11.3.tar.gz
  |   |-- nginx.conf
  |   |-- nginx_log_cut.sh
  |   `-- vhost.conf
  |-- init.sls
  |-- install.sls
  `-- vhost.sls
  [root@node1 salt]# cat nginx/init.sls
  include:
  - nginx.install
  - nginx.conf
  - nginx.vhost
  [root@node1 salt]# cat top.sls
  base:
  '*':
  - nginx.init
  2. 安装nginx文件
  [root@node1 nginx]# vim install.sls
  nginx_source:
  file.managed:
  - name: /usr/local/src/nginx-1.11.3.tar.gz
  - unless: test -e /usr/local/src/nginx-1.11.3.tar.gz
  - user: root
  - group: root
  - source: salt://nginx/files/nginx-1.11.3.tar.gz
  nginx_pkg:
  pkg.installed:
  - pkgs:
  - openssl-devel
  - pcre-devel
  - zlib-devel
  - unzip
  nginx_user:
  user.present:
  - name: www
  - createhome: False
  - shell: /sbin/nologin
  nginx_extrace:
  cmd.run:
  - cwd: /usr/local/src
  - names:
  - tar zxf nginx-1.11.3.tar.gz && chown -R root:root nginx-1.11.3
  - unless: test -d /usr/local/src/nginx-1.11.3
  - require:
  - pkg: nginx_pkg
  nginx_compile:
  cmd.run:
  - name: cd /usr/local/src/nginx-1.11.3 && ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_gzip_static_module --with-http_ssl_module --with-http_realip_module && make && make install
  - unless: test -d /usr/local/nginx
  - require:
  - cmd: nginx_extrace
  - user: nginx_user
  create_dir:
  cmd.run:
  - names:
  - chown -R www:www /usr/local/nginx/html && mkdir -p /usr/local/nginx/conf/vhost
  - unless: test -d /usr/local/nginx/conf/vhost
  - require:
  - cmd: nginx_compile
  3. 管理nginx配置文件
  [root@node1 nginx]# cat conf.sls
  include:
  - nginx.install               -> 引用nginx目录下install.sls文件
  {% set nginx_user = 'www' %}
  nginx_conf:
  file.managed:                 -> nginx主配置文件
  - name: /usr/local/nginx/conf/nginx.conf
  - source: salt://nginx/files/nginx.conf
  - template: jinja
  - defaults:
  nginx_user: ` nginx_user `
  num_cpus: {{ grains['num_cpus'] }}
  nginx_service:                  -> nginx服务管理
  file.managed:
  - name: /etc/init.d/nginx
  - user: root
  - group: root
  - mode: 755
  - source: salt://nginx/files/nginx
  cmd.run:
  - names:
  - /sbin/chkconfig --add nginx && /sbin/chkconfig nginx on
  - unless: /sbin/chkconfig --list nginx
  service.running:
  - name: nginx
  - enable: True

  ->  - watch:
  - file: /usr/local/nginx/conf/vhost/*.conf
  nginx_log_cut:
  file.managed:
  - name: /usr/local/nginx/sbin/nginx_log_cut.sh
  - source: salt://nginx/files/nginx_log_cut.sh
  cron.present:
  - name: sh /usr/local/nginx/sbin/nginx_log_cut.sh
  - user: root
  - minute: 10
  - hour: 0
  - require:
  - file: nginx_log_cut
  4. 使用pillar适合针对不同的主机动态生成配置文件
  [root@node1 ~]# cd /data/etc/salt/pillar/
  [root@node1 pillar]# cat top.sls
  base:
  '*':
  - vhost
  [root@node1 pillar]# cat vhost.sls
  vhost:
  {% if 'node2' in grains['id'] %}     -> 如果id中有node2字符, 使用www配置文件, 反之使用bbs.conf
  - name: www
  target: /usr/local/nginx/conf/vhost/www.conf
  {% else %}
  - name: bbs
  target: /usr/local/nginx/conf/vhost/bbs.conf
  {% endif %}
  5. 生成虚拟主机配置文件
  [root@node1 pillar]# cd /data/etc/salt/nginx/
  [root@node1 nginx]# cat vhost.sls
  include:
  - nginx.install
  {% for vhostname in pillar['vhost'] %}
  {{ vhostname['name'] }}:
  file.managed:
  - name: {{ vhostname['target'] }}
  - source: salt://nginx/files/vhost.conf
  - target: {{ vhostname['target'] }}
  - template: jinja
  - defaults:
  server_name: {{grains['fqdn']}}
  log_name: {{vhostname['name']}}
  - watch_in:
  service: nginx
  {% endfor %}
  6. nginx主配置文件模版
  [root@node1 nginx]# vim files/nginx.conf
  user ` nginx_user `;
  worker_processes {{grains['num_cpus']}};
  error_log logs/nginx_error.log notice;
  pid logs/nginx.pid;
  worker_rlimit_nofile 65535;
  events{
  use epoll;
  worker_connections 65535;
  }
  http{
  include       mime.types;
  default_type  application/octet-stream;
  charset  utf-8;
  server_names_hash_bucket_size 128;
  client_header_buffer_size 32k;
  large_client_header_buffers 4 32k;
  client_max_body_size 128m;
  sendfile on;
  tcp_nopush     on;
  keepalive_timeout 60;
  tcp_nodelay on;
  server_tokens off;
  client_body_buffer_size  512k;
  gzip on;
  gzip_min_length  1k;
  gzip_buffers     4 16k;
  gzip_http_version 1.1;
  gzip_comp_level 2;
  gzip_types      text/plain application/x-javascript text/css application/xml;
  gzip_vary on;
  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  '$status $body_bytes_sent "$http_referer" '
  '"$http_user_agent" "$http_x_forwarded_for" "$host"' ;
  include vhost/*.conf;
  }
  7. nginx服务管理脚本
  [root@node1 nginx]# cat files/nginx
  #!/bin/sh
  # chkconfig: - 30 21
  # description: http service.
  # Source Function Library
  . /etc/init.d/functions
  # Nginx Settings
  NGINX_SBIN="/usr/local/nginx/sbin/nginx"
  NGINX_CONF="/usr/local/nginx/conf/nginx.conf"
  NGINX_PID="/usr/local/nginx/logs/nginx.pid"
  RETVAL=0
  prog="Nginx"
  start() {
  echo -n $"Starting $prog: "
  mkdir -p /dev/shm/nginx_temp
  daemon $NGINX_SBIN -c $NGINX_CONF
  RETVAL=$?
  echo
  return $RETVAL
  }
  stop() {
  echo -n $"Stopping $prog: "
  killproc -p $NGINX_PID $NGINX_SBIN -TERM
  rm -rf /dev/shm/nginx_temp
  RETVAL=$?
  echo
  return $RETVAL
  }
  reload(){
  echo -n $"Reloading $prog: "
  killproc -p $NGINX_PID $NGINX_SBIN -HUP
  RETVAL=$?
  echo
  return $RETVAL
  }
  restart(){
  stop
  start
  }
  configtest(){
  $NGINX_SBIN -c $NGINX_CONF -t
  return 0
  }
  case "$1" in
  start)
  start
  ;;
  stop)
  stop
  ;;

  >
  >  ;;
  restart)
  restart
  ;;
  configtest)
  configtest
  ;;
  *)
  echo $"Usage: $0 {start|stop|reload|restart|configtest}"
  RETVAL=1
  esac
  exit $RETVAL
  8. nginx日志切割脚本
  [root@node1 nginx]# cat files/nginx_log_cut.sh
  #!/bin/bash
  logs_path=/usr/local/nginx/logs
  yesterday=`date -d "yesterday" +%F`
  mkdir -p $logs_path/$yesterday
  cd $logs_path
  for nginx_logs in `ls *log` ;do
  mv $nginx_logs ${yesterday}/${yesterday}-${nginx_logs}
  kill -USR1  `cat /data/src/nginx/logs/nginx.pid`
  done
  9. 虚拟主机配置文件
  [root@node1 nginx]# cat files/vhost.conf
  server
  {
  listen       80;
  server_name ` server_name `;      -> 调用vhosts.sls中配置
  index index.html index.htm ;
  root  html;
  #location ~ .*\.(php|php5)?$
  #        {
  #                try_files $uri =404;
  #                fastcgi_pass  unix:/tmp/php-cgi.sock;
  #                fastcgi_index index.php;
  #                include fcgi.conf;
  #        }
  location /status {
  stub_status on;
  }
  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
  {
  expires      30d;
  }
  location ~ .*\.(js|css)?$
  {
  expires      1d;
  }
  access_log  logs/` log_name `-access.log  main;
  }
  10. SaltStack install Nginx
  [root@node1 nginx]# salt 'node2' state.highstate test=True       -> 无报错既可
  [root@node1 nginx]# salt 'node2' state.highstate
  [root@node1 nginx]# curl 172.168.200.211 -I
  HTTP/1.1 200 OK
  Server: nginx
  Date: Mon, 29 Aug 2016 08:28:25 GMT
  Content-Type: text/html;
  Content-Length: 612
  Last-Modified: Mon, 29 Aug 2016 07:55:02 GMT
  Connection: keep-alive
  ETag: "57c3ea56-264"
  Accept-Ranges: bytes
  saltstack项目实战_安装mysql
  1.1安装mysql
  2.2查看salt-master、salt-minion配置文件
  [root@node1 ~]# grep -Ev '^#|^$' /etc/salt/master
  interface: 0.0.0.0
  file_roots:
  base:
  - /data/etc/salt
  prod:
  - /data/etc/salt/prod
  log_file: /data/logs/salt/master
  [root@node2 ~]# grep -Ev '^#|^$' /etc/salt/minion
  master: 172.168.200.210
  id: node2
  log_file: /data/logs/salt/minion
  2.3 查看salt mysql目录结构
  [root@node1 ~]# cd /data/etc/salt
  [root@node1 salt]# tree mysql/
  mysql/
  |-- conf.sls                    -> mysql salt配置文件
  |-- files
  |   |-- my.cnf                  -> mysql配置文件
  |   |-- mysql-5.6.32.tar.gz     -> mysql软件包
  |   `-- mysqld                  -> mysql启动脚本
  |-- init.sls                    -> salt初始化文件
  `-- install.sls                 -> mysql install文件
  2.4 编写 mysql sls文件
  [root@node1 salt]# cat top.sls
  base:
  '*':
  - mysql.init
  [root@node1 salt]# cd mysql/
  [root@node1 mysql]# cat init.sls
  include:
  - mysql.install
  - mysql.conf
  [root@node1 mysql]# cat install.sls
  #mysql pkg.install
  mysql_pkg:
  pkg.installed:
  - names:
  - gcc
  - gcc-c++
  - autoconf
  - automake
  - openssl
  - openssl-devel
  - zlib
  - zlib-devel
  - ncurses-devel
  - libtool-ltdl-devel
  - cmake
  #install source mysql
  mysql_source:
  file.managed:
  - name: /usr/local/src/mysql-5.6.32.tar.gz
  - unless: test -e /usr/local/src/mysql-5.6.32.tar.gz
  - source: salt://mysql/files/mysql-5.6.32.tar.gz
  #tar source mysql
  extract_mysql:
  cmd.run:
  - cwd: /usr/local/src
  - names:
  - tar zxf mysql-5.6.32.tar.gz
  - chown -R root:root /usr/local/src/mysql-5.6.32
  - unless: tests -d /usr/local/src/mysql-5.6.32
  - require:
  - file: mysql_source
  #useradd for mysql
  mysql_user:
  user.present:
  - name: mysql
  - uid: 1024
  - createhome: False
  - gid_from_name: True
  - shell: /sbin/nologin
  #mysql source install
  mysql_commpile:
  cmd.run:
  - name: cd /usr/local/src/mysql-5.6.32 && cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.6 -DMYSQL_DATADIR=/usr/local/mysql-5.6/data -DMYSQL_UNIX_ADDR=/usr/local/mysql-5.6/data/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DENABLED_LOCAL_INFILE=ON -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH-BLACKHOLE_STORAGE_ENGINE=1 -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 -DWITHOUT_PARTITION_STORAGE_ENGING=1 -DWITH_FAST_MUTEXES=1 -DWITH_ZLIB=bundled -DENABLED_LOCAL_INFIL=1 -DWITH_READLINE=1 -DWITH_EMBEDDED_SERVER=1 -DWITH_DEBUG=0 && make && make install && /usr/local/mysql-5.6/scripts/mysql_install_db --basedir=/usr/local/mysql-5.6/ --datadir=/usr/local/mysql-5.6/data/ --user=mysql
  - require:
  - cmd: extract_mysql
  - pkg: mysql_pkg
  - unless: test -d /usr/local/mysql-5.6
  #mysql initialize
  #mysql_initialize:
  #  cmd.run:
  #    - cwd: /usr/local/mysql-5.6/scripts/
  #    - names:
  #      - ./mysql_install_db --basedir=/usr/local/mysql-5.6/ --datadir=/usr/local/mysql-5.6/data/ --user=mysql
  [root@node1 mysql]# cat conf.sls
  include:
  - mysql.install
  #mysql for config
  mysql_cnf:
  file.managed:
  - name: /usr/local/mysql-5.6/my.cnf
  - user: root
  - mode: 755
  - source: salt://mysql/files/my.cnf
  #myql server
  mysql_service:
  file.managed:
  - name: /etc/init.d/mysqld
  - source: salt://mysql/files/mysqld
  - user: root
  - mode: 755
  cmd.run:
  - names:
  - /sbin/chkconfig --add mysqld
  - /sbin/chkconfig --level 35 mysqld on
  - unless: /sbin/chkconfig --list mysqld
  2.5 mysql配置文件
  [root@node1 ~]# cd /data/etc/salt/mysql/files/
  [root@node1 files]# cat my.cnf
  [mysqld]
  socket=/usr/local/mysql-5.6/data/mysql.sock
  datadir=/usr/local/mysql-5.6/data
  symbolic-links=0
  log-error=/var/log/mysql_error.log
  pid-file=/usr/local/mysql-5.6/data/mysqld.pid
  slow-query-log-file = /var/log/mysql_slow_querys.log
  skip-name-resolve
  skip-grant-tables
  2.6 mysql启动脚本添加下面路径
  [root@node1 files]# cat mysqld
  #!/bin/sh
  basedir=/usr/local/mysql-5.6/
  datadir=/usr/local/mysql-5.6/data/
  2.7 模拟执行salt
  1
  [root@node1 salt]# salt 'node2' state.highstate  test=True    -> 无报错即可
  [root@node1 salt]# salt 'node2' state.highstate   ->开始安装mysql

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-543973-1-1.html 上篇帖子: Saltstack客户端安装脚本 下篇帖子: saltstack实践haproxy+keepalived
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表