<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Ops运维 | Mr`kang Blog｜小豆子]]></title> 
<link>https://www.cnmysql.com/index.php</link> 
<description><![CDATA[关注服务器运维技术、DB优化、Docker虚拟化、自动化运维、工作积累]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Ops运维 | Mr`kang Blog｜小豆子]]></copyright>
<item>
<link>https://www.cnmysql.com/post//</link>
<title><![CDATA[系统自动化配置和管理工具 SaltStack]]></title> 
<author>kangyang &lt;kangyang315@qq.com&gt;</author>
<category><![CDATA[运维自动化]]></category>
<pubDate>Wed, 06 Aug 2014 06:38:23 +0000</pubDate> 
<guid>https://www.cnmysql.com/post//</guid> 
<description>
<![CDATA[ 
	<span style="color: #800080;"><span style="font-size: 12px;"><span style="font-family: 宋体;">我们的服务器由 Puppet 配置管理工具来管理，服务器上线后由 puppet 完成初始化和配置等一系列工作（比如，静态 IP 配置，DNS 设置，NFS/SAN 挂载，LDAP/Kerberos 登录，安全加固配置，内核参数优化，防火墙规则配置等等），等初始化完成后开始运行，运行一段时间后有一些需要自动和手动操作的任务（比如升级、重启、备份等），这时候我们使用 Fabric 来批量执行这些临时任务。<br/>所以从这里可以看到 Puppet 和 Fabric 其实是两个不同性质的工具，看下面的归类可能会更清楚一些。Puppet 和 Fabric 两个的工作其实可以由一个工具 SaltStack（或 AnsibleWorks）完成，减少一个工具的使用会减轻一点负担（学习工具的人力成本、安装和配置工具的时间成本等等）。<br/>操作系统和软件的安装、配置、初始化等；<br/>（Puppet, Chef, CFEngine, AnsibleWorks, SaltStack, …）<br/>自动执行任务，比如定期备份、清除日志等；<br/>（Fabric, AnsibleWorks, SaltStack, …）<br/>手动执行任务，比如部署应用、升级、重启、检查和校验文件系统、增加用户等。<br/>（Fabric, Rake, Func, Rundeck, AnsibleWorks, SaltStack, …）<br/>SaltStack 采用 zeromq 消息队列进行通信，和 Puppet/Chef 比起来，SaltStack 速度快得多。还有一点我们喜欢 SaltStack 的地方是它是 Python 写的，比 Puppet/Chef 这些 Ruby 工具更接近我们的能力圈。<br/>安装主控服务器（salt master）<br/>和大多数类似工具一样，SaltStack 需要在一台机器（主控）上安装服务器端软件（SaltStack 称之为 salt master），在多台机器（受控）上安装客户端软件（SaltStack 称之为 salt minion）。在主控机器上给下属（受控）发命令，在受控机器上接受和执行上级（主控）的命令。<br/>在 Ubuntu 上安装 salt master：<br/><div class="code">$ sudo add-apt-repository ppa:saltstack/salt<br/>$ sudo apt-get update<br/>$ sudo apt-get install salt-master</div><br/>在 CentOS 6.x 上安装 salt master：<br/><div class="code"># rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm<br/># yum update<br/># yum install salt-master</div><br/>安装受控客户端（salt minion）<br/>在 Ubuntu 上安装 salt minion：<br/><div class="code">$ sudo add-apt-repository ppa:saltstack/salt<br/>$ sudo apt-get update<br/>$ sudo apt-get install salt-minion</div><br/>在 CentOS 6.x 上安装 salt minion：<br/><div class="code"># rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm<br/># yum update<br/># yum install salt-minion</div><br/>安装完 salt minion 后记得修改配置文件，让 salt minion 指向 salt master 服务器地址：<br/><div class="code">$ sudo vi /etc/salt/minion<br/>...<br/># Set the location of the salt master server, if the master server cannot be<br/># resolved, then the minion will fail to start.<br/>master: saltmaster.vpsee.com<br/>...<br/> <br/>$ sudo restart salt-minion</div><br/>在 master 上执行 salt-key list 就会看到有个 minion1.vpsee.com 请求加入受控，执行 -a 接受请求后，主控和受控之间的信任关系就建立起来了，主控就可以任意 “摆布” 受控了：<br/><div class="code"># salt-key list<br/>Accepted Keys:<br/>Unaccepted Keys:<br/>minion1.vpsee.com<br/>Rejected Keys:<br/> <br/># salt-key -a minion1.vpsee.com<br/>The following keys are going to be accepted:<br/>Unaccepted Keys:<br/>minion1.vpsee.com<br/>Proceed? &#91;n/Y&#93;</div><br/>执行命令的例子<br/>在主控机器上执行一个命令，让所有受控机器执行 hostname 命令：<br/><div class="code"># salt &#039;*&#039; cmd.run &quot;hostname&quot;<br/>minion1.vpsee.com:<br/>&nbsp;&nbsp;&nbsp;&nbsp;minion1.vpsee.com</div><br/>在主控机器上执行一个命令，让所有受控机器上执行内建 test.ping 命令：<br/><div class="code"># salt &#039;*&#039; test.ping<br/>minion1.vpsee.com:<br/>&nbsp;&nbsp;&nbsp;&nbsp;True</div><br/>还有一些内建命令可以尝试：<br/><div class="code"># salt &#039;*&#039; disk.usage<br/># salt &#039;*&#039; network.interfaces</div><br/>执行状态的例子<br/>开头的时候我们说了 SaltStack = Fabric + Puppet，上面 “执行命令的例子” 演示了 Fabric 类似的功能，这里要演示的是 Puppet 类似的功能，在主控上定义好系统配置应该有的状态，然后受控自动完成相应的操作和配置。<br/>首先确定状态定义的文件应该放在什么地方，以下操作都在主控（salt master）上执行。检查 /etc/salt/master 文件的 file_roots 条目，默认是在 /srv/salt 下，如果没有这个目录还需要手动创建一个：<br/><div class="code"># vi /etc/salt/master<br/>...<br/>#file_roots:<br/>#&nbsp;&nbsp;base:<br/>#&nbsp;&nbsp;&nbsp;&nbsp;- /srv/salt<br/>...<br/> <br/># mkdir /srv/salt</div><br/>比如我们想在所有受控机器上安装 vim 软件包，并使用自己定义的 vimrc 文件：<br/><div class="code"># vi /srv/salt/vim.sls<br/>vim:<br/>&nbsp;&nbsp;pkg.installed<br/> <br/>/etc/vimrc:<br/>&nbsp;&nbsp;file.managed:<br/>&nbsp;&nbsp;&nbsp;&nbsp;- source: salt://vimrc<br/>&nbsp;&nbsp;&nbsp;&nbsp;- mode: 644<br/>&nbsp;&nbsp;&nbsp;&nbsp;- user: root<br/>&nbsp;&nbsp;&nbsp;&nbsp;- group: root<br/> <br/># vi /srv/salt/vimrc<br/>syntax enable<br/>set textwidth=79<br/>set shiftwidth=4<br/>set tabstop=4<br/>set expandtab<br/>set softtabstop=4<br/>set shiftround<br/>set fileencodings=utf-8<br/>set encoding=utf8<br/>set tenc=utf8</div><br/>强制执行这个状态：<br/><div class="code"># salt &#039;*&#039; state.sls vim</div><br/>再来一个例子，参考 “安装和使用系统监控工具 Glances” 一文，我们想在所有受控机器上安装 Glances，如何实现呢？<br/><div class="code"># vi /srv/salt/glances.sls<br/>python-pip:<br/>&nbsp;&nbsp;pkg.installed<br/> <br/>build-essential:<br/>&nbsp;&nbsp;pkg.installed<br/> <br/>python-dev:<br/>&nbsp;&nbsp;pkg.installed<br/> <br/>glances:<br/>&nbsp;&nbsp;pip.installed:<br/>&nbsp;&nbsp;&nbsp;&nbsp;- require:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- pkg: python-pip</div><br/>强制执行这个状态：<br/><div class="code"># salt &#039;*&#039; state.sls glances<br/>...<br/>minion1.vpsee.com:<br/>----------<br/>&nbsp;&nbsp;&nbsp;&nbsp;State: - pip<br/>&nbsp;&nbsp;&nbsp;&nbsp;Name:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glances<br/>&nbsp;&nbsp;&nbsp;&nbsp;Function:&nbsp;&nbsp;installed<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result:&nbsp;&nbsp;&nbsp;&nbsp;True<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Comment:&nbsp;&nbsp; Package was successfully installed<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Changes:&nbsp;&nbsp; Glances==1.7.1: Installed<br/>...</div></span></span></span>
]]>
</description>
</item><item>
<link>https://www.cnmysql.com/post//#blogcomment</link>
<title><![CDATA[[评论] 系统自动化配置和管理工具 SaltStack]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.cnmysql.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>