前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Saltstack 远程操作(Ⅱ)

Saltstack 远程操作(Ⅱ)

作者头像
老七Linux
发布2018-05-31 10:19:13
7620
发布2018-05-31 10:19:13
举报
文章被收录于专栏:Laoqi's Linux运维专列
一、配置管理目录
master上:
代码语言:javascript
复制
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

代码语言:javascript
复制
base:
  '*':
    - test
    - test_dir

执行并测试:

代码语言:javascript
复制
[[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

再次测试:

代码语言:javascript
复制
//在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上
代码语言:javascript
复制
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目录。

修改入口文件:

代码语言:javascript
复制
[[email protected] salt]# vim top.sls 

base:
  '*':
    - shell_test

测试:

代码语言:javascript
复制
[[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上
代码语言:javascript
复制
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 并执行:

代码语言:javascript
复制
[root@zhdy01 salt]# vim top.sls 
base:
  '*':
    - cron_test

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

minion 客户端检查:

代码语言:javascript
复制
[[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 参数是你在远程同步的时候所产生的,千万不要删除!!!

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

代码语言:javascript
复制
- minute: '*'
- hour: 20
- daymonth: '*'
- month: '*'
- dayweek: '*

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

代码语言:javascript
复制
[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

安装很简单:

代码语言:javascript
复制
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里面的密码去掉。

错误分析:

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

代码语言:javascript
复制
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)?

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

代码语言:javascript
复制
ssh root@192.168.59.138

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

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

这样就表示成功了:

代码语言:javascript
复制
[[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上面使用的公钥是:

代码语言:javascript
复制
[root@zhdy02 minion]#cat /etc/salt/pki/minion/minion_master.pub
五、补充:

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

代码语言:javascript
复制
[[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 拷贝目录

代码语言:javascript
复制
[[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

代码语言:javascript
复制
salt-run manage.up

命令行下执行脚本:

代码语言:javascript
复制
salt '*' cmd.script salt://test/1.sh  

//命令行下执行master上的shell脚本
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016/11/06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、配置管理目录
    • master上:
    • 二、配置管理远程命令
      • master上
      • 三、配置管理计划任务
        • master上
        • 四、salt-ssh
        • 五、补充:
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档