saltstack 文件管理-pass

Q:项目有好几台机器要改一下备份脚本,如果一台台上去,真的是烦和累,刚好想到salt ,爽了一把 又有想学好 python的动力了 哈哈

A:
1、文件传输:
salt自带有cp模块,模块的方法可以用下面的命令查看下
salt '*' sys.doc | grep "salt '\*' cp"

发送一个文件给客户端: 会自动覆盖原来的文件 这个要小心
root@ab bakcup]# salt 'abroad_db' cp.get_file salt://dbbackup.sh /root/dbbackup.sh
abroad_db2:
/root/dbbackup.sh

salt的主目录在/srv/salt下面,这个可以在配置文件里设定,我上面就是把/srv/salt/test/dbbackup.sh这个文件推送到客户端去
这样写可能报错哦
salt ‘abroad_db2’ cp.get_file salt://dbbackup.sh /root/

2、文件追加:
使用file模块的append方法:

root@debian:/srv/salt# salt '*' file.append /root/test.sh "adfadf"
192.168.1.101:
Wrote 1 lines to “/root/test.sh”
这样可以轻松把内容添加到文件上去,file还有很多方法,具体可以看看源码

不怕文件零碎,不怕新加了机器你还要为他们单独推送

salt提供的sls模板来实现下
先在/srv/salt目录下建立一个入口文件
root@debian:/srv/salt# cat top.sls
base:
'*':
- scpfile.mytest

第二行是一个标志
第三行是指定机器

第四行就是去执行scpfile目录下mytest.sls这个文件
[root@ab scpfile]# cat mytest.sls
/root/test.sh:
file.managed:
- source: salt://scpfile/test.sh
- mode: 755

sls文件讲解
第二行是客户端文件位置
第三行是salt函数
第四行是源文件
第五行是指文件的权限控制
然后在scpfile目录下新建一个test.sh
最后我们来推送一下:

#run
[root@abroad_sdk scpfile]# salt '*' state.highstate -v
Executing job with jid 20161111165118556055
——————————————-

abroad_queue:
———-
ID: /root/test.sh
Function: file.managed
Result: True
Comment: File /root/test.sh updated
Started: 16:51:18.969509
Duration: 14.46 ms
Changes:
———-
diff:
New file
mode:
0755

Summary
————
Succeeded: 1 (changed=1)
Failed: 0
————
Total states run: 1

这里开始 是另外一个机器了

追加内容: sed 的好像不成功
[root@abroad_sdk scpfile]# cat mytest.sls
/root/test.sh:
file.managed:
- source: salt://scpfile/test.sh
- mode: 755
/root/test.sh:
file.append:
- text:
- "11111111111111"

sed修改内容:

root@ubuntu:/srv/salt/scpfile# vi my.sls
- textdd:
/root/test.sh:
file.managed:
- source: salt://scpfile/test.sh
- mode: 755
/root/test.sh:
file.append:
- text:
- "11111111111111"
/root/test.sh:
file.sed:
- before: 11111111111111
- after: 2222

——————————————————–
root@ubuntu:/srv/salt/scpfile# salt ‘*’ state.highstate -v
Executing job with jid 20131031165305244140
——————————————-
192.168.1.101:
———-
State: – file
Name: /root/test.sh
Function: sed
Result: True
Comment: sed ran without error
Changes: diff: —
+++
@@ -1,4 +1,4 @@
adfkdddddd
ddddddddddd
ddd
-11111111111111
+2222

Summary
————
Succeeded: 1
Failed: 0
————
Total: 1

参考
http://lihuipeng.blog.51cto.com/3064864/1317841

自动化运维神器之saltstack (二)文件服务器
http://www.ahlinux.com/mainte/9915.html

源码安装saltstack

这新公司工作机不能连外网,只能各种无语
1.所需软件包

wget -c https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz

用本地文件创建本地yum源
1. 创建iso存放目录和挂载目录
mkdir /mnt/iso
mkdir /mnt/cdrom
2. 将iso镜像文件上传到/mnt/iso文件夹下
3. 将/mnt/iso/下的iso文件挂载到/mnt/cdrom目录
mount -o loop /mnt/iso/XXXXX.iso /mnt/cdrom <注:挂载完之后对其操作会提示设备繁忙,此时需要umount解开挂载才行>
查看是否挂载成功: df -h <用来查看系统中所有挂载的,mount也可以>
4.<最关键的一步>如果/etc/yum.repos/下面有其它的*.repo文件,先创建个文件夹,将这些*.repo先转移到文件夹中,自己写一个.repo的文件
mkdir /etc/yum.repos.d/bak ;
mv *.repo /etc/yum.repos.d/bak 然后创建自己的.repo文件
vi myself.repo #注释在线上要去掉
[base]
name=RedHat
baseurl=file:///mnt/cdrom #注:这里的baseurl就是你挂载的目录,在这里是/mnt/cdrom
enabled=1 #注:这里的值enabled一定要为1 gpgckeck的值无所谓
gpgckeck=0
gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-CentOS-6 #注:这个你cd /mnt/cdrom/可以看到这个key,这里仅仅是个例子

yum clean all

##here
yum install gcc* -y

3.安装python START HERE ok
tar xzvf Python-2.7.8.tgz
cd Python-2.7.8
./configure –prefix=/usr/local/python27
make && make install
mv /usr/bin/python /usr/bin/python2.6bak
ln -s /usr/local/python27/bin/python /usr/bin/python

(3) 解决系统python软链接指向python2.7版本后,yum不能正常工作
方法:
$vi /usr/bin/yum

将文本编辑显示的第一行
#!/usr/bin/python修改为#!/usr/bin/python2.4,保存修改即可

安装zlib

yum install zlib-devel -y
wget http://zlib.net/zlib-1.2.8.tar.gz
tar -zxvf zlib-1.2.8.tar.gz
62 cd zlib-1.2.8
63 ./configure –prefix=/usr/local/zlib-1.2.8 -share
64 make -j2 && make install

配置库文件搜索路径

#追加
cat >> /etc/ld.so.conf<

ln -s /usr/local/zlib-1.2.8 /usr/local/zlib

#20160126pm

源码安装saltstack

192.168.1.100

1.所需软件包

#today 的
yum groupinstall "Development Tools" -y

wget -c https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz

[root@ll]# ls -ltr

-rw-r--r-- 1 root root 571091 Jan 15 15:03 zlib-1.2.8.tar.gz
-rw-r--r-- 1 root root 256862 Jan 15 15:03 setuptools-0.6c11.tar.gz
-rw-r--r-- 1 root root 232384 Jan 15 15:03 python-dateutil-1.5.tar.gz
-rw-r--r-- 1 root root 4434910 Jan 15 15:03 openssl-1.0.1k.tar.gz
-rw-r--r-- 1 root root 248685 Jan 15 15:03 PyYAML-3.11.tar.gz
-rw-r--r-- 1 root root 443445 Jan 15 15:03 pycrypto-2.6.tar.gz
-rw-r--r-- 1 root root 13416 Jan 15 15:03 MarkupSafe-0.23.tar.gz
-rw-r--r-- 1 root root 378470 Jan 15 15:03 Jinja2-2.7.3.tar.gz
-rw-r--r-- 1 root root 2153667 Jan 15 15:03 zeromq-4.0.5.tar.gz
-rw-r--r-- 1 root root 503012 Jan 15 15:03 yaml-0.1.6.tar.gz
-rw-r--r-- 1 root root 995366 Jan 15 15:03 pyzmq-14.4.1.tar.gz
-rw-r--r-- 1 root root 14846119 Jan 15 15:03 Python-2.7.8.tgz
-rw-r--r-- 1 root root 113908 Jan 15 15:03 msgpack-python-0.4.4.tar.gz
-rw-r--r-- 1 root root 3584 Jan 15 15:03 msgpack-pure-0.1.3.tar.gz
-rw-r--r-- 1 root root 74795 Jan 15 15:03 M2Crypto-0.22.3.tar.gz
-rw-r--r-- 1 root root 5310295 Jan 15 15:03 swig-2.0.11.tar.gz
-rw-r--r-- 1 root root 2845127 Jan 15 15:37 salt-2014.1.4.tar.gz

用本地文件创建本地yum源
1. 创建iso存放目录和挂载目录
mkdir /mnt/iso
mkdir /mnt/cdrom
2. 将iso镜像文件上传到/mnt/iso文件夹下
3. 将/mnt/iso/下的iso文件挂载到/mnt/cdrom目录
mount -o loop /mnt/iso/XXXXX.iso /mnt/cdrom <注:挂载完之后对其操作会提示设备繁忙,此时需要umount解开挂载才行>
查看是否挂载成功: df -h <用来查看系统中所有挂载的,mount也可以>
4.<最关键的一步>如果/etc/yum.repos/下面有其它的*.repo文件,先创建个文件夹,将这些*.repo先转移到文件夹中,自己写一个.repo的文件
mkdir /etc/yum.repos.d/bak ;
mv *.repo /etc/yum.repos.d/bak 然后创建自己的.repo文件
vi myself.repo #注释在线上要去掉
[base]
name=RedHat
baseurl=file:///mnt/cdrom #注:这里的baseurl就是你挂载的目录,在这里是/mnt/cdrom
enabled=1 #注:这里的值enabled一定要为1 gpgckeck的值无所谓
gpgckeck=0
gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-CentOS-6 #注:这个你cd /mnt/cdrom/可以看到这个key,这里仅仅是个例子

yum clean all
##here
yum install gcc* -y

3.安装python START HERE
#wget -c https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz
tar xzvf Python-2.7.8.tgz && cd Python-2.7.8 && \
./configure --prefix=/usr/local/python27 && \
make -j2 && make install
mv /usr/bin/python /usr/bin/python2.6bak
ln -s /usr/local/python27/bin/python /usr/bin/python

(3) 解决系统python软链接指向python2.7版本后,yum不能正常工作
方法:
$vi /usr/bin/yum

将文本编辑显示的第一行
#!/usr/bin/python修改为#!/usr/bin/python2.6,保存修改即可

#安装zlib

yum install zlib-devel -y
#wget http://zlib.net/zlib-1.2.8.tar.gz
tar xvf zlib-1.2.8.tar.gz && cd zlib-1.2.8
./configure --prefix=/usr/local/zlib-1.2.8 -share && \
make -j2 && make install

#配置库文件搜索路径

#追加
cat >> /etc/ld.so.conf<> /etc/ld.so.conf<

redhat 6.4源碼編譯saltstack自動化安裝腳本
http://www.xlgps.com/article/405767.html

salt源码安装good
http://www.yallonking.com/?p=1428

http://linuxshow.blog.51cto.com/1572053/1389746
http://www.cnblogs.com/zhutianpeng/p/3883819.html

salt 常用modules

https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.file.html#salt.modules.file.mkdir

salt.modules.file.mkdir(dir_path, user=None, group=None, mode=None)
Ensure that a directory is available.

CLI Example:

salt '*' file.mkdir /data/tmp/

#可以mkdir 多层目录
salt '*' file.mkdir /data/tmp/evan/

升级zmq 为4系列

salt的zmq 不是4 常常有点小问题 于是

官网
http://docs.saltstack.cn/zh_CN/latest/topics/installation/rhel.html
https://copr.fedoraproject.org/coprs/saltstack/zeromq4/

#先查看 可见一开始 为3.2.5
>>> import zmq
>>> print zmq.zmq_version()
3.2.5

yum remove zeromq python-zmq
cd /etc/yum.repos.d/
wget -c https://copr.fedoraproject.org/coprs/saltstack/zeromq4/repo/epel-6/saltstack-zeromq4-epel-6.repo

yum makecache
yum remove zeromq python-zmq

或者下面的直接下载rpm包

wget -c http://copr-be.cloud.fedoraproject.org/results/saltstack/zeromq4/epel-6-x86_64/zeromq-4.0.5-1.el5/zeromq-4.0.5-1.el6.x86_64.rpm
#和
wget -c http://copr-be.cloud.fedoraproject.org/results/saltstack/zeromq4/epel-6-x86_64/python-zmq-14.5.0-2.el5/python-zmq-14.5.0-2.el6.x86_64.rpm

rpm -ivh zeromq-4.0.5-1.el6.x86_64.rpm && rpm -ivh python-zmq-14.5.0-2.el6.x86_64.rpm

#bakup salt 其实不要也行 自己会备份的
cp -a /etc/salt/ etc-salt/
/usr/lib/python2.6/site-packages/salt/grains/core.py

yum install zeromq python-zmq salt-master
#查看结果 成功了
Python 2.6.6 (r266:84292, Jan 22 2014, 09:42:36)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import zmq
>>> print zmq.zmq_version()
4.0.5

Saltstack自定义模块(转)

步骤

首先需要在master机器的file_roots 下建一个_modules文件夹,里面放.py 文件,也就是自定义模块。
file_roots 在/etc/salt/master 里可以设置,默认是/srv/salt/,即你需要在这个目录下新建文件夹_modules
在_modules里新建自定义模块,然后编写相应的代码。
比如模块名是foo,在里面定义了方法bar。
写完代码后,使用命令 salt '*' saltutil.sync_all 将自定义模块同步到各个minion上。
也可以使用 salt '*' saltutil.sync_modules 将自定义模块同步到minion上
运行自定也模块,使用命令 salt ‘*’ foo.bar

cd /data/
mkdir _modules

[root@maste _modules]# tree /data/_modules/
/data/_modules/
`– foo.py

[root@maste _modules]# cat foo.py
# coding: utf-8

def bar():
CMD_RUN = __salt__['cmd.run']
cmd = "ls /etc/init"
return CMD_RUN(cmd)

# 解释
# 自定义模块会加载__salt__变量,这个dict变量里包含所有的salt function
# 上面的cmd.run就是salt的命令运行函数
# __salt__变量必须在自定义的模块里使用,也就是必须在自定一的方法中使用,
# 如上面的bar方法,不能将__salt__变量放到全局变量中使用,否则会报__salt__变量为定义

salt '*' saltutil.sync_all
salt '*' foo.bar

注意事项

如果要使用__salt__变量,必须要在自定义的方法中使用,不能在全局变量中使用。
如果运行命令报错了,如报 foo.bar is not avaliable,请到minion机器上去查看具体的日志。
报上述错误并不是模块没有同步到minion上,而是你编写的模块运行有问题。
minion的日志记录在/var/log/salt/minion中,可以去这里查看具体错误。

实现自定义模块的过程中,可以发扬NIH(Not invent here)的思想。
可以充分利用__salt__变量里的salt自带函数来实现你想要的功能。

http://runforever.github.io/blog/2014-07-11-saltstack%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A8%A1%E5%9D%97.html

Salt State

第一 在master 可以看到如下信息
[root@master salt]# vim /etc/salt/master

#file_roots:
file_roots:
base:
- /srv/salt/
#- /var/salt/

cd /srv/salt

[root@master salt]# pwd
/srv/salt
[root@master salt]# cat top.sls
base:
'192.168.1.210':
#- evan.sc
- evan.pack #这个是evan目录下有个pack.sls
#- evan.fc7

mkdir evan
cd evan;

[root@master evan]# vim pack.sls
apache:
pkg:
- name: httpd
- installed
service:
- name: httpd
- running
- reload: True
- watch:
- file: /etc/httpd/conf/httpd.conf

/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://fc7/httpd.conf
- user: root
- group: root
- mode: 644
- backup: minion

第二 回来minion
root@client salt]# rm -rf /etc/httpd/conf/httpd.conf
[root@client salt]# vim /etc/httpd/conf/httpd.conf
[root@client salt]# file /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf: ERROR: cannot open `/etc/httpd/conf/httpd.conf’ (No such file or directory)
由上可见 这个文件不在了

第四 to master
[root@master salt]# salt 192.168.1.210 state.highstate
192.168.1.210:
———-
State: – pkg
Name: httpd
Function: installed
Result: True
Comment: Package httpd is already installed
Changes:
———-
State: – file
Name: /etc/httpd/conf/httpd.conf
Function: managed
Result: True
Comment: File /etc/httpd/conf/httpd.conf updated
Changes: diff: New file

———-
State: – service
Name: httpd
Function: running
Result: True
Comment: Service reloaded
Changes: httpd: True

第五 然后再回来minion看一下 刚才不小心删除的文件又来了

[root@client salt]# file /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf: ASCII English text

参考
http://www.shencan.net/index.php/2013/05/24/saltstack%EF%BC%88%E4%B8%80%EF%BC%89/

digitalocean–不错的VPS

digitalocean–不错的VPS 512M RAM 一个月 5美元
https://cloud.digitalocean.com/billing

Manage Payments 然后用paypal 绑定银行卡就可以了 当然啦 最终还是经过了银联这王八蛋 ! 好啦 有空我写个教程出来

centos5.x 系列使用 salt 内置的nginx 模块

查看模块
find / -name nginx.*
cat /usr/lib/python2.6/site-packages/salt/modules/nginx.py

import salt.utils

# Cache the output of running which(‘nginx’) so this module
# doesn’t needlessly walk $PATH looking for the same binary
# for nginx over and over and over for each function herein
@salt.utils.memoize
def __detect_os():
return salt.utils.which(‘nginx’)

def __virtual__():
”’
Only load the module if nginx is installed
”’
if __detect_os():
return ‘nginx’
return False

def version():
”’
Return server version from nginx -v

CLI Example::

salt ‘*’ nginx.version 问丹爷下面的源码
”’
cmd = ‘{0} -v’.format(__detect_os())
out = __salt__[‘cmd.run’](cmd).splitlines()
ret = out[0].split(‘: ‘)
return ret[-1]

由上面打开这模块源码可以要用 salt.utils
但是导入这模块时报错 原来是python版本太老了

Python 2.4.3 (#1, Sep 3 2009, 15:37:37)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import salt.utils
Traceback (most recent call last):
File ““, line 1, in ?
ImportError: No module named salt.utils

#master 和 minion改为新版本 python就好了
vi /usr/bin/yum
mv /usr/bin/python /usr/bin/python24bak
ln -s /usr/bin/python26 /usr/bin/python

搞定

测试私有方法

>>> a = __detect_os()
>>> a
‘/usr/sbin/nginx’

解读
cmd = ‘{0} -v’.format(__detect_os()) #{0} 数组第一个
out = __salt__[‘cmd.run’](cmd).splitlines() #切成一行行
ret = out[0].split(‘: ‘) 上面的第一行
return ret[-1]

salt yum安装–pass

master 192.168.23.50
client 192.168.20.208
##start
第一 添加RPM源
#6系列
rpm -ivh http://mirrors.aliyun.com/epel/6/x86_64/epel-release-6-8.noarch.rpm
#rpm -ivh http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm
#7
rpm -ivh http://mirrors.aliyun.com/epel/7/x86_64/e/epel-release-7-7.noarch.rpm
#5系列
wget http://mirrors.sohu.com/fedora-epel/5/x86_64/epel-release-5-4.noarch.rpm
rpm -ivh epel-release-5-4.noarch.rpm
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL #导入密钥

yum info salt
*******************************************
第二 on master
useradd salt
yum install salt-master -y

vi /etc/salt/master
# The address of the interface to bind to
interface: masterip #前面要有两个空格
# The tcp port used by the publisher
  publish_port: 4505#前面要有两个空格
#自动认证
auto_accept: True
# The user to run the salt-master as. Salt will update all permissions to
# allow the specified user to run the master. If the modified files cause
# conflicts set verify_env to False.
user: root
# interface used for the file server, authentication, job returnes, etc.
  ret_port: 4506#前面要有两个空格

*******************************************
CentOS5.6配置salt节点minion
http://zhoulg.blog.51cto.com/48455/1140186

第三 client
useradd salt
yum install salt-minion -y

vi /etc/salt/minion
#编辑11行:#master: salt
master: masterip
master: 192.168.23.50

配置key 和试用
在master端通过salt-key -L查看Keys如下:
[root@vm1 test]# salt-key -L
Accepted Keys:
Unaccepted Keys:
test1
Rejected Keys:
[root@vm1 test]# salt-key -A
Key for minion test1 accepted.

[root@vm1 test]# salt 'test1' test.ping
test1:
True

常用命令
1)检查master与minion的连接状态:salt '*' test.ping or salt 'test1' test.ping
2)远程执行命令:salt '*' cmd.run 'ls /root'
test1:
anaconda-ks.cfg
bootstrap-salt.sh
install.log
install.log.syslog
vm2

3)从master上传文件至minion:
salt-cp nodeid source_file target_file
例子:salt-cp 'vm01' /root/test/bootstrap-salt.sh /root
4)master同步命令:
salt '*' state.highstate

To have the Minion start automatically at boot time:
chkconfig salt-minion on
#7
systemctl enable salt-minion.service
to start the Minion:
#7
systemctl start salt-minion.service

https://docs.saltstack.com/en/latest/topics/installation/rhel.html

#所有内置模块
http://docs.saltstack.com/ref/modules/all/index.html
http://wiki.saltstack.cn/modules/all
常用内置模块
[root@vm3 ~]# salt 'vm0' pkg.install w3m
vm0:
———-
gpg-pubkey:
———-
new:
217521f6-45e8a532,e8562897-459f07a4
old:
217521f6-45e8a532
w3m:
———-
new:
0.5.1-18.el5
old:

问题1
[root@localhost soft]# yum install python-jinja2
Loaded plugins: fastestmirror, security
Determining fastest mirrors
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again

编辑/etc/yum.repos.d/epel.repo和/etc/yum.repos.d/epel-testing.repo
将mirrorlist注释,将baseurl打开

问题2:
file /usr/lib64/python2.6/zipfile.pyo from install of python-libs-2.6.6-64.el6.x86_64 conflicts with file from package python-2.6.6-29.el6_2.2.x86_64
64 conflicts with file from package python-2.6.6-36.el6.x86_64
Error Summary

升级下python版本
yum update python or yum install python

saltstack学习—快速安装
http://www.diyoms.com/automation/1690.html

官方文档
install
http://docs.saltstack.com/topics/installation/rhel.html
##总的
http://docs.saltstack.com/topics/installation/index.html
configure
http://docs.saltstack.com/topics/configuration.html

SaltStack installation on Centos 7

更加详细的配置
Configuring the Salt Master
http://docs.saltstack.com/ref/configuration/master.html

Configuring the Salt Minion
http://docs.saltstack.com/ref/configuration/minion.html

CentOS7.2系统环境中安装saltstack详细配置过程讲解

Python自动化运维 ,这个不错,从用fabric 批量 salt开始呢
http://opython.com/?cat=4
http://blog.sina.com.cn/s/blog_7f1737720101ebzg.html

深入SaltStack(转)
http://blog.sina.com.cn/s/blog_7f1737720101ebz9.html

http://blog.halfss.com/blog/2013/06/15/saltxiang-guan-shi-yong/

Salt stack first sls 文件
http://blog.csdn.net/qingchn/article/details/8752004

Salt实战之自动安装部署MooseFS
http://blog.csdn.net/shanliangliuxing/article/details/8986731

Centos 6.4安装SaltStack 有酷酷的防火墙写法

参考资料
salt的安装部署
http://zhengbin.blog.51cto.com/2989505/1229884

salt基础命令
http://zhengbin.blog.51cto.com/2989505/1229891

salt-minion,salt-master,multi master
http://www.cnblogs.com/taosim/articles/3598919.html