Saltstack概述

Salt一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯。

salt底层采用动态的连接总线, 使其可以用于编配, 远程执行, 配置管理等等.

参考中文文档:http://docs.saltstack.cn/zh_CN/latest/topics/tutorials/starting_states.html

参考英文文档:https://docs.saltstack.com/en/latest/

Saltstack运行模式:

  • Local
  • Master/Minion
  • Salt SSH

Saltstack三大功能:

  • 远程执行(执行远程命令)
  • 配置管理(状态管理)
  • 云管理

Saltstack部署环境准备:

1、主机名要固定统一

[root@linux-node1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
:: localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.7 linux-node1.example.com linux-node1
10.0.0.8 linux-node2.example.com linux-node2
[root@linux-node1 ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=linux-node1.example.com

而且能够ping通

要想实现自动化运维,首先要满足PPT原则(流程、人员、工具技术)

Saltstack准备环境

两台Centos6.6,10.0.0.7做master,10.0.0.8做minion

1、安装epel和salt组件

# 安装epel源
[root@linux-node1 ~]# rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-6.noarch.rpm
# 服务端安装master
[root@linux-node1 ~]# yum -y install salt-master
# 为了做实验,在服务端也安装下客户端
[root@linux-node1 ~]# yum -y install salt-minion
# 客户端安装minion
[root@linux-node2 ~]# yum -y install salt-minion
# 设置开机启动
[root@linux-node1 ~]# chkconfig salt-master on
[root@linux-node1 ~]# chkconfig salt-minion on

提示:如果安装时提示没有依赖包,说明yum源版本不够,可以去saltstack官网http://repo.saltstack.com/#rhel 找到对应系统安装即可(或https://repo.saltstack.com/yum/redhat/里面找相应版本repo文件下载),可能安装的yum文件路径会报错,可以自行对应修改。

设置完成后,可以先讲master启动。然后修改配置文件,需要告诉minion端master是谁。

2、启动master服务

[root@linux-node1 ~]# /etc/init.d/salt-master start
Starting salt-master daemon: [确定]

3、修改两台客户端的配置文件

[root@linux-node1 ~]# egrep "master: 10.0.0.7|#id" /etc/salt/minion
master: 10.0.0.7
#id:

master:master的IP地址

id:默认通过python的方法socket.getfqdn()去获取fqdn名。所以要求设置好主机名并能解析。也可以使用IP地址,看业务需求。

4、启动minion客户端。

[root@linux-node1 ~]# /etc/init.d/salt-minion start
Starting salt-minion daemon: [确定]
[root@linux-node2 ~]# /etc/init.d/salt-minion start
Starting salt-minion daemon: [确定]

5、minion端的认证

# minion启动的时候会创建KEY
[root@linux-node1 /]# ll /etc/salt/pki/minion/
总用量
-r-------- root root 12月 : minion.pem
-rw-r--r-- root root 12月 : minion.pub
# master启动的时候会创建KEY
[root@linux-node1 /]# ll /etc/salt/pki/master/
总用量
-r-------- root root 12月 : master.pem
-rw-r--r-- root root 12月 : master.pub
# 等待同意的Key
[root@linux-node1 /]# ll /etc/salt/pki/master/minions_pre/
总用量
-rw-r--r-- root root 12月 : linux-node1.example.com
-rw-r--r-- root root 12月 : linux-node2.example.com
# 查看需要同意的Key
[root@linux-node1 /]# salt-key
Accepted Keys:
Denied Keys:
Unaccepted Keys:
linux-node1.example.com
linux-node2.example.com
Rejected Keys:
# 执行同意操作 -A 全部同意
[root@linux-node1 /]# salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
linux-node1.example.com
linux-node2.example.com
Proceed? [n/Y] y
Key for minion linux-node1.example.com accepted.
Key for minion linux-node2.example.com accepted.
# -a 匹配的同意,可以使用*通配符
[root@linux-node1 /]# salt-key -a linux*
# 通过认证的主机位置会发生改变,原本在minion_pre下面
[root@linux-node1 /]# tree /etc/salt/pki/master/
/etc/salt/pki/master/
├── master.pem
├── master.pub
├── minions
│ ├── linux-node1.example.com
│ └── linux-node2.example.com
├── minions_autosign
├── minions_denied
├── minions_pre
└── minions_rejected

其实上面的master下面的minion中的两个主机名命名的文件是minion端的公钥(你要是不信自己打开see),同时在master认证通过的时候,master也偷偷的把他的公钥放到了minion端一份。用事实说话,在minion端上查看。

[root@linux-node2 ~]# ll /etc/salt/pki/minion/
总用量 12
-rw-r--r-- 1 root root 451 12月 28 23:11 minion_master.pub
-r-------- 1 root root 1675 12月 28 23:03 minion.pem
-rw-r--r-- 1 root root 451 12月 28 23:03 minion.pub

6:salt-key命令

[root@linux-node1 /]# salt-key --help
Actions:
-l ARG, --list=ARG List the public keys. The args "pre", "un", and
"unaccepted" will list unaccepted/unsigned keys. "acc"
or "accepted" will list accepted/signed keys. "rej" or
"rejected" will list rejected keys. "den" or "denied"
will list denied keys. Finally, "all" will list all
keys.
-L, --list-all List all public keys. (Deprecated: use "--list all")
-a ACCEPT, --accept=ACCEPT
Accept the specified public key (use --include-all to
match rejected keys in addition to pending keys).
Globs are supported.
-A, --accept-all Accept all pending keys
-r REJECT, --reject=REJECT
Reject the specified public key (use --include-all to
match accepted keys in addition to pending keys).
Globs are supported.
-R, --reject-all Reject all pending keys
--include-all Include non-pending keys when accepting/rejecting
-p PRINT, --print=PRINT
Print the specified public key
-P, --print-all Print all public keys
-d DELETE, --delete=DELETE
Delete the specified key. Globs are supported.
-D, --delete-all Delete all keys

Saltstack远程执行

salt命令  ‘client’ 模块.方法   ‘参数’

[root@linux-node1 /]# salt '*' test.ping
linux-node1.example.com:
True
linux-node2.example.com:
True
[root@linux-node1 /]# salt '*' cmd.run 'w'
linux-node2.example.com:
:: up min, user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/ 10.0.0.1 : : .06s .06s -bash
linux-node1.example.com:
:: up min, users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/ 10.0.0.1 : .00s .85s .67s /usr/bin/python
root pts/ 10.0.0.1 : : .00s .00s -bash

Saltstack配置管理

1、修改master的配置文件

# 开启base环境
[root@linux-node1 /]# vim /etc/salt/master
:file_roots:
: base:
: - /srv/salt
# 创建目录
[root@linux-node1 /]# mkdir /srv/salt
# 只要改动配置文件就要重启
[root@linux-node1 /]# /etc/init.d/salt-master restart
Stopping salt-master daemon: [确定]
Starting salt-master daemon: [确定]

2:写一个apache的安装sls

[root@linux-node1 salt]# cd /srv/salt/
[root@linux-node1 salt]# cat /srv/salt/apache.sls
apache-install:
pkg.installed:
- names:
- httpd
- httpd-devel
apache-service:
service.running:
- name: httpd
- enable: True
- reload: True
# 在所有minion端,执行state模块下的sls方法,运行apache这个状态
[root@linux-node1 salt]# salt '*' state.sls apache
# 检查是否安装成功
[root@linux-node1 salt]# lsof -i:

apache-install:                                   #ID声明,声明是干什么用的

pkg.installed:                                 #PKG是一个软件包状态模块,installed是其中的方法

- names:                                     #表明要装的包的名字,因为是装多个包

- httpd

- httpd-devel

[root@linux-node1 master]# salt '*' state.sls apache

#使用salt对所有的机器使用state这个模块下的sls方法来执行apache这个状态模块

#如果使用的分目录的方式,执行的方法是:salt '*' state.sls init.apache

3、使用高级状态

要有一个入口文件默认是top.sls,不建议修改,且必须放在base环境目录下。

# top文件,入口文件
[root@linux-node1 salt]# cat /srv/salt/top.sls
base:
'*.example.com':
- apache
# 使用高级状态执行
[root@linux-node1 salt]# salt '*' state.highstate

Saltstack数据系统

Grains  and    Pillar

Grains里面收集了minion启动时候的所有系统信息,存储在minion端。静态数据,只有重启的时候才重新收集。

在minion设置

应用场景:

1、信息查询

# 查看grains的key
[root@linux-node1 salt]# salt 'linux-node1*' grains.ls
# 查看grains的所有信息
[root@linux-node1 salt]# salt 'linux-node1*' grains.items
# 查询某个的信息
[root@linux-node1 salt]# salt 'linux-node1*' grains.get fqdn 或 salt 'linux-node1*' grains.item fqdn
linux-node1.example.com: 
  linux-node1.example.com
[root@linux-node1 salt]# salt 'linux-node1*' grains.get os
linux-node1.example.com:
  CentOS

2、主机匹配

# 使用granis来匹配主机 -G 参数,
[root@linux-node1 salt]# salt -G 'os:CentOS' cmd.run 'uptime'
linux-node2.example.com:
:: up :, user, load average: 0.00, 0.00, 0.00
linux-node1.example.com:
:: up :, users, load average: 0.00, 0.00, 0.00
# 编辑minion配置文件,自定义设置角色,我添加一个cgt
[root@linux-node1 ~]# vim /etc/salt/minion
grains:
roles:
- webserver
- memcache
- cgt
# 修改配置文件需要重启服务
[root@linux-node1 ~]# /etc/init.d/salt-minion restart
Stopping salt-minion daemon: [确定]
Starting salt-minion daemon: [确定]
# 对角色有cgt的机器进行操作
[root@linux-node1 salt]# salt -G roles:cgt cmd.run 'uptime'
linux-node1.example.com:
:: up :, users, load average: 0.06, 0.02, 0.00

如果你觉得写在配置文件中不方便,可以写在他的一个默认文件中,在minion配置文件中开启default_include: minion.d/*.conf,并在对应目录编写.conf文件如下

[root@linux-node1 ~]# vim /etc/salt/minion.d/grains_test.conf
grains:
roles:
- nginx
- apache
Sys:
- centos
- danny

3、在top.sls中匹配使用

[root@linux-node1 salt]# cat /srv/salt/top.sls
base:
'os:CentOS':
- match: grain
- apache
[root@linux-node1 salt]# salt '*' state.highstate

Pillar:给minion指定它想要的数据。

在master端设置的

1、修改配置文件

# 在服务端开启pillar
[root@linux-node1 ~]# vim /etc/salt/master
pillar_roots:
base:
- /srv/pillar
pillar_opts: False
[root@linux-node1 ~]# mkdir /srv/pillar
[root@linux-node1 ~]# /etc/init.d/salt-master restart
Stopping salt-master daemon: [确定]
Starting salt-master daemon: [确定]

2、编写pillar中的文件

# 编写一个apache.sls 这是pillar中的,与前面的salt下的文件没有任何的关系
[root@linux-node1 ~]# cat /srv/pillar/apache.sls
{%if grains['os'] == 'CentOS' %}
apache: httpd
{% elif grains['os'] == 'Debian' %}
apache: apache2
{% endif %}
# 告诉pillar下面哪些主机可以来使用apache.sls文件,这是所有主机*
[root@linux-node1 ~]# cat /srv/pillar/top.sls
base:
'*':
- apache

3、执行pillar

因为都是centos是系统,所以获取的都是httpd

[root@linux-node1 ~]# salt '*' pillar.items
linux-node2.example.com:
----------
apache:
httpd
linux-node1.example.com:
----------
apache:
httpd

4、用来定位主机

# 对apache:httpd的minion执行命令
[root@linux-node1 ~]# salt -I 'apache:httpd' test.ping
No minions matched the target. No command was sent, no jid was assigned.
ERROR: No return received
# 刷新pillar,grains是需要重启minion端,pillar是需要刷新
[root@linux-node1 ~]# salt '*' saltutil.refresh_pillar
linux-node2.example.com:
True
linux-node1.example.com:
True
[root@linux-node1 ~]# salt -I 'apache:httpd' test.ping
linux-node2.example.com:
True
linux-node1.example.com:
True

Grains和Pillar的区别

远程执行

  • 目标(Targeting)
  • 模块(Module)
  • 返回(Returnners)

Targeting目标

1、Globbing and regex

匹配minions 通过通配符和正则表达式,与minion ID有关系。

2、Grains

用来匹配minion的grains,是指那些关于minion主机的静态信息,比如OS,软件版本,虚拟化,CPU,内存等等。

3、Pillar

通过用户定义的变量匹配minion主机

4、Subnet/IP Address

通过子网或IP地址匹配minion主机(当前仅支持IPV4)。

5、Compound matching

把上面的全部匹配器组合为一个表达式。

6、Node groups

在master配置文件中静态定义minion组,使用:ref:复合 <targeting-compound> 匹配语法。

7、Batching execution

一些命令集在匹配上的minions时只需要执行一次。

Modules模块

Salt 模块是远程执行的基础。它提供了一系列的功能,比如安装包,重启一个服务,运行名称命令,传输文件等等。

用户权限的限制

# 设置用户名:larry,和可以执行的命令
[root@linux-node1 ~]# vim /etc/salt/master
client_acl:
larry:
- test.ping
- network.*
# 更改权限
[root@linux-node1 sudoers.d]# chmod /var/cache/salt /var/cache/salt/master /var/cache/salt/master/jobs /var/run/salt /var/run/salt/master
# 重启服务
[root@linux-node1 sudoers.d]# /etc/init.d/salt-master restart
# 切换到larry用户执行
[larry@linux-node1 ~]$ salt '*' test.ping
linux-node2.example.com:
True
linux-node1.example.com:
True
[larry@linux-node1 ~]$ salt '*' cmd.run 'uptime'
Failed to authenticate!

Returners

Salt返回接收器(returner)允许把minion的响应保存在各种数据存储或不同的位置,甚至把响应内容显示在命令行。Returner可以用来扩展Salt,和新的、定制的接口和支持新的数据库进行通信。

以mysql的返回为例

# 安装数据库
[root@linux-node1 ~]# yum -y install mysql-server
# 安装依赖包
[root@linux-node1 ~]# yum -y install python-mysqldb
# 启动数据库
[root@linux-node1 ~]# /etc/init.d/mysqld start
# 客户端安装MySQL-python
[root@linux-node1 ~]# yum -y install MySQL-python

创建相应的表

CREATE DATABASE  `salt`
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci; USE `salt`; DROP TABLE IF EXISTS `jids`; CREATE TABLE `jids` (
`jid` varchar() NOT NULL,
`load` mediumtext NOT NULL,
UNIQUE KEY `jid` (`jid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; DROP TABLE IF EXISTS `salt_returns`; CREATE TABLE `salt_returns` (
`fun` varchar() NOT NULL,
`jid` varchar() NOT NULL,
`return` mediumtext NOT NULL,
`id` varchar() NOT NULL,
`success` varchar() NOT NULL,
`full_ret` mediumtext NOT NULL,
`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
KEY `id` (`id`),
KEY `jid` (`jid`),
KEY `fun` (`fun`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; DROP TABLE IF EXISTS `salt_events`;
CREATE TABLE `salt_events` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`tag` varchar() NOT NULL,
`data` varchar() NOT NULL,
`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `tag` (`tag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; grant all on salt.* to salt@'10.0.0.0/255.255.255.0' identified by 'salt';

修改配置文件

此种方式是主动去Minion端获取,推荐使用。

如果不加job_cache,开启上面的return,就是被动接收。比较麻烦,不但需要每台minion都装上mysql对应的包,还需要客户端也要修改配置文件,添加同样的内容。

[root@linux-node1 ~]# vim /etc/salt/master
#return: mysql
master_job_cache: mysql
mysql.host: '10.0.0.7'    //master_IP,指定master
mysql.user: 'salt'
mysql.pass: 'salt'
mysql.db: 'salt'
mysql.port:

检查是否生效

[root@linux-node1 ~]# /etc/init.d/salt-master restart
[root@linux-node1 ~]# salt '*' saltutil.refresh_pillar
linux-node1.example.com:
True
linux-node2.example.com:
True
[root@linux-node1 ~]# salt '*' test.ping
linux-node2.example.com:
True
linux-node1.example.com:
True # 数据库中检查有么有获取到数据(主动去minion端获取)
mysql> use salt;
mysql> select * from salt_returns;

配置管理

配置管理是通过远程管理来实现的。

环境配置

# 开启分别的file_roots
[root@linux-node1 ~]# vim /etc/salt/master
file_roots:
base:
- /srv/salt/base
test:
- /srv/salt/test
prod:
- /srv/salt/prod
# 重新启动master
[root@linux-node1 ~]# /etc/init.d/salt-master restart
Stopping salt-master daemon: [确定]
Starting salt-master daemon: [确定]
# 创建路径
[root@linux-node1 ~]# mkdir /srv/salt/base
[root@linux-node1 ~]# mkdir /srv/salt/test
[root@linux-node1 ~]# mkdir /srv/salt/prod
[root@linux-node1 salt]# ll /srv/salt/base/
总用量
-rw-r--r-- root root 12月 : apache.sls
-rw-r--r-- root root 12月 : top.sls
[root@linux-node1 salt]# tree
.
├── base
│ ├── apache.sls
│ └── top.sls
├── prod
└── test
[root@linux-node1 ~]# mkdir /srv/salt/base/files

编写配置文件

[root@linux-node1 base]# vim dns.sls
/etc/resolv.conf:
file.managed:
- source: salt://files/resolv.conf
- user: root
- group: root
- mode: [root@linux-node1 base]# cp /etc/resolv.conf /srv/salt/base/files/
[root@linux-node1 base]# cd /srv/salt/base/files/
# 做点修改,最下面加点#
[root@linux-node1 files]# vim resolv.conf
# Generated by NetworkManager
nameserver 10.0.0.2
#########

执行状态

# 执行方式一
# 执行状态(单独执行某个状态)
[root@linux-node1 files]# salt '*' state.sls dns
# 到minion端查看
[root@linux-node2 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 10.0.0.2
######### # 执行方式二
# 如果想使用高级状态执行,需要在top.sls中写明
[root@linux-node1 files]# vim /srv/salt/base/top.sls
base:
'*':
- dns
# 执行高级状态,从top.sls中读取,在执行
[root@linux-node1 files]# salt '*' state.highstate

salt语法:YAML 
规则一:缩进 
        两个空格组成 
        不要使用tab键 
规则二:冒号 
        他的结果是以字典的方式 
        以冒号结尾和路径不需要加冒号 
        以冒号结尾 
规则三:短横线线 
        表示是一种列表关系(字典中的列表)      
        短横线后加空格

jinja模版

jinja模版的创建

# jinja模版
# 有- template: 就代表这个文件就是一个模版文件
# - defaults: 是变量列表
[root@linux-node1 base]# vim dns.sls
/etc/resolv.conf:
file.managed:
- source: salt://files/resolv.conf
- user: root
- group: root
- mode:
- template: jinja
- defaults:
DNS_SERVER: 10.0.0.2

jinja模版的使用

# 模板文件里面变量使用方式{{ DNS_SERVER }}
[root@linux-node1 base]# vim /srv/salt/base/files/resolv.conf
# Generated by NetworkManager
# nameserver 10.0.0.2
nameserver {{ DNS_SERVER }}
# 执行高级状态
[root@linux-node1 base]# salt '*' state.highstate
# minion端查看,nameserver 自动将变量代换
[root@linux-node2 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
# nameserver 10.0.0.2
nameserver 10.0.0.2

jinja模版中使用Grains

# 使用grains
[root@linux-node1 base]# cat /srv/salt/base/files/resolv.conf
# Generated by NetworkManager
nameserver 10.0.0.2
# {{ grains['fqdn_ip4'] }}
# minion端查看
[root@linux-node2 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 10.0.0.2
# ['10.0.0.8']

还可以在jinja模版中使用执行模块和Pillar

案例

设置DNS执行文件

[root@linux-node1 base]# cd  /srv/salt/base/
[root@linux-node1 base]# mkdir -pv init/files
# dns设置
[root@linux-node1 base]# cat /srv/salt/base/init/dns.sls
/etc/resolv.conf:
file.managed:
- source: salt://init/files/resolv.conf
- user: root
- group: root
- mode: [root@linux-node1 base]# cp /etc/resolv.conf /srv/salt/base/init/files/

记录历史命令

格式:时间 用户 命令

[root@linux-node1 base]# cat /srv/salt/base/init/history.sls
/etc/profile:
file.append: #追加,file模块
- text:
- export HISTTIMEFORMAT="%F %T `whoami` "" "
[root@linux-node1 base]# tree /srv/salt/base/
/srv/salt/base/
├── init
│ ├── dns.sls
│ ├── files
│ │ └── resolv.conf
│ └── history.sls
└── top.sls

记录操作日志

写到/var/log/message

[root@linux-node1 init]# cat audit.sls
/etc/bashrc:
file.append:
- text:
- export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });logger "[euid=$(whoami)]":$(who am i):[`pwd`]"$msg";}'
#记录命令行命令到日志message中

内核调优

使用salt自带的模块sysctl

[root@linux-node1 init]# cat sysctl.sls
vm.swappiness:      #关闭交换空间的使用
sysctl.present:
- value: net.ipv4.ip_local_port_range:    #系统随机端口范围
sysctl.present:
- value: fs.file-max:    #系统最大文件描述符
sysctl.present:
- value:

#如何找呢?从/proc/sys/里面,然后后面的/用.来代替。

将初始化的sls放在一起

[root@linux-node1 init]# cat env_init.sls
include:
- init.dns
- init.history
- init.audit
- init.sysctl

修改top.sls文件

base环境下init目录下的env_init.sls

[root@linux-node1 init]# cat /srv/salt/base/top.sls
base:
'*':
- init.env_init

最终呈现结果

[root@linux-node1 base]# tree
.
├── init
│ ├── audit.sls
│ ├── dns.sls
│ ├── env_init.sls
│ ├── files
│ │ └── resolv.conf
│ ├── history.sls
│ └── sysctl.sls
└── top.sls

结果检查

重新打开minion的tty窗口,分别执行history和去message下面查看,检测

状态模块:状态间关系

功能:条件判断,主要用于cmd状态模块

常用方法:

onlyif:检查的命令,近当onlyif选项指向的命令返回true时才执行

name定义的命令

unless:用于检查的命令,仅当unless选项指向的命令返回false时才执行name指向的命令

功能名称:requisites

功能:处理状态间关系

常用方法:

require                     #我依赖某个状态

require_in                 #我被某个状态依赖

watch                        #我关注某个状态

watch_in                    #我被某个状态关注

saltstack一的更多相关文章

  1. saltstack初探

    salt-key -y -d linux-node1 #删除linux-node1节点的认证 salt -G 'cpuarch:x86_64' grains.item num_cpus >> ...

  2. saltstack命令执行过程

    saltstack命令执行过程 具体步骤如下 Salt stack的Master与Minion之间通过ZeroMq进行消息传递,使用了ZeroMq的发布-订阅模式,连接方式包括tcp,ipc salt ...

  3. Saltstack之salt-master的打开文件数问题

    一.引言: 单个salt-master下的minion数已经达到2101个了,所以在master日志有如下的提示: 2016-09-09 11:36:22,221 [salt.utils.verify ...

  4. Saltstack

    一.Satlstack的概述 Saltstack是什么? Salt是一种和以往不同的基础设施管理方法,它是建立在大规模系统高速通讯能力可以大幅提升的想法上.这种方法使得Salt成为一个强大的能够解决基 ...

  5. python virtualenv 安装运行saltstack

    需求产生场景:      1.python的virtualenv虚拟环境非常的好用.      2.saltstack作为运维自动化的一个重要组件也挺好用的. 但是:      1.saltsatck ...

  6. 自动化运维:网站svn代码上线更新(flask+saltstack)

    阶段性总结:      跌跌撞撞的用了一周左右的时间做完了网站自动升级功能,中间遇到了很多的问题,也学到了很多,在此做一个总结.   1.整体架构: 后台:nginx+uwsgi  #nginx提供w ...

  7. saltstack安装配置(halite)

    saltstack官方提供了一个简单的web UI--halite.但是给出的安装配置方法实在没法实现,在网上找了几篇博客,见文章末尾的参考链接,可以用起来了.但是功能有点简单.这篇文章记录安装配置h ...

  8. Saltstack异步执行命令(十三)

    Saltstack异步执行命令 salt执行命令有时候会有超时的问题,就是命令下发下去了,部分主机没有返回信息,这时候就很难判断命令或任务是否执行成功.因此,salt提供异步执行的功能,发出命令后立即 ...

  9. Saltstack之SSH(十一)

    Saltstack之SSH 安装 yum install -y salt-ssh 官方文档  https://docs.saltstack.com/en/latest/topics/ssh/index ...

  10. Saltstack之Syndic(十)

    Saltstack之Syndic 使用条件: 1.salt syndic必须运行在一台master上 2.salt syndic必须依赖更高级的master 安装 yum install -y sal ...

随机推荐

  1. PHPsql

    下面员工3的薪水大于其主管的薪水,一条SQL找到薪水比下属低的主管 id username salary pid 1 a 3000 null 2 b 8000 null 3 c 5000 1 4 d ...

  2. Flink 集群运行原理兼部署及Yarn运行模式深入剖析

    1 Flink的前世今生(生态很重要) 原文:https://blog.csdn.net/shenshouniu/article/details/84439459 很多人可能都是在 2015 年才听到 ...

  3. Java IO(二)——RandomAccessFile

    一.RandomAccessFile RandomAccessFile类可以说是Java语言中功能最为丰富的文件访问类,它提供了众多的文件访问方法.RandomAccessFile类支持"随 ...

  4. burnside+polya 整理

    先定义几个含义和符号:起始状态/方法/位置/元素/:以染色为例,起始状态是所有的染色方案,方法是以起始状态所有染色方案为基准转变为新的染色情景的操作(如旋转),位置则必须是没有任何染色效果的抽象空间, ...

  5. object detection[faster rcnn]

    这部分,写一写faster rcnn 0. faster rcnn 经过了rcnn,spp,fast rcnn,又到了faster rcnn,作者在对前面的模型回顾中发现,fast rcnn提出的ro ...

  6. 【原创】从策略模式闲扯到lambda表达式

    引言 策略模式,讲这个模式的文章很多,但都缺乏一个循序渐进的过程.讲lambda表达式的文章也很多,但基本都是堆砌一堆的概念,很少带有自己的见解.博主一时兴起,想写一篇这二者的文章.需要说明的是,在看 ...

  7. 区别:ASP.NET MVC的Model、DTO、Command

    最近在用CQRS架构模式做项目,有些感悟,记录下来. 问题的描述(大家是否也存在过类似的情况呢?): 从刚开始时项目中没有区分这3种对象,所以导致了很多职责公用,然后就乱了,比如Command一部分职 ...

  8. .NET-记一次架构优化实战与方案-前端优化

    目录 .NET-记一次架构优化实战与方案-梳理篇 .NET-记一次架构优化实战与方案-前端优化 .NET-记一次架构优化实战与方案-底层服务优化 前言 上一篇<.NET-记一次架构优化实战与方案 ...

  9. SQL SERVER中的两种常见死锁及解决思路

    在sql server中,死锁都与一种锁有关,那就是排它锁(x锁).由于在同一时间对同一个数据库资源只能有一个数据库进程可以拥有排它锁.因此,一旦多个进程都需要获取某个或者同一个数据库资源的排它访问权 ...

  10. 使用git将项目上传到github

    使用git将项目上传到github(最简单方法)   首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具,这里给出下 ...