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上面去执行的脚本。
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
//显然是成功的。
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-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脚本