Skip to content

Latest commit

 

History

History
312 lines (274 loc) · 12.3 KB

02-5.Agentless-SaltStack-SaltStack的免代理方式.md

File metadata and controls

312 lines (274 loc) · 12.3 KB

02-5.Agentless SaltStack - SaltStack的免代理方式

  1. Salt agentless方式简介
  2. 安装Salt SSH
  3. Agentless方式的连接
  4. Salt agentless远程执行
  5. 通过salt ssh使用salt state

Salt-agentless方式简介

您可以使用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-SSH

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安装教程

为了能快速启动并运行,本教程部分将向您展示如何将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。

Agentless方式的连接

让我们了解下Salt SSH是如何存储连接的详细信息并连接到远程的agentless系统。

ROSTER FILE

默认情况下,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-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 file并连接到agentless系统

我们添加一个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

如果一切都没问题,你将获取一个目标系统返回来的响应消息。

扩展roster file

这在Salt中很常见,roster系统可以扩展。 您目前可以使用以下任何数据源来填充Salt roster:

  • ansible
  • cache
  • cloud
  • clustershell
  • flat (default)
  • range (in development)
  • scan

本文使用的是默认的flat方式。

Salt-agentless远程执行

在将系统添加到roster后,您可以立即运行shell命令、更新软件包并将文件同时分发到所有目标系统。 所有回复都是以一致的可配置格式返回,以便您可以轻松查看远程执行命令是有效和无效。

执行一个shell命令

Salt允许您使用cmd.run跨多个系统远程执行shell命令:

salt-ssh '*' cmd.run 'ls -l /etc'

所有目标系统同时立即执行此命令,然后将输出返回给Salt master。 感受到Salt的力量了吗?

执行一个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-ssh使用salt-state

Salt state状态与Salt SSH完全兼容,可用于快速自动化地系统设置和配置。

在《SaltStack配置管理》章节中包含有关创建Salt state状态的详细说明。 该指南中的所有信息(包括Salt pillar和Salt的文件服务器)均可用于使用Salt SSH应用state状态的管理。

应用states

在我们创建和应用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模式下运行完全兼容,因此您可以轻松地在两种模式之间切换。