前言
saltstack 对比 ansible
最大的不同就是saltstack使用的是c/s架构,即要安装minion才能访问客户端,而ansible则是使用ssh协议访问.不得不说,有一部分人就是因为觉得saltstack需要安装客户端,感觉很麻烦而选用了ansible.那么下面来说说salt如何通过salt-ssh来安装minion
salt-ssh
salt-ssh 并没有包含在salt-master中,所以需要单独安装
yum install salt-ssh
前提条件
salt-ssh 使用的前提条件就是roster,只有配置了roster文件后才能使用salt-ssh对机器进行操作
下面来看一个roster文件的配置
test1:
host: 192.168.1.101
user: salt
passwd: redhat
minion_opts:
- id: test1
第1行test1: 表示该机器被salt-ssh识别到的id
第2-4行host: 指定机器的IP地址,用户,密码,用于ssh连接
第5行minion_opts: 表示执行命令时传递的参数
如果客户端IP没有在master的known_hosts文件中,需要先添加上去
测试连接是否成功
salt-ssh -i 'test1' test.ping
编写安装minion的sls
既然已经连接上客户端,那么只需要在客户端上装上minion并启动就好了
#同步yum的repo
minion_yum:
file.recurse:
- name: /etc/yum.repos.d
- source: salt://minions/yum.repos.d ##提前准备的yum文件路径
- user: root
- group: root
- file_mode: 644
- dir_mode: 755
- include_empty: True
- unless: test -e /etc/yum.repos.d/epel_aliyun.repo
#安装minion
minion_install:
pkg.installed:
- pkgs:
- salt-minion
- skip_verify: True
- require:
- file: minion_yum
- unless: rpm -qa | grep salt-minion
#同步minion的配置文件
minion_conf:
file.managed:
- name: /etc/salt/minion
- source: salt://minions/minion.conf ##minion端需要配置的minion主配置文件
- user: root
- group: root
- mode: 640
- template: jinja
- defaults:
minion_id: {{ grains['id'] }}
- require:
- pkg: minion_install
#启动minion
minion_service:
service.running:
- name: salt-minion
- enable: True
- require:
- file: minion_conf
文件需要自行准备,并放到salt root目录下
minion的主要配置,其他可以自行修改
id: {{ minion_id }}
master: 192.168.1.100
执行完sls后,就可以到master上通过salt-key 直接添加minion进行管理
扩展
- 通过kickstart批量安装centos
- 通过Python脚本批量修改服务器IP
- master批量插入主机信息到roster
- salt-ssh 安装minion 进行管理
kickstart批量安装centos
批量插入主机信息到roster
为了更加方便,所以配置kickstart时,网络可以选择是dhcp模式,这样安装完系统之后就可以上网
master端
import json
from http.server import BaseHTTPRequestHandler, HTTPServer
template = '''
{id}:
host: {ip}
user: root
passwd: password
minion_opts:
- id: {id}
'''
class RequestHandler(BaseHTTPRequestHandler):
def do_POST(self):
response = self.rfile.read(int(self.headers['content-length']))
self.send_response(200)
self.send_header('Content-Type', 'application/json')
self.end_headers()
self.data_parse(response)
self.do_insert(self.data)
result = ('data: %s, send OK\n' % response).encode('ascii')
self.wfile.write(result)
def do_insert(self, data):
with open(r'/etc/salt/roster', 'a') as f:
f.write(data + '\n')
def data_parse(self, data):
print(data)
data = json.loads(data.decode('utf-8'))
print(data)
self.data = template.format(id=data['id'], ip=data['ip'])
print(self.data)
return self.data
def main():
server_address = ('', 8099)
httpd = HTTPServer(server_address, RequestHandler)
httpd.serve_forever()
if __name__ == '__main__':
main()
minion端
ip=`ifconfig | grep 'inet' |grep -v '127.0.0.1'|grep -v inet6 | sed 's/^[ \t]*//g'|cut -d" " -f2`
hostname=`hostname`
data={"id":"$hostname", "ip":$ip}
curl -X POST -d '{"id":"'$hostname'", "ip":"'$ip'"}' "http://127.0.0.1:8099"