New in version 2015.8.4.
注:本教程假定你已经掌握了Salt的基本知识。 为了加快学习速度,可以查看Salt Walkthrough。
本教程还假设你对Salt Proxy Minions有基本的了解。 如果你还不熟悉Salt的Proxy Minion系统,请阅读Salt Proxy Minion文档和Salt Proxy Minion端到端示例教程。
本教程的第三个假设是你对ESXi主机使用有基本的了解。 这可以在VMware’s various resources上了解有关ESXi主机的更多信息。
相同的资料也可以查看github上的文章 ESXi Proxy Minion
Salt的ESXi Proxy Minion允许将VMware ESXi主机视为单独的Salt Minion,而无需在ESXi主机上安装Salt Minion。
由于ESXi主机不能在提供有Python支持的操作系统上运行,因此ESXi主机无法直接运行常规的Salt Minion。 因此,Salt的Proxy Minion功能使得可以指定另一台计算机来托管从Salt Master到ESXi主机通过“代理”进行通信的代理进程。 Master不知道或不关心ESXi目标主机是不是 “真正的” Salt Minion。
可以在Salt的文档的Proxy Minion部分找到有关Proxy Minions的更深入的概念性说明。
Salt的ESXi Proxy Minion是在Salt的2015.8.4版本中添加进来的。
注:请注意,ESXi Proxy Minion的某些功能可能取决于ESXi主机所连接的许可证类型。
例如,某些服务仅可用于使用VMware vSphere Enterprise或Enterprise Plus许可证时管理服务状态或策略,而其他服务可用于标准许可证授权。例如,
ntpd
服务仅限于Enterprise Plus许可证,而ssh
可通过标准许可证获得。有关更多信息,请参见vSphere Comparison。
通过Proxy Minion操作ESXi主机要求运行Proxy Minion进程的计算机具有ESXCLI程序包(及其所有依赖项)和pyVmomi Python库 。
ESXi Proxy Minion通过VMware的API在主机上执行任务,就像它是常规Salt Minion一样。 要访问已在ESXi主机上运行的API,ESXi主机必须具有用于登录主机的用户名和密码。 用户名通常是root。 在Salt可以通过VMware的API访问ESXi主机之前,必须在主机上设置默认密码。
必须在运行代理进程的计算机上安装pyVmomi Python库。 pyVmomi可以通过pip安装:
pip install pyVmomi
注:pyVmomi 6.0版在某些Python版本上有一些SSL错误处理的问题。 如果使用版本6.0的pyVmomi,则运行代理minion进程的计算机必须具有Python 2.6,Python 2.7.9或更高版本。 这是由于pyVmomi 6.0中的上游依赖性在Python 2.7到2.7.8中不受支持。 如果运行代理进程的Python版本不在支持的范围内,则需要安装早期版本的pyVmomi。 有关更多信息,请参见问题#29537。
根据上面的注释,要安装比PyPi中当前列出的版本更早版本的pyVmomi,请运行以下命令:
pip install pyVmomi==5.5.0.2014.1.1
5.5.0.2014.1.1是一个已知的稳定版本,ESXi Proxy Minion就是基于这个版本上所开发的。
目前,用于ESXi Proxy Minion的大约三分之一的功能要求在运行Proxy Minion进程的计算机上安装ESXCLI程序包。
ESXCLI程序包也称为VMware vSphere CLI或vCLI。 VMware提供适用于vSphere 5.5和vSphere 6.0的vCLI程序包安装说明。
完成所有必需的依赖项并安装vCLI软件包后,可以通过运行以下命令来检查是否可以连接到ESXi主机:
esxcli -s <host-location> -u <username> -p <password> system syslog config get
如果连接成功,则表明已经在系统上成功安装了ESXCLI。 你应该看到与ESXi主机的syslog配置相关的输出。
有几个地方需要设置各种配置值才能使ESXi Proxy Minion正常运行和连接。
在运行Proxy Minon进程的计算机上,必须准备好一个代理配置文件。 此文件应位于/etc/salt/
目录中,并命名为proxy
。 如果默认情况下该文件不存在,请创建它。
此文件中应包含Salt Proxy将连接到的Salt Master的位置。
示例的Proxy代理配置文件:
# /etc/salt/proxy
master: -master-location>
Proxy minions从Salt’s Pillar获得配置。 每个proxy代理必须在Pillar中有一段配置,并且在Pillar top-file文件中有一个与Proxy ID匹配的引用。 与ESXi主机进行通信时,pillar至少需要包含如下信息:
proxy:
proxytype: esxi
host: >
username: >
passwords:
- first_password
- second_password
- third_password
其他一些可选设置是协议和端口。 这些也可以添加到pillar配置中。
proxytype
键和值对是很关键的,因为它告诉Salt从Salt的部署结构中的代理目录加载哪个接口,或者从Salt Master上的/srv/salt/_proxy
加载(例如,如果你需要创建并使用自己的代理模块)。 要使用ESXi Proxy代理模块,请将参数值设置为esxi
。
ESXi主机的位置,ip地址dns域名。 必需。
用于登录ESXi主机的用户名,例如root。 必需。
用于尝试登录ESXi主机的密码列表。 此列表中至少需要一个密码。
Proxy代理集成将按顺序尝试列出的每个密码。你可以通过vsphere.update_host_password
执行模块函数或通过esxi.password_present
状态函数为ESXi主机更新密码。这样,在更改密码后,也不需要重新启动proxy minion - 它会选择列表中提供的新密码。然后,你还可以随意更改pillar配置,将新密码移到前面位置,然后淘汰不再使用的密码。
使用密码列表的场景分析:此时你是第一次设置ESXi主机,主机带有默认密码。你知道在初始化设置期间,将把默认密码更改为新密码。如果你只有一个密码选项可用,并且你更改了密码,则在Pillar和Proxy Minion中更新密码以及重新启动进程之前,在密码更改后运行的任何远程执行命令或状态都将无法在主机上运行。
这允许你使用任意数量的潜在后备密码。
注:当主机上的密码更改为可能密码列表中的密码时,密码所在的列表越靠后,单个命令返回的时间就越长。 这是由于pyVmomi登录系统的性质。 在尝试列表中的下一个密码之前,我们必须等待第一次尝试失败。
当代理minion首次启动时,这种情况尤其如此,甚至更慢。 如果正确的密码不是列表中的第一个密码,test.version可能需要一分钟才能响应安装了salt的版本(例如:2018.3.4。初始授权完成后,命令的响应将是 快一点
为了避免这些较长的等待时间,SaltStack建议将正确的密码移到列表顶部,并尽早重新启动代理小工具。
如果ESXi主机未使用默认协议,请将此值设置为备用协议。 默认值为https。
如果ESXi主机未使用默认端口,请将此值设置为备用端口。 默认值为443。
在启动Proxy Minion进程之前需要使用的基本配置的示例包括proxy代理配置文件、Pillar Top文件和任何单独的Proxy Minion Pillar文件。
在此示例中,我们假设有两个要连接的ESXi主机。 因此,我们将创建两个Proxy Minion配置文件,每个ESXi主机一个。
Proxy Config File:
# /etc/salt/proxy
master: -master-location>
Pillar Top File:
# /srv/pillar/top.sls
base:
'esxi-1':
- esxi-1
'esxi-2':
- esxi-2
第一个ESXi主机esxi-1的Pillar Config文件:
# /srv/pillar/esxi-1.sls
proxy:
proxytype: esxi
host: esxi-1.example.com
username: 'root'
passwords:
- bad-password-1
- backup-bad-password-1
第二个ESXi主机esxi-2的Pillar Config文件:
# /srv/pillar/esxi-2.sls
proxy:
proxytype: esxi
host: esxi-2.example.com
username: 'root'
passwords:
- bad-password-2
- backup-bad-password-2
一旦所有正确的配置文件准备好了,就可以启动proxy代理进程了!
salt-proxy --proxyid='esxi-1' -l debug
# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
esxi-1
Rejected Keys:
#
# salt-key -a esxi-1
The following keys are going to be accepted:
Unaccepted Keys:
esxi-1
Proceed? [n/Y] y
Key for minion esxi-1 accepted.
salt-proxy --proxyid='esxi-2' -d
# salt-key -L
Accepted Keys:
esxi-1
Denied Keys:
Unaccepted Keys:
esxi-2
Rejected Keys:
#
# salt-key -a esxi-1
The following keys are going to be accepted:
Unaccepted Keys:
esxi-2
Proceed? [n/Y] y
Key for minion esxi-1 accepted.
# salt 'esxi-*' test.version
esxi-1:
True
esxi-2:
True
现在你应该已经配置了Proxy Minions并让它们成功响应了test.version,我们可以通过Salt开始对ESXi主机执行更多的管理命令。
了解这个proxy代理的特定工作原理非常重要,要通过Proxy Minion开始对ESXi主机运行远程执行和状态命令,需要注意几个重要部分:vSphere执行模块,ESXi执行模块 和ESXi状态模块。
Salt.modules.vsphere是一个标准的Salt执行模块,可以完成ESXi Proxy Minion的大部分工作。 如果你浏览它的文档,你会发现模块中的几乎每个函数都需要使用凭证(用户名和密码)和目标主机参数。 如果未传递凭据和主机,则Salt会通过pyVmomi或ESXCLI对本地计算机运行命令。 如果需要,可以在安装了适当版本的pyVmomi和ESXCLI的任何计算机上运行此模块中的功能,该计算机需要通过网络与ESXi主机通信。
你会注意到vSphere模块中的大多数功能函数都需要host, username 和 password 作为参数。 这些参数包含在Pillar文件中,并通过已在运行的proxy代理进程传递给函数。 执行命令时,无需提供这些参数。 有关示例,请参阅下面的“Running Remote Execution Commands”部分。
为了将上面“CONFIGURATION”部分中设置的Pillar信息传递到vSphere Execution Module中的函数调用,salt.modules.esxi
执行模块充当vSphere执行模块功能和proxy代理进程之间的“shim”(转换器)。
“shim” 获取Pillar文件中指定的身份验证凭据,并将其传递给vSphere Execution Module功能所需的host
, username
, password
以及可选的protocol
和port
选项。
如果函数采用更多位置或关键字参数,则也可以将它们附加到调用中。 正是这个 “shim” 组件通过proxy代理与ESXi主机通信,安排从ESXi Proxy Minion的Pillar部分提取凭证和主机名。
由于"shim"转换装置的存在,当你需要查找可用于与ESXi主机连接的功能的说明文档时,应该去查看salt.modules.vsphere而不是salt.modules.esxi。
在Salt Master运行命令并通过ESXi Proxy Minion针对ESXi主机执行管理命令,请使用esxi.cmd
语法调用位于vSphere Execution Module中的功能。 各种vsphere执行模块函数所需的args和kwargs都必须以kwarg类型的风格传递。 例如:
salt 'esxi-*' esxi.cmd system_info
salt 'exsi-*' esxi.cmd get_service_running service_name='ssh'
ESXi State模块的功能与其他状态模块类似。 ESXi执行模块提供的“shim”转换组件传递了host
, username
, 和 password
等参数 ,因此不需要在该State状态下提供这些选项。 除此之外,状态文件的编写和执行与任何其他Salt状态一样。 有关ESXi状态函数,请参阅salt.modules.esxi状态。
以下状态文件是关于如何配置ESXi主机的各个部分的示例,包括启用SSH、上传和配置SSH密钥、配置核心的网络配置、syslog、ntp、启用VMotion以及重置主机密码等。
# /srv/salt/configure-esxi.sls
configure-host-ssh:
esxi.ssh_configured:
- service_running: True
- ssh_key_file: /etc/salt/ssh_keys/my_key.pub
- service_policy: 'automatic'
- service_restart: True
- certificate_verify: True
configure-host-coredump:
esxi.coredump_configured:
- enabled: True
- dump_ip: 'my-coredump-ip.example.com'
configure-host-syslog:
esxi.syslog_configured:
- syslog_configs:
loghost: ssl://localhost:5432,tcp://10.1.0.1:1514
default-timeout: 120
- firewall: True
- reset_service: True
- reset_syslog_config: True
- reset_configs: loghost,default-timeout
configure-host-ntp:
esxi.ntp_configured:
- service_running: True
- ntp_servers:
- 192.174.1.100
- 192.174.1.200
- service_policy: 'automatic'
- service_restart: True
configure-vmotion:
esxi.vmotion_configured:
- enabled: True
configure-host-vsan:
esxi.vsan_configured:
- enabled: True
- add_disks_to_vsan: True
configure-host-password:
esxi.password_present:
- password: 'new-bad-password'
通过ESXi Proxy Minion调用状态就像在常规的minion上一样。 例如:
salt 'esxi-*' state.sls configure-esxi test=true
salt 'esxi-*' state.sls configure-esxi