参考链接: SaltStack-工作示例

Saltstack 远程执行

一、命令方式二、文件方式编辑远程执行文件编写远程执行模块使用top文件使用入口文件init.sls

三、使用saltstack安装配置httpd

Saltstack简介及部署可以参考:https://blog.csdn.net/qq_35887546/article/details/106172282

一、命令方式

Salt命令由三个主要部分构成:

salt '<target>' <function> [arguments]

target: 指定哪些minion, 默认的规则是使用globe匹配minion id.

salt内置的执行模块列表:http://docs.saltstack.cn/ref/modules/all/index.html

[root@server1 minions]# salt '*' test.ping

server2:

True

server3:

True

Targets也可以使用正则表达式:

[root@server1 minions]# salt -E 'server[1-4]' cmd.run hostname

server2:

server2

server3:

server3

funcation是module提供的功能,Salt内置了大量有效的functions.

注意当执行的函数有参数时,需要引号(单双都可以)引起来:

[root@server1 minions]# salt -E 'server[1-4]' cmd.run 'df -h'

server3:

Filesystem             Size  Used Avail Use% Mounted on

/dev/mapper/rhel-root   17G  1.2G   16G   8% /

devtmpfs               484M     0  484M   0% /dev

tmpfs                  496M   80K  496M   1% /dev/shm

tmpfs                  496M  6.7M  489M   2% /run

tmpfs                  496M     0  496M   0% /sys/fs/cgroup

/dev/sda1             1014M  133M  882M  14% /boot

tmpfs                  100M     0  100M   0% /run/user/0

server2:

Filesystem             Size  Used Avail Use% Mounted on

/dev/mapper/rhel-root   17G  1.2G   16G   8% /

devtmpfs               484M     0  484M   0% /dev

tmpfs                  496M  120K  496M   1% /dev/shm

tmpfs                  496M  6.7M  489M   2% /run

tmpfs                  496M     0  496M   0% /sys/fs/cgroup

/dev/sda1             1014M  133M  882M  14% /boot

tmpfs                  100M     0  100M   0% /run/user/0

Targets也可以指定列表:

[root@server1 minions]# salt -L 'server2,server3' test.ping

server2:

True

server3:

True

arguments通过空格来界定参数:

[root@server1 ~]# salt server2 sys.doc pkg       #查看模块文档

[root@server1 ~]# salt '*' pkg.install wget        #所有minion安装wget

[root@server1 ~]# salt '*' pkg.remove wget        #所有minion卸载wget

二、文件方式

编辑远程执行文件

查看配置文件可以看出slatstack默认的base文件目录为/srv/salt,其中salt目录需要我们自己新建:

[root@server1 ~]# mkdir /srv/salt

[root@server1 ~]# cd /srv/salt/

Salt 状态系统的核心是SLS,或者叫SaLt State 文件。

SLS表示系统将会是什么样的一种状态,而且是以一种很简单的格式来包含这些数据,常被叫做配置管理。 sls文件命名:

sls文件以”.sls”后缀结尾,但在调用是不用写此后缀。使用子目录来做组织是个很好的选择。init.sls 在一个子目录里面表示引导文件,也就表示子目录本身, 所以apache/init.sls就是表示apache.如果同时存在apache.sls 和 apache/init.sls,则 apache/init.sls 被忽略,apache.sls将被用来表示 apache.

接下来我们就可以编辑文件了,编辑的文件使用yaml语法:

规则一: 缩进 Salt需要每个缩进级别由两个空格组成,不要使用tabs。 规则二: 冒号 字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。 my_key: my_value 规则三: 短横杠 想要表示列表项,使用一个短横杠加一个空格。

list_value_onelist_value_two

示例,编辑文件:

[root@server1 salt]# vim install.sls

[root@server1 salt]# cat install.sls

httpd:                                ## ID声明

pkg.installed                        ##状态声明.函数声明

指定server2执行以上文件:

[root@server1 salt]# salt server2 state.sls install

注意,指定文件时不需要加后缀sls。

查看server2的日志可以看出已经安装: 可以看出还安装了很多依赖性的包。

也可以安装多个包:

[root@server1 salt]# vim install.sls

[root@server1 salt]# cat install.sls

httpd:

pkg.installed

wget:

pkg.installed

[root@server1 salt]# salt server3 state.sls install

查看server3日志可以看出已经安装成功: 再执行一次salt server3 state.sls install命令时状态将不会改变,这里与ansible类似:

也可以使用以下这种写法:

[root@server1 salt]# vim install.sls

[root@server1 salt]# cat install.sls

apache:

pkg.installed:

- pkgs:

- httpd

- wget

- php

卸载应用可以使用pkg.removed:

[root@server1 salt]# vim install.sls

[root@server1 salt]# cat install.sls

apache:

pkg.removed:

- pkgs:

- httpd

- wget

- php

[root@server1 salt]# salt '*' state.sls install

以上表示再所有节点卸载httpd,wget,php。 查看日志可以看出已经卸载:

编写远程执行模块

我们也可以自定义saltstack模块,自定义的模块需要在/srv/salt/_modules目录中:

创建模块目录:

[root@server1 salt]# mkdir /srv/salt/_modules

[root@server1 salt]# ls

install.sls  _modules

编写模块文件:

[root@server1 salt]# cd _modules/

[root@server1 _modules]# vim mydisk.py

[root@server1 _modules]# cat mydisk.py

def df():

return __salt__['cmd.run']('df -h')

以上文件表示定义了一个名为mydisk的模块,且模块内有一个函数df,函数的作用是运行df -h命令。

同步模块:

[root@server1 _modules]# salt '*' saltutil.sync_modules

server2:

- modules.mydisk

server3:

- modules.mydisk

同步后salt-master会将模块信息发送到指定的salt-minion,salt-minion将信息保存到/var/cache/salt/minion/目录下:  调用模块:

[root@server1 _modules]# salt '*' mydisk.df

server3:

Filesystem             Size  Used Avail Use% Mounted on

/dev/mapper/rhel-root   17G  1.2G   16G   8% /

devtmpfs               484M     0  484M   0% /dev

tmpfs                  496M   80K  496M   1% /dev/shm

tmpfs                  496M  6.7M  489M   2% /run

tmpfs                  496M     0  496M   0% /sys/fs/cgroup

/dev/sda1             1014M  133M  882M  14% /boot

tmpfs                  100M     0  100M   0% /run/user/0

server2:

Filesystem             Size  Used Avail Use% Mounted on

/dev/mapper/rhel-root   17G  1.2G   16G   8% /

devtmpfs               484M     0  484M   0% /dev

tmpfs                  496M  120K  496M   1% /dev/shm

tmpfs                  496M  6.7M  489M   2% /run

tmpfs                  496M     0  496M   0% /sys/fs/cgroup

/dev/sda1             1014M  133M  882M  14% /boot

tmpfs                  100M     0  100M   0% /run/user/0

使用top文件

如果我们想要在不同的节点安装不一样的包,可以用以下这种方式实现:

[root@server1 salt]# vim apache.sls

[root@server1 salt]# cat apache.sls

apache:

pkg.installed:

- pkgs:

- httpd

[root@server1 salt]# vim nfs.sls

[root@server1 salt]# cat nfs.sls

nfs:

pkg.installed:

- pkgs:

- nfs-utils

[root@server1 salt]# ls

apache.sls  _modules  nfs.sls

现在我们要求在server2安装apache文件,在server3安装nfs文件,原来的方法是分两次指定节点执行指定文件,也可以使用top文件的方式:

[root@server1 salt]# vim top.sls

[root@server1 salt]# cat top.sls

base:

'server2':

- apache

'server3':

- nfs

执行top文件:

[root@server1 salt]# salt '*' state.highstate

在日常使用中,我们最好使用子目录来做组织:

[root@server1 salt]# ls

apache.sls  _modules  nfs.sls  top.sls

[root@server1 salt]# mkdir apache

[root@server1 salt]# mkdir nfs

[root@server1 salt]# mv apache.sls apache

[root@server1 salt]# mv nfs.sls nfs

[root@server1 salt]# ls

apache  _modules  nfs  top.sls

这时目录已经发生变化,我们现在需要调用apahce目录下的apache.sls文件时需要使用以下方式:

[root@server1 salt]# salt server2 state.sls apache.apache

同样sls后缀不需要加。

那么此时上面的nfs文件就需要这么写:

[root@server1 salt]# vim top.sls

[root@server1 salt]# cat top.sls

base:

'server2':

- apache.apache

'server3':

- nfs.nfs

[root@server1 salt]# salt '*' state.highstate

使用入口文件init.sls

也可以使用入口文件init.sls:

[root@server1 salt]# cd apache/

[root@server1 apache]# mv install.sls init.sls

当有入口文件时,我们不需要再指定文件,只需指定目录名称即可:

[root@server1 salt]# vim top.sls

[root@server1 salt]# cat top.sls

base:

'server2':

- apache

'server3':

- nfs.nfs

[root@server1 salt]# salt '*' state.highstate

三、使用saltstack安装配置httpd

安装httpd并准备配置文件:

[root@server1 apache]# vim init.sls

[root@server1 apache]# cat init.sls

apache:

pkg.installed:

- pkgs:

- httpd

file.managed:

- name: /etc/httpd/conf/httpd.conf

- source: salt://apache/httpd.conf

其中file.managed中的name表示的是minion端的文件路径,source表示master端的文件路径,salt://表示saltstack的base路径(即/srv/salt/)

之后我们需要准备配置文件httpd.conf:

[root@server1 apache]# scp server3:/etc/httpd/conf/httpd.conf .

[root@server1 apache]# ls

httpd.conf  init.sls

[root@server1 apache]# pwd

/srv/salt/apache

现在可以直接进行推送:

[root@server1 apache]# salt server2 state.sls apache

可以看出先进行的是包的安装,再进行配置文件的更改,由于我们没有更改配置文件,因此状态也没有改变,saltstack通过对比文件的md5值来判断文件是否更改。

[root@server1 apache]# md5sum httpd.conf             #查看文件的md5值

f5e7449c0f17bc856e86011cb5d152ba  httpd.conf

[root@server1 apache]# vim httpd.conf

[root@server1 apache]# cat httpd.conf | grep 8080

更改端口为8080:

Listen 8080

再次查看文件的md5值发现已经改变:

[root@server1 apache]# md5sum httpd.conf

04e9239e7bd5d5b9b85864226d60eee5  httpd.conf

进行推送:

[root@server1 apache]# salt server2 state.sls apache

在server2可以看出文件的md5值和salt-master是同步的:

推送前:

[root@server2 salt]# md5sum /etc/httpd/conf/httpd.conf

f5e7449c0f17bc856e86011cb5d152ba  /etc/httpd/conf/httpd.conf

推送后:

[root@server2 salt]# md5sum /etc/httpd/conf/httpd.conf

04e9239e7bd5d5b9b85864226d60eee5  /etc/httpd/conf/httpd.conf

启动服务:

[root@server1 apache]# vim init.sls

[root@server1 apache]# cat init.sls

apache:

pkg.installed:

- pkgs:

- httpd

file.managed:

- name: /etc/httpd/conf/httpd.conf

- source: salt://apache/httpd.conf

service.running:

- httpd

启动服务使用了service模块中的running函数。

推送:

[root@server1 apache]# salt server2 state.sls apache

在server2查看:

[root@server2 salt]# netstat -antlp

.....

tcp6       0      0 :::8080                 :::*                    LISTEN      14862/httpd

.....

但是此时是8080端口,我们更改为80:

[root@server1 apache]# vim httpd.conf

[root@server1 apache]# cat httpd.conf | grep 80

Listen 80

[root@server1 apache]# salt server2 state.sls apache

推送后可以发现推送成功但是端口并没有更改:

[root@server2 salt]# netstat -antlp

......

tcp6       0      0 :::8080                 :::*                    LISTEN      14862/httpd

......

原因就是我们在更改文件后并没有重启应用,需要进行以下设置:

[root@server1 apache]# vim init.sls

[root@server1 apache]# cat init.sls

apache:

pkg.installed:

- pkgs:

- httpd

file.managed:

- name: /etc/httpd/conf/httpd.conf

- source: salt://apache/httpd.conf

service.running:

- name: httpd

- watch:

- file: apache

watch表示监控唯一性声明apache下的文件(即salt://apache/httpd.conf),当文件有更改时即重启服务。

更改文件后推送:

[root@server1 apache]# vim httpd.conf

[root@server1 apache]# cat httpd.conf | grep 8000

Listen 8000

[root@server1 apache]# salt server2 state.sls apache

从返回状态可以看出服务已经重启,在server2查看:

[root@server2 salt]# netstat -antlp

......

tcp6       0      0 :::8000                 :::*                    LISTEN      14944/httpd

更改成功。

默认的触发方式为restart,我们也可以让它以reload的触发方式:

[root@server1 apache]# vim init.sls

[root@server1 apache]# cat init.sls

apache:

pkg.installed:

- pkgs:

- httpd

file.managed:

- name: /etc/httpd/conf/httpd.conf

- source: salt://apache/httpd.conf

service.running:

- name: httpd

- reload: true

- watch:

- file: apache

即加一个- reload: true

更改并推送:

[root@server1 apache]# vim httpd.conf

[root@server1 apache]# cat httpd.conf | grep 8888

Listen 8888

[root@server1 apache]# salt server2 state.sls apache

也可以加enable: true设置开即自启:

[root@server1 apache]# vim init.sls

[root@server1 apache]# cat init.sls

apache:

pkg.installed:

- pkgs:

- httpd

file.managed:

- name: /etc/httpd/conf/httpd.conf

- source: salt://apache/httpd.conf

service.running:

- name: httpd

- reload: true

- enable: true

- watch:

- file: apache

[root@server1 apache]#

[root@server1 apache]# salt server2 state.sls apache

也可以使用其他的写法:

[root@server1 apache]# vim init.sls

[root@server1 apache]# cat init.sls

apache:

pkg.installed:

- pkgs:

- httpd

service.running:

- name: httpd

- reload: true

- enable: true

- watch:

- file: /etc/httpd/conf/httpd.conf

/etc/httpd/conf/httpd.conf:

file.managed:

- source: salt://apache/httpd.conf

以上的作用与上面的写法是相同的。

[转载] Python:把字符串转换成整数相关推荐

  1. 剑指offer:Python 把字符串转换成整数

    阅读目录 题目描述 思路及Python实现 题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述:输入一个字符串,包括数字 ...

  2. python 字符串转换成整数

    | String to Int 写一个函数 StrToInt,实现把字符串转换成整数这个功能.不能使用 atoi 或者其他类似的库函数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个 ...

  3. leetcode —— 面试题67. 把字符串转换成整数

    写一个函数 StrToInt,实现把字符串转换成整数这个功能.不能使用 atoi 或者其他类似的库函数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找到 ...

  4. 剑指Offer(Java版):把字符串转换成整数

    2019独角兽企业重金招聘Python工程师标准>>> 题目:实现一个函数 stringToInt,实现把字符串转换成整数这个功能,不能使用 atoi 或者其他类似的库函数. 题目解 ...

  5. 程序员面试题精选100题(17)-把字符串转换成整数[算法]

    题目:输入一个表示整数的字符串,把该字符串转换成整数并输出.例如输入字符串"345",则输出整数345. 分析:这道题尽管不是很难,学过C/C++语言一般都能实现基本功能,但不同程 ...

  6. 【Java】 剑指offer(67) 把字符串转换成整数

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请你写一个函数StrToInt,实现把字符串转换成整数这个功能 ...

  7. 49.把字符串转换成整数

    题目描述 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一 ...

  8. 程序员编程艺术第三十 三十一章 字符串转换成整数,通配符字符串匹配

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 第三十~ ...

  9. 字符串转换成整数(3种方法)

    请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止.接下来的转化规则如下: 如果第一个非空字符为正或者负号时,则 ...

  10. 如何把一个字符串转换成整数

    剑指offer第一章的例子,据说是微软的面试题,发现自己又躺枪了.字符串处理有多烦人不用我多说了吧. //基础版代码 int StrToInt(char* string) {int number = ...

最新文章

  1. 项目性能优化(页面静态化2)
  2. Linux 命令 alternatives和update-alternatives
  3. centos安装时各个版本的含义
  4. springboot集成spring security实现登录和注销
  5. 矢量图标库如何引入html,Iconfont矢量图标库在网站中的使用方法
  6. 程序员,你能真正掌握多少编程技术?
  7. springboot 事务统一配置_Spring Boot实现分布式微服务开发实战系列(五)
  8. ChinaJoy是什么
  9. OwinStartupAttribute
  10. 纯干货!如何做一个成功的大数据项目
  11. linux系统 安装qq教程视频,LinuxQQ教程 LumaQQ的安装和使用详细介绍
  12. 一个MOC3061的可控硅触发电路的分析
  13. 关于扫码点餐多人实时共享订单的思考
  14. Java判断手机号格式是否正确
  15. 王峰五小时对话冯波:如果今天没有区块链,你会做什么?
  16. WIN7下默认网关丢失该如何解决
  17. 《构建执法》要点总结
  18. https://www.toutiao.com/a6457425756212429325/?tt_from=mobile_qqutm_campaign=client_shareapp=news_a
  19. 咖说丨2020上半年DeFi行业研究报告
  20. 计算机键盘银音乐,从键盘到键盘 ——一名音乐生到计算机老师的华丽转型

热门文章

  1. 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南):签到题A Matrix Equation(高斯消元求线性异或方程组自由元个数)
  2. UVa1587 - Box
  3. 解决fullgc_CMS发生FullGc分析
  4. java反射获取实现类_Java介绍通过反射获取类的信息
  5. Oracle→数字函数、字符函数、时间函数、SYSDATE、TO_CHAR()、TO_DATE()、TO_NUMBER()、NVLNVL2NULLIF、ROW_NUMBER()
  6. 前向声明 智能指针_C++ 指针类中实现 -gt;*
  7. CTF之Web安全训练前篇1
  8. bzoj 4975: 区间翻转(博弈)
  9. HDU 6191 2017广西邀请赛:Query on A Tree(字典树启发式合并)
  10. NYOJ 81:炮兵阵地(状压DP)