您可以使用Salt以无agent的式在系统上运行Salt命令,而无需安装Salt minion。 对远程系统的唯一要求是支持SSH和Python。 在无代理模式下运行时,Salt做了以下几件事:
- 通过SSH连接到远程系统。
- 将Salt的瘦版本agent部署到临时目录,包括任何必需的文件。
- 运行指定的命令。
- (可选)清理临时目录。
您可以将Salt agentless与master-minion环境结合使用,也可以完全依赖于agentless方式来管理系统。在agentless方式下,salt需要借助于ssh实现对远程主机的管理和配置,相对于salt agent基于ZMQ实现方式而言,处理效率上会低一些。
本入门指南将指导您以agentless模式运行Salt,并包含了一个教程,向您展示如何创建独立的Salt SSH环境。
在使用agentless方式运行程序时,与受管系统进行的所有通信均是通过SSH执行,这使得管理操作的执行速度远远低于标准的Salt with ZeroMQ方式。
Salt使用称为Salt SSH的实用工具连接到无代理的系统。 该实用程序可以安装在管理服务器,开发工作站或笔记本电脑上。 最简单的方法是使用pip进行安装:
pip install salt-ssh
您可以使用任何两个系统来测试Salt SSH。 如果您安装了Vagrant和VirtualBox,则可以使用以下Vagrantfile快速设置出一个演示环境:
# -*- mode: ruby -*-
# vi: set ft=ruby :
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.define :salt do |salt_config|
salt_config.vm.box = "bento/ubuntu-16.04"
salt_config.vm.host_name = 'salt.local'
salt_config.vm.network"private_network", ip: "192.168.70.10"
end
config.vm.define :managed do |managed_config|
managed_config.vm.box = "bento/ubuntu-16.04"
managed_config.vm.host_name = 'managed.local'
managed_config.vm.network"private_network", ip: "192.168.70.11"
endend
这里利用到了在《SaltStack基础知识》章节中部署过的一套vagrant测试环境。
为了能快速启动并运行,本教程部分将向您展示如何将Salt SSH安装到Python虚拟环境中,并从单个目录加载所有Salt配置文件。
这是可以用于在开发系统或笔记本电脑上安装配置,使您可以轻松加载此虚拟环境,以便使用Salt快速管理服务器。
打开一个终端:
- 运行 which pip , 如果没有安装pip,可以参照这个说明安装上。
- 运行 which virtualenv, 如果未安装virtualenv则执行:pip install virtualenv
- 为Salt SSH创建一个目录。 对于本教程,我们将在主目录中创建一个salt-ssh目录。 创建并cd到此目录。
- 运行以下命令创建出一个python虚拟环境并安装Salt SSH:
virtualenv venv
source venv/bin/activate
pip install salt-ssh
该目录现在就包含一个符合我们测试要求的虚拟环境,您可以在任何时候使用salt-ssh来激活该虚拟环境。 只需打开一个终端,进入到salt-ssh目录并输入source venv/bin/activate。
让我们了解下Salt SSH是如何存储连接的详细信息并连接到远程的agentless系统。
默认情况下,Salt使用YAML文件来存储agentless系统的连接细节,称为roster(字面含义为名册)。
一个基本的roster文件包含一个ID,一个主机和一个用户的信息:
ID:
host: [IP or DNS name]
user: [username]
Roster文件的默认位置是/etc/salt/roster。 如果要将其保存到其他位置,可以使用--roster-file =参数指定不同的路径。 在roster file中还有很多其他选项,请参阅该链接以获取更多详细信息。
salt-ssh命令用于连接到无代理的系统。 该命令与salt命令非常相似:
salt-ssh [target] [command] [arguments]
主要区别在于必须在roster文件中预先定义好目标匹配中指定的任何系统,并且只能使用通配符或正则表达式去匹配目标。
第一次连接到系统时,Salt SSH会返回带有密钥指纹的消息。 您可以检查此密钥指纹,然后使用-i选项连接以接受密钥。
salt-ssh -i '*' test.ping
Permission denied for host managed, do you want to deploy the salt-ssh key? (password required):
[Y/n] y
Password for vagrant@managed:
managed:
True
Salt SSH会生成一个本地SSH RSA密钥用于身份验证。 第一次部署密钥时需要验证用户密码,然后后续的连接就无需提供用户密码即可工作:
salt-ssh '*' disk.usage
managed:
----------
/:
----------
1K-blocks:
41251136
available:
38318832
capacity:
4%
filesystem:
/dev/sda1
used:
1196392
/dev:
----------
1K-blocks:
245916
available:
245904
capacity:
1%
filesystem:
udev
used:
12...
我们添加一个roster文件,然后运行一个测试命令。 确保你在之前创建的Salt SSH目录(〜/salt-ssh),并且你已经激活了虚拟环境(source venv/bin/activate)。
1)创建一个salt-ssh/roster文本文件并保存每个无代理系统的连接详细信息:
managed:
host: 192.168.70.11
user: vagrant
您可以使用此格式将任意数量的系统添加到此文件中。 上面的例子是基于上一节中的vagrant演示系统,但您可以轻松地替换为您自己的环境中的值。
2)创建一个salt-ssh/Saltfile的文本文件并添加连接选项
salt-ssh:
roster_file: /home/vagrant/salt-ssh/roster # replace 'vagrant' with your username if needed
config_dir: /home/vagrant/salt-ssh
log_file: /home/vagrant/salt-ssh/log.txt
Saltfile允许您指定每次运行命令时要包含的命令行选项。
3)运行下面命令来对连接进行测试
salt-ssh -i '*' test.ping
如果一切都没问题,你将获取一个目标系统返回来的响应消息。
这在Salt中很常见,roster系统可以扩展。 您目前可以使用以下任何数据源来填充Salt roster:
- ansible
- cache
- cloud
- clustershell
- flat (default)
- range (in development)
- scan
本文使用的是默认的flat方式。
在将系统添加到roster后,您可以立即运行shell命令、更新软件包并将文件同时分发到所有目标系统。 所有回复都是以一致的可配置格式返回,以便您可以轻松查看远程执行命令是有效和无效。
Salt允许您使用cmd.run跨多个系统远程执行shell命令:
salt-ssh '*' cmd.run 'ls -l /etc'
所有目标系统同时立即执行此命令,然后将输出返回给Salt master。 感受到Salt的力量了吗?
尽管使用cmd.run执行shell命令确实很有用,但使用到Salt Execution功能函数时真正强大的功能才会来临。 Salt社区已经付出了巨大的努力来创建数百个功能模块,以简化大多数管理任务。 更好的是,可以在所有支持的平台上一致地使用相同的功能。
查看磁盘使用情况:
salt-ssh '*' disk.usage
安装一个软件包:
salt-ssh '*' pkg.install cowsay
查看网卡接口:
salt-ssh '*' network.interfaces
以上只是大量可利用的功能模块中少数的几个例子。
您可以在演示环境中执行本节中的所有远程执行命令。 这些示例使用通配符来匹配roster中的所有系统,但您可以使用您在roster文件中分配的ID替换它:
salt-ssh 'managed' network.interfaces
您还可以传递逗号分隔的系统列表:
salt-ssh 'server1,server2,server3' network.interfaces
Salt state状态与Salt SSH完全兼容,可用于快速自动化地系统设置和配置。
在《SaltStack配置管理》章节中包含有关创建Salt state状态的详细说明。 该指南中的所有信息(包括Salt pillar和Salt的文件服务器)均可用于使用Salt SSH应用state状态的管理。
在我们创建和应用states状态之前,让我们对我们的Salt SSH环境做一些补充配置,将状态系统的文件存放位置配置为指向我们的salt-ssh目录中的目录(默认情况下状态文件存储在/srv/salt)。
确保你在之前创建的Salt SSH目录(〜/salt-ssh),并且你已经激活了虚拟环境(source venv/bin/activate)。
1)使用以下内容创建一个salt-ssh/master文件:
file_roots:
base:
- /home/vagrant/salt-ssh/states # you might need to replace 'vagrant' in your environment
2)创建一个名为states的目录,然后添加以下内容并将其保存为states/network.sls:
install network packages:
pkg.installed:
- pkgs:
- rsync
- lftp
- curl
3)由于我们正在安装软件包,我们需要在应用此状态之前启用提升的特权。 打开roster文件并添加sudo:True
managed:
host: 192.168.70.11
user: vagrant
sudo: True
4)使用以下命令应用状态:
salt-ssh '*' state.apply network
(请注意,我们之前将config_dir路径添加到了我们的Saltfile,这就是salt-ssh找到salt-ssh/master文件的原因。)
Salt SSH也可以管理文件! Salt SSH解析所有salt://文件引用并自动将文件发送到agentless系统中去。
1)在salt-ssh/states目录中,创建一个名为files的子目录。
2)使用以下命令添加一个名为salt-ssh/states/files/sample.conf文件:
setting=value
setting2=value2
3)使用以下命令添加并保存名为salt-ssh/states/config.sls的新状态文件:
manage some app config file:
file.managed:
- name: /tmp/sample.conf
- source:salt://files/sample.conf
4)执行下面命令来应用这个状态文件
salt-ssh '*' state.apply config
每次应用此状态时,无代理系统上的配置文件都会得到更新以匹配salt-ssh/states/files中的版本。
您可以使用远程执行列出配置文件的内容:
salt-ssh '*' cmd.run 'cat /tmp/sample.conf'
通过将salt-ssh/master的内容更改为以下内容,Salt可以轻松配置Salt来访问GitHub仓库,而不是将状态文件放置在salt-ssh/states目录中:
fileserver_backend:
- git
gitfs_remotes:
- /~https://github.com/yourusername/yourrepo.git
可以查看 Git Fileserver Backend以了解更多详细信息。
以下是可添加到状态文件以配置系统的其他命令的几个示例
Clone from Github
Clone the SaltStack bootstrap script repo:
pkg.installed:
- name: git # make sure git is installed first!
git.latest:
- name:/~https://github.com/saltstack/salt-bootstrap
- rev: develop
- target: /tmp/salt
Service Running
Make sure the mysql service is running:
service.running:
- name: mysql
Create Users
user account for pete:
user.present:
- name: pete
- shell: /bin/bash
- home: /home/pete
- groups:
- sudo
本指南向您展示了使用Salt SSH开始管理服务器是多么简单。
在Salt SSH中使用的所有状态文件和命令都与Salt在master/minion模式下运行完全兼容,因此您可以轻松地在两种模式之间切换。