Saltstack 远程操作(Ⅱ)

一、配置管理目录

master上:
vi /srv/salt/test_dir.sls  //加入如下内容

file_dir:
  file.recurse:
    - name: /tmp/testdir        //对方机器目录
    - source: salt://test/123   //本地模板目录
    - user: root
    - file_mode: 640
    - dir_mode: 750
    - mkdir: True       //是否自动创建目录
    - clean: True

//加上clean它之后,源删除文件或目录,目标也会跟着删除,否则不会删除。

然后我们需要再次配置一下入口top.sls

base:
  '*':
    - test
    - test_dir

执行并测试:

[[email protected] salt]# salt 'zhdy02' state.highstate

//在zhdy02机器上面检查:
[[email protected] ~]# ls /tmp/testdir/
1.txt

//自动的在客户端创建了testdir 这个目录。

权限:
[[email protected] ~]# ls -ld /tmp/testdir/
drwxr-x--- 2 root root 19 11月  6 14:35 /tmp/testdir/
[[email protected] ~]# ls -ll /tmp/testdir/1.txt 
-rw-r----- 1 root root 511 11月  6 14:35 /tmp/testdir/1.txt

再次测试:

//在test目录下创建一个目录aaa 和一个文件1212.txt 顺便删除123目录
[[email protected] test]# mkdir aaa
[[email protected] test]# touch 1212.txt
[[email protected] test]# rm -rf 123
[[email protected] test]# ls
1212.txt  aaa

//修改top.sls
[[email protected] salt]# cat top.sls 
base:
  '*':
    - test_dir

//再次同步:
[[email protected] salt]# salt 'zhdy02' state.highstate

//检查zhdy02
[[email protected] ~]# ls -ll /tmp/testdir/
总用量 0
-rw-r----- 1 root root 0 11月  6 15:22 1212.txt

//我们发现只有一个文件, 为什么呢?saltstack有这样一个规则,空目录是不会传输过去的,如果空目录有文件就可以传输:

[[email protected] test]# ls
1212.txt  aaa
[[email protected] test]# touch aaa/asd.txt

//zhdy02再次检查:
[[email protected] ~]# ls -l /tmp/testdir/
总用量 0
-rw-r----- 1 root root  0 11月  6 15:22 1212.txt
drwxr-x--- 2 root root 21 11月  6 15:26 aaa

二、配置管理远程命令

其实远程命令模式咱们可以使用cmd.run但是批量要是执行很多个命令就不好运行了,就需要我们使用配置文件去执行!

在本地机器上面指定一个shell脚本,这个脚本就是我需要在各个minions上面去执行的脚本。

master上
vi /srv/salt/shell_test.sls  //加入如下内容
 shell_test:
  cmd.script:
    - source: salt://test/1.sh
    - user: root
    
vi /srv/salt/test/1.sh //加入如下内容
#!/bin/bash
touch /tmp/111.txt 
if [ ! -d /tmp/1233 ]
then
    mkdir /tmp/1233
fi

//脚本内容很简单。创建一个111.txt文件 如果没有1233目录就创建一个1233目录。

修改入口文件:

[[email protected] salt]# vim top.sls 

base:
  '*':
    - shell_test

测试:

[[email protected] salt]# salt 'zhdy02' state.highstate

//客户端检查:
[[email protected] ~]# ls -lt /tmp/
总用量 4
drwxr-xr-x 2 root root   6 11月  6 15:44 1233
-rw-r--r-- 1 root root   0 11月  6 15:44 111.txt

//显然是成功的。

三、配置管理计划任务

master上
vi /srv/salt/cron_test.sls  //加入如下内容
cron_test:
  cron.present:
    - name: /bin/touch /tmp/111.txt
    - user: root
    - minute: '*'
    - hour: 20
    - daymonth: '*'
    - month: '*'
    - dayweek: '*
    
注意,* 需要用单引号引起来。当然我们还可以使用file.managed模块来管理cron,因为系统的cron都是以配置文件的形式存在的。想要删除该cron,需要增加:
cron.absent:
  - name: /bin/touch /tmp/111.txt

两者不能共存,要想删除一个cron,那之前的present就得去掉。

更改top.sls 并执行:

[root@zhdy01 salt]# vim top.sls 
base:
  '*':
    - cron_test

[root@zhdy01 salt]# salt 'zhdy02' state.highstate

minion 客户端检查:

[[email protected] ~]# crontab -l
# Lines below here are managed by Salt, do not edit
# SALT_CRON_IDENTIFIER:/bin/touch /tmp/111.txt
* 20 * * * /bin/touch /tmp/111.txt

//如上两条默认的crontab 参数是你在远程同步的时候所产生的,千万不要删除!!!

如上要是修改为其它时间段,只需要修改如下参数即可:

- minute: '*'
- hour: 20
- daymonth: '*'
- month: '*'
- dayweek: '*

如何删除一个crontab的内容呢? 编辑 cron_test.sls

[root@zhdy01 salt]# vim /srv/salt/cron_test.sls

cron_test:
  cron.absent:
    - name: /bin/touch /tmp/111.txt

[root@zhdy01 salt]# salt 'zhdy02' state.highstate

//检查测试:
[root@zhdy02 ~]# crontab -l
# Lines below here are managed by Salt, do not edit

四、salt-ssh

salt-ssh不需要对客户端做认证,客户端也不用安装salt-minion,它类似pssh/expect

安装很简单:

yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm

yum install -y salt-ssh

vi /etc/salt/roster //增加如下内容
zhdy01:
  host: 192.168.59.131
  user: root
  passwd: XXXXX
zhdy02:
  host: 192.168.59.138
  user: root
  passwd: XXXXX
  
salt-ssh --key-deploy '*' -r 'w' //--key-deploy:第一次执行的时候会自动把本机的公钥放到对方机器上,然后就可以把roster里面的密码去掉。

错误分析:

如果我们在连接的时候显示如下:

zhdy01:
    ----------
    retcode:
        254
    stderr:
    stdout:
        The host key needs to be accepted, to auto accept run salt-ssh with the -i flag:
        The authenticity of host '192.168.59.131 (192.168.59.131)' can't be established.
        ECDSA key fingerprint is SHA256:KKPvbPG47SDYH6QXpC4+RjUbiMTVX0sNF5F2nTTQ1lg.
        ECDSA key fingerprint is MD5:e3:aa:2e:e3:2f:21:b5:06:26:08:0e:d5:57:2d:62:77.
        Are you sure you want to continue connecting (yes/no)?

这就证明我们没有远程连接过这个机器,这是第一次,解决方法:手动连接此机器:

ssh root@192.168.59.138

//输入yes, 再次输入密码即可运行如上远程ssh。

当然,如果机器比较多肯定不好每台都这样操作,我们可以使用之前所学的去解决这个问题!

这样就表示成功了:

[[email protected] ~]# salt-ssh --key-deploy '*' -r 'w'
zhdy02:
    ----------
    retcode:
        0
    stderr:
    stdout:
        [email protected]'s password: 
         17:52:34 up  3:29,  2 users,  load average: 0.00, 0.01, 0.05
        USER     TTY      FROM             [email protected]   IDLE   JCPU   PCPU WHAT
        root     pts/0    192.168.59.1     14:24   45:38   0.05s  0.05s -bash
        root     pts/1    zhdy01           17:47    2.00s  0.05s  0.05s ssh [email protected]
zhdy01:
    ----------
    retcode:
        0
    stderr:
    stdout:
        [email protected]'s password: 
         17:52:34 up 3 days,  5:46,  2 users,  load average: 0.32, 0.40, 0.44
        USER     TTY      FROM             [email protected]   IDLE   JCPU   PCPU WHAT
        root     pts/0    192.168.59.1     08:41    2.00s  0.62s  0.38s -bash
        root     pts/1    zhdy02           17:47    2.00s  0.57s  0.02s /usr/bin/python /usr/bin/salt-ssh --key-deploy * -r w

也许你会对如上的密钥好奇,当我完成如上操作按理来说应该可以直接ssh了,但是还是不可以。其原因是minion上面使用的公钥是:

[root@zhdy02 minion]#cat /etc/salt/pki/minion/minion_master.pub

五、补充:

cp.get_file 拷贝master上的文件到客户端

[[email protected] test]# salt '*' cp.get_file salt://test/1.txt  /tmp/123.txt
zhdy02:
    /tmp/123.txt
zhdy01:
    /tmp/123.txt


//salt '*' cp.get_file master上的文件位置  minions的位置

cp.get_dir 拷贝目录

[[email protected] test]# salt '*' cp.get_dir salt://test/123 /tmp/
zhdy02:
    - /tmp//123/1.sh
    - /tmp//123/1.txt
zhdy01:
    - /tmp//123/1.sh
    - /tmp//123/1.txt

//会自动在客户端创建123目录,所以后面不要加123,如果写成 /tmp/123/  则会在/tmp/123/目录下又创建123

显示存活的minion

salt-run manage.up

命令行下执行脚本:

salt '*' cmd.script salt://test/1.sh  

//命令行下执行master上的shell脚本

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏崔庆才的专栏

一言不合就改成 777 权限?会出人命的!

最近和几个朋友开发项目,期间使用了一台服务器跑模型,这台服务器是多人公用的,很多人都在上面有自己的账号,互不干涉内政,一切看起来十分井然有序。

4063
来自专栏云计算教程系列

如何在CentOS 7上使用Nginx设置基本HTTP身份验证

Nginx是主动使用的领先Web服务器之一。它及其商业版Nginx Plus由Nginx,Inc。开发。

1510
来自专栏菩提树下的杨过

redis 学习笔记(6)-cluster集群搭建

上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,...

2005
来自专栏GreenLeaves

Oracle Profile文件

一、Profile文件概述:Profiles是Oracle安全策略的一个组成部分,当Oracle建立数据库时,会自动建立名称为Default的profile,当...

2486
来自专栏Java技术分享

Jrebel6.3.3破解,配置图文教程

Jrebel6.3.3破解,配置图文教程 JRebel是个很好的开发工具,我在网上找了好久都没有找到很详细的教程,破解与配置教程千篇一律,步骤不详细。编写这篇教...

2269
来自专栏Debian社区

Debian 9 安装配置 Caddy Server

Caddy 是一个用 Golang 开发的高效 Web Server,相比 Nginx,它的配置和使用要简单很多,能自动开启 HTTPS、并且支持 HTTP/2...

3852
来自专栏菩提树下的杨过

redis 学习笔记(6)-cluster集群搭建

上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,...

2165
来自专栏大魏分享(微信公众号:david-share)

对,俺差的是安全! | 从开发角度看应用架构18

在Gartner定义的“第三平台”盛行的年代,html5大行其道。所以http方式访问的应用很多。因此,谈到应用的安全,我们先要了解http的几种认证方式。

851
来自专栏Gaussic

使用IntelliJ IDEA开发SpringMVC网站(一)开发环境 顶

访问GitHub下载最新源码:https://github.com/gaussic/SpringMVCDemo

1511
来自专栏云计算教程系列

如何在Debian 9上安装MariaDB

MariaDB是一个开源数据库管理系统,通常作为流行的LAMP(Linux,Apache,MySQL,PHP / Python / Perl)堆栈的一部分代替M...

4803

扫码关注云+社区