salt搭建及jdk自动部署例子
saltstack 安装:
saltstack python开发
salt C/S 架构 server: master client: minion
配置管理工具:
puppet 体量大,功能多, ruby语言
saltstack 适中,性能好
ansible 轻量,基于ssh
fabric
......
10.1.1.1 master
10.1.1.2 minion1
10.1.1.3 minion2
########## 安装依赖包 ############################################
yum install -y ntpdate wget xz gcc gcc-c++ zlib zlib-devel python-devel openssl-devel
ntpdate -u cn.pool.ntp.org
########### 升级python ############################################
wget https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tgz --no-check-certificate
tar xf Python-2.7.14.tgz
cd Python-2.7.14
./configure --prefix=/usr/local/python-2.7.14
make && make install
cd /usr/bin/
mv pydoc pydoc.bak
mv python python.bak
mv python-config python-config.bak
ln -s /usr/local/python-2.7.14/bin/pydoc pydoc
ln -s /usr/local/python-2.7.14/bin/python2.7 python2.7
ln -s /usr/local/python-2.7.14/bin/python2.7 python
ln -s /usr/local/python-2.7.14/bin/python-config python-config
sed -i '[email protected]/usr/bin/[email protected]/usr/bin/[email protected]' /usr/bin/yum
vim /usr/bin/yum
将第一行的#!/usr/bin/python 修改为 #!/usr/bin/python2.6
####### 安装pip ############################################
unzip setuptools-36.0.1.zip
cd setuptools-36.0.1
python setup.py install
cd ..
tar xf pip-9.0.1.tar.gz
cd pip-9.0.1
python setup.py install
ln -s /usr/local/python-2.7.14/bin/pip /usr/bin/pip
#######pip 给python安装salt模块
mkdir -pv /usr/src/pip_salt
cd /usr/src/pip_salt
pip download salt
pip install ./*
###### 最后的配置 ############################################
·@master:
cd pip_salt
tar xf salt-2017.7.2.tar.gz
cd salt-2017.7.2
mkdir /etc/salt
cp -a conf/master /etc/salt/
cp -a pkg/suse/salt-master /etc/init.d/
chmod +x /etc/init.d/salt-master
chkconfig salt-master on
mkdir -p /var/log/salt /srv/salt
ln -s /usr/local/python-2.7.14/bin/salt-master /usr/bin
ln -s /usr/local/python-2.7.14/bin/salt /usr/bin
ln -s /usr/local/python-2.7.14/bin/salt-key /usr/bin
sed -i "[email protected]#interface: [email protected]: [email protected]" /etc/salt/master
/etc/init.d/salt-master start
---------------------------------------------------------------------
·@minion:
cd pip_salt
tar xf salt-2017.7.2.tar.gz
cd salt-2017.7.2
mkdir /etc/salt
cp -a conf/minion /etc/salt/
cp -a pkg/suse/salt-minion /etc/init.d/
chmod +x /etc/init.d/salt-minion
chkconfig salt-minion on
mkdir -p /var/log/salt
ln -s /usr/local/python-2.7.14/bin/salt-minion /usr/bin
sed -i "[email protected]#master: [email protected]: [email protected]" /etc/salt/minion
sed -i "[email protected]#id:@id: [email protected]" /etc/salt/minion
/etc/init.d/salt-minion start
##############################################################
配置:
1.master:
[/etc/salt/master]
interface: 10.1.1.1
service salt-master restart
2.minion:
[/etc/salt/minion]
master: 10.1.1.1
id: minion-1
service salt-minion restart
校验安装结果:
salt-key -L ,显示已经或未认证的被控端id,Accepted Keys为已认证清单,Unaccepted Keys为未认证清单
salt 'minion-1' test.ping
salt-key -D ,删除所有认证主机id证书
salt-key -d id ,删除单个id
salt-key -A ,接受所有id证书请求
salt-key -a id ,接受单个id证书请求
salt_boot_start安装
先下载salt_boot_start
https://github.com/saltstack/salt-bootstrap/releases下载地址
单独安装
saltmaster yum -y install openssh-clients 安装scp
sh bootstrap-salt.sh -M -N
单独安装salt-minion
sh bootstrap-salt.sh
master 命令
salt-key -L
salt-key -a minion
salt-key -f minion 查看minion**
salt minion sys.list_functions test 查看test模块其他函数
salt minion sys.doc test.echo 查看test模块中echo 的用法
Usage: salt [options] '<target>' <function> [arguments] salt语法
命令本身 目标 目标定位字符串 远程执行函数参数
salt minion cmd.run 'ls -l'
远程命令
salt --summary minion cmd.run 'echo my salt' 概要显示--summary 或则 -s
salt --verbose minion cmd.run 'echo my salt' 详细显示命令 -v 或则--verbose、
[[email protected] salt-bootstrap-2017.12.13]# salt --out=json minion cmd.run_all "echo my salt"
{
"minion": {
"pid": 3325,
"retcode": 0,
"stderr": "",
"stdout": "my salt"
}
}
以json 格式输出命令结果
[[email protected] salt-bootstrap-2017.12.13]# salt --out=yaml minion cmd.run_all "echo my salt"
minion:
pid: 3331
retcode: 0
stderr: ''
stdout: my salt
以yaml格式输出命令结果
[[email protected] salt-bootstrap-2017.12.13]# salt --out=yaml [a-z]inio[a-z] cmd.run_all "echo my salt"
minion:
pid: 3349
retcode: 0
stderr: ''
stdout: my salt
[a-z]代表匹配 a-z 的一个字符
?代表匹配 任意一个字符
[[email protected] salt-bootstrap-2017.12.13]# salt -E 'min' test.ping
minion:
True
-E代表匹配正则表达式
[[email protected] salt-bootstrap-2017.12.13]# salt -N 'min' test.ping
Node group min unavailable in /etc/salt/maste
分组匹配 需要制定/etc/salt/master 的nodegroup
一个minion可以告诉master 他的grains数据 而minion 需要从master获取pillar数据
grains可以看作是描述minion本身固有属性的静态数据
salt minion grains.items
可以查看minion的 cpu信息 网卡信息 swap信息 python信息 内核网关 ip地址
[[email protected] salt-bootstrap-2017.12.13]# salt minion grains.item os
minion:
----------
os:
CentOS
检索某一项
[[email protected] salt-bootstrap-2017.12.13]# salt -G 'os:centos' test.ping
minion:
True
按系统定位主机
也可以按网卡定位主机
[[email protected] salt-bootstrap-2017.12.13]# salt -G 'osrelease:6.*' test.ping
minion:
True
安全局匹配
[[email protected] salt-bootstrap-2017.12.13]# salt minion grains.setval cpu_num 1
minion:
----------
cpu_num:
1
自己定义minion的cpu数量来定义grains数据
pillar 类似于动态的形式 安全的数据存储库
[[email protected] salt-bootstrap-2017.12.13]# salt -I "role:web" test.ping
匹配role(角色)
应用
符合匹配模式
远程命令模块cmd.run
salt "*" cmd.run "ps -ef | wc -l"
安装包模块pkg.install
salt minion pkg.install "httpd" 安装httpd服务包
[[email protected] salt-bootstrap-2017.12.13]# salt minion pkg.version "httpd"
minion:
2.2.15-69.el6.centos
查看httpd的安装版本
[[email protected] salt-bootstrap-2017.12.13]# salt minion pkg.remove "httpd"
minion:
----------
httpd:
----------
new:
old:
2.2.15-69.el6.centos
查看HTTP的版本
管理服务模块
[[email protected] salt-bootstrap-2017.12.13]# salt minion service.status httpd
minion:
False
查看服务状态 还可以stop start
文件管理模块
[[email protected] salt-bootstrap-2017.12.13]# salt minion file.stats /etc/passwd
minion:
----------
atime:
1541217894.09
ctime:
1541217893.65
gid:
查看文件状态
salt '*' file.chown /a.txt root root 修改minion上文件属组
用户管理模块
[[email protected] salt-bootstrap-2017.12.13]# salt minion user.del "deploy"
minion:
----------
user.del:
'user.del' is not available.
user.delete:
Remove a user from the minion
CLI Example:
salt '*' user.delete name remove=True force=True
ERROR: Minions returned with non-zero exit code
[[email protected] salt-bootstrap-2017.12.13]# salt minion user.delete "deploy"
minion:
True
删除用户
[[email protected] salt-bootstrap-2017.12.13]# salt minion user.info "deploy"
minion:
----------
fullname:
gid:
500
groups:
- deploy
home:
/home/deploy
homephone:
name:
deploy
other:
passwd:
x
roomnumber:
shell:
/bin/bash
uid:
500
workphone:
查看用户信息
salt '*' saltutil.sync_modules
自定义执行模块函数
vim /srv/salt/_modules/hello.py
def world():
return 'hello,world!'
def kk():
return 'hell,kk'
~
执行函数模块命令:
[[email protected] python3.7]# salt '*' saltutil.sync_modules
minion:
- modules.hello
[[email protected] python3.7]# salt '*' hello.kk
minion:
hell,kk
[[email protected] python3.7]# cd /usr/lib/python2.7/site-packages/salt/modules/ 自带函数模块位置
状态模块安装apache
[[email protected] /]# salt minion state.sls apache
minion:
----------
ID: install_httpd
Function: pkg.installed
Name: httpd
Result: True
Comment: The following packages were installed/updated: httpd
Started: 06:17:31.609702
Duration: 81678.151 ms
Changes:
----------
httpd:
----------
new:
2.2.15-69.el6.centos
old:
Summary for minion
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 81.678 s
运行状态模块好处是判断minion上服务是否已经安装 ,如果未安装就之久安装 ,已经安装就直接跳过
比cmd.run多了一个状态判断 这叫做幂等性。
可以通过判断来让minion 以最小的代价进入 指定的状态。
状态文件的构成:
SLS配置文件使用 YAML语言描述。
规则: 第一缩进两个空格
第二 冒号values表现形式为为键值对 冒号+空格
第三 短横杠 – list_value_one
salt minion sys.list_state_modules 这个命令可以列举所有状态模块列表
file模块包含很多函数
file.managed 下发文件
[[email protected] salt]# vim apache.sls
install_httpd:
pkg.installed:
- name: httpd
httpd_running:
service.running:
- name: httpd
- enable: True
- require:
- pkg: install_httpd
- watch:
- file: httpd_conf
httpd_conf:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://httpd.conf
- user: root
- group: root
- mode: 600
Highstate函数通过top.sls文件作为入口对模块和主机进行管理的,通过top.sls文件对两个状态文件尽心整合。Mkdir -pv /sev/salt/lamp
Mkdir -pv /srv/salt/nginx
把对应的文件放置在对应的目录下
Lamp---(httpd.conf lamp.sls my.cnf php.ini )
Nginx----(nginx.j2 nginx.sls test_vhost.conf)
Vim top.sls 编辑入口文件
Installed结尾的模块位置/usr/lib/python2.7/site-packages/salt/states
Install结尾的 模块位置 /usr/lib/python2.7/site-packages/salt/modules/下
调用模块及传参数图流程
- mode: 755
# 必须要给可执行权限,因为这里是脚本启动,不是二进制文件
minion 命令
salt-call --local key.finger 查看minion的指纹**
制定RPM包来源
Mypkgs::
Pkg.installed:
- Sources:
- foo: salt://rpms/foorpm
- bar: http://somesite.org/bar.rpm
用top.sls文件将Pillar文件定位到不同minion. Top.sls也可以用来在状态系统中
将不同状态文件定位到不同的minion中。
include:
- soft.modules #包含模块配置文件
#nginx.tar.gz
nginx_source:
file.managed:
- name: /tmp/nginx-1.12.0.tar.gz #标识文件所在位置
- unless: test -e /tmp/nginx-1.12.0.tar.gz #检测文件是否存在,只在第一次检测
- source: salt://nginx/files/nginx-1.12.0.tar.gz #把maser上的文件传过去
#extract
extract_nginx:
cmd.run:
- cwd: /tmp #进入/tmp目录
- names:
- tar zxvf nginx-1.12.0.tar.gz #解压
- unless: test -d /tmp/nginx-1.12.0.tar.gz
- require:
- file: nginx_source #这个命令必须在上面的函数执行成功后才继续执行
#user
nginx_user:
user.present: #用户创建
- name: nginx
- createhome: False #不用家目录
- gid_from_name: True
- shell: /sbin/nologin #指定shell
#nginx_pkgs
nginx_pkg:
pkg.installed: #安装必备组件
- pkgs:
- gcc
- gcc-c++
- epel-release
- openssl-devel
- pcre-devel
- zlib-devel
- gd-devel
- lua-devel
#nginx_compile
nginx_compile: #nginx进行编译
cmd.run:
- cwd: /tmp/nginx-1.12.0
- names:
- ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio
--with-http_ssl_module --with-http_realip_module --with-http_addition_module
--with-http_image_filter_module --with-http_gzip_static_module
--with-http_stub_status_module --with-mail --with-mail_ssl_module
--with-pcre --with-ld-opt=-Wl,-rpath,/usr/local/luajit/lib
--with-http_sub_module --add-module=/soft/ngx_cache_purge-2.3
--add-module=/soft/ngx_devel_kit-0.3.0rc1
--add-module=/soft/echo-nginx-module-master
--add-module=/soft/lua-nginx-module-master && make && make install
- require:
- cmd: extract_nginx
- pkg: nginx_pkg
#- unless: test -d /usr/local/nginx/ #检测或不检测目录是否存在
#cache_dir
cache_dir:
cmd.run:
- names: #创建虚拟主机目录,把nginx目录权限给相关用户
- mkdir -p /usr/local/nginx/conf/vhosts && chown -R nginx.nginx /usr/local/nginx/
- require:
- cmd: nginx_compile
- unless: test -d /usr/local/nginx/conf/vhosts/
#vhosts
file.managed:
- name: /usr/local/nginx/conf/nginx.conf #修改后的配置文件复制过去
- source: salt://nginx/files/nginx.conf
#- unless: test -e /usr/local/nginx/conf/nginx.conf #建议不进行检测,如果检测,有这个文件将不会进行更新
/usr/local/nginx/conf/proxy.conf:
file.managed:
- name: /usr/local/nginx/conf/proxy.conf
- source: salt://nginx/files/proxy.conf
#- unless: test -e /usr/local/nginx/conf/proxy.conf
jdk-config:
file.append:
- name: /etc/profile
- text:
- "#############JAVA ENVIRONMNET################"
- "export JAVA_HOME=/usr/local/java"
- "export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH"
-"exportCLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib"