1.远程执行
第一条命令: [root@linux-node1 master]# salt '*' test.ping linux-node2.example.com: True linux-node1.example.com: True 说明: salt:命令 *:匹配目标,使用通配符 test.ping:模块.方法 #此处的ping并非ICMP的ping命令,而是master向minion发送了一个包,minion收到了,返回一个True [root@linux-node1 ~]# salt '*' cmd.run 'uptime' linux-node1.example.com: 11:51:47 up 21 days, 5:57, 2 users, load average: 0.04, 0.03, 0.05 linux-node2.example.com: 11:51:47 up 12 days, 6:26, 2 users, load average: 0.00, 0.03, 0.05 [root@linux-node1 ~]# salt '*' cmd.run 'w' linux-node1.example.com: 11:52:11 up 21 days, 5:58, 2 users, load average: 0.03, 0.02, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/2 192.168.56.1 06Jan18 6:51 3.27s 3.27s -bash root pts/3 192.168.56.1 06Jan18 3.00s 6:17 0.46s /usr/bin/python /usr/bin/salt * cmd.run w linux-node2.example.com: 11:52:11 up 12 days, 6:26, 2 users, load average: 0.00, 0.03, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/1 192.168.56.1 Mon10 21:59m 0.28s 0.28s -bash root pts/3 192.168.56.1 06Jan18 6:59 4.82s 0.02s -bash [root@linux-node1 ~]# salt '*' cmd.run 'df -h' linux-node2.example.com: Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 18G 17G 1.1G 95% / devtmpfs 905M 0 905M 0% /dev tmpfs 916M 12K 916M 1% /dev/shm tmpfs 916M 41M 876M 5% /run tmpfs 916M 0 916M 0% /sys/fs/cgroup /dev/sda1 497M 171M 326M 35% /boot tmpfs 184M 0 184M 0% /run/user/0 /dev/loop0 4.1G 4.1G 0 100% /mnt linux-node1.example.com: Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 18G 11G 7.2G 60% / devtmpfs 905M 0 905M 0% /dev tmpfs 916M 28K 916M 1% /dev/shm tmpfs 916M 57M 860M 7% /run tmpfs 916M 0 916M 0% /sys/fs/cgroup /dev/sda1 497M 171M 326M 35% /boot tmpfs 184M 0 184M 0% /run/user/0 [root@linux-node1 ~]# netstat -tulnp|grep minion minion不需要监听端口,说明minion需要主动去链接master,master监听端口为4505、4506 [root@linux-node1 ~]# netstat -tulnp|grep python tcp 0 0 0.0.0.0:4505 0.0.0.0:* LISTEN 37039/python tcp 0 0 0.0.0.0:4506 0.0.0.0:* LISTEN 37045/python #master和minion默认使用一个叫zeroMQ进行并行通信,zeroMQ属于底层(传输层)的消息队列, #相当于一个发布与订阅系统,比如你订了一个教室听课,那么所有订了此间课室的人都能听到老师的课程。 [root@linux-node1 ~]# lsof -ni:4505 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME salt-mast 37039 root 16u IPv4 3394584 0t0 TCP *:4505 (LISTEN) salt-mast 37039 root 18u IPv4 3412804 0t0 TCP 192.168.56.11:4505->192.168.56.12:43126 (ESTABLISHED) salt-mast 37039 root 19u IPv4 3412811 0t0 TCP 192.168.56.11:4505->192.168.56.11:38262 (ESTABLISHED) salt-mini 39623 root 27u IPv4 3412810 0t0 TCP 192.168.56.11:38262->192.168.56.11:4505 (ESTABLISHED)
查看4505端口,我们可以发现salt-minion使用一个随机端口通过4505端口与salt-master通信,master使用4505端口发送指定到salt-minion上进行执行。而4606端口是用于接收数据的返回,用于zeroMQ的请求与响应的系统。
可以通过date命令查看salt的并行通信,可以看到是同时返回 [root@linux-node1 ~]# salt '*' cmd.run 'date' linux-node2.example.com: Tue Jan 16 12:01:52 CST 2018 linux-node1.example.com: Tue Jan 16 12:01:52 CST 2018
2.配置管理
(1)saltstack是使用YAML的格式作为管理文件的格式,下面的YAML的样例:
YAML样例: house: family: name: Doe parents: - John - Jane children: - Paul - Mark - Simone address: number: 34 street: Main Street city: Nowheretown zipcode: 12345
(2)YAML的规则:
①缩进表示层级关系,默认缩进是2个空格、4个空格、6个空格
②冒号后面有个空格,以冒号结尾可以有空格,可以无空格
③短横线代表一个列表,短横线后面有个空格
(3)定义yaml文件放的位置:salt内置一个fileserver,在master文件配置:file_roots
[root@linux-node1 ~]# vim /etc/salt/master #定义yaml文件放的位置,base环境是必备的 file_roots: base: - /srv/salt/base dev: - /srv/salt/dev test: - /srv/salt/test prod: - /srv/salt/prod [root@linux-node1 ~]# mkdir -p /srv/salt/{base,dev,test,prod} [root@linux-node1 ~]# systemctl restart salt-master [root@linux-node1 ~]# cd /srv/salt/base/ [root@linux-node1 base]# mkdir web [root@linux-node1 web]# vim apache.sls #编写安装apache的YAML文件 apache-install: pkg.installed:---------->模块pkg,方法installed,会匹配操作系统进行选择安装的方法 - name: httpd--------->装的包的名称 apache-service:----------->id要唯一 service.running:-------->状态模块service,running为模块的方法 - name: httpd--------->管理服务的名称 - enable: True-------->设置开机自动启动 [root@linux-node1 ~]# salt 'linux-node2.example.com' state.sls web.apache #如果apache.sls的位置是在prod目录下,需要在后面增加saltenv=prod #salt 'linux-node2.example.com' state.sls web.apache saltenv=prod 实现自动化安装,需要写一个top.sls top.sls是state系统的入口文件,它在大规模配置管理工作中负责制定哪些设备调用哪些states.sls文件。top.sls入口文件不是必须的,如果只需要简单地对某台机器进行配置管理工作,我们可以直接使用state.sls命令来指定states.sls文件即可。 [root@linux-node1 base]# pwd /srv/salt/base [root@linux-node1 base]# vim top.sls #必须在base环境下写 base: 'linux-node1.example.com': - web.apache 'linux-node2.example.com': - web.apache **************************** 如果只有一个任务在全部机子上执行,也可以: base: '*' - web.apache **************************** [root@linux-node1 ~]# salt '*' state.highstate #去top.sls读取,*代表通知哪些主机 [root@linux-node1 ~]# salt '*' state.highstate test=True #在不想影响当前主机的运行情况,可以使用test=True 进行预测试