1.saltstack概念及原理
SaltStack管理工具允许管理员对多个操作系统创建一个一致的管理系统,包括VMware vSphere环境。自动化运维软件,自动化配置系统
SaltStack作用于仆从和主拓扑。SaltStack与特定的命令结合使用可以在一个或多个下属执行。实现这一点,此时Salt Master可以发出命令,如salt ‘*‘ cmd.run ‘ls -l /‘。没有UI界面
Saltstack是基于python开发的一套C/S架构配置管理工具;一种全新的基础设施管理方式,部署轻松
SaltStack三大功能:
●远程执行
●配置管理
●云管理
2.环境要求
需要两个干净的6.5的虚拟机
查看虚拟机的信息的命令: qemu-img info 虚拟机名
在真机上:
cd /var/lib/libvirt/
ls
qemu-img info new.qcow2 ##查看虚拟机的信息
qemu-img create -f qcow2 -b new.qcow2 wf1
qemu-img create -f qcow2 -b new.qcow2 wf2
virt-manager
创建新的虚拟机 wf1 wf2
注意:虚拟机的解析
cat /etc/redhat-release ##查看系统版本
uname -r ##查看系统内核版本
getenforce ##查看selinux的状态,selinux必须是关闭的
/etc/init.d/iptables stop ##关闭防火墙
3.saltstack的配置
在真机上:
lftp 172.25.254.250
cd pub/docs/saltstack
ls
mirror rhel6 ##将rhel6的文件放在http的默认发布目录上
mv rhel6/ /var/www/html/
systemctl start httpd.service
在wf1,2,3上: 需要重新配置yum源
vim /etc/yum.repos.d/rhel-source.repo
[saltstack]
name=saltstack
baseurl=http://172.25.8.250/rhel6
gpgcheck=0
yum repolist
在wf1上:
yum install -y salt-master
cd /etc/salt
ls
vim master ##master端编辑master的文件,不过这个没有要编辑的
/etc/init.d/salt-master start
在wf2,3上:
yum install -y salt-minion
cd /etc/salt/
ls
vim minion ##minion端编辑minion的文件
master: 172.25.8.1 ##设置master的ip
/etc/init.d/salt-master start
在wf1上:salt远程执行命令
salt-key -L ##查看接受的和没有被授权的请求
salt-key -A ##批量处理没有被处理的没有授权的请求
salt-key -a ##处理某一个为授权的请求
测试:保持长链接
-在wf1上操作,输入命令:
-salt wf2/3 test.ping
##salt命令 test.ping的含义是,test是一个模块,ping是模块内的方法
-salt wf2/3 cmd.run hostname
===============================================================================
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
lsof -i 用以显示符合条件的进程情况
lsof -i :4505
===============================================================================
4.saltstack的配置管理 YAML
===============================================================================
默认的SLS文件的renderer是YAML renderer。YAML是一个有很多强大特性的标记性语言。salt使用了一个YAML的小型子集,映射非常常用的数据,像列表和字典
pki加密
base目录 部署服务,需要调用很多的模块,没有base目录需要自己建立
================================================================================
在wf1上:
vim master
file_roots: ##开启base的默认目录,并创建
base:
- /srv/salt/
mkdir /srv/salt
/etc/init.d/salt-master restart
cd /srv/salt
mkdir apache
vim install.sls ##进入到/srv/salt/目录下创建,python语法注意空格缩进,不能用tab键
http: 软件包名称
pkg.installed
salt wf2 state.sls apache.install ##salt调用客户端的命令 wf2客户端名称 state.sls调用sls这个文件 在base下的
在wf2上:
yum install tree -y
cd /var/cache/salt
tree .
在wf1上:
vim /srv/salt/apache/install.sls
http: 软件包名称
pkg.installed ##安装
apsche:
service.running: ##执行 开启服务
- name: httpd
- enable: True
salt wf2 state.sls apache.install
在wf2上:
ps ax ##查看进程信息,是否有开启服务
chkconfig --list httpd
在wf1上:
vim /srv/salt/apache/install.sls
httpd:
pkg.installed:
- pkgs:
- httpd
- php
- php-mysql
service.running:
- name: httpd
- enable: True
注意:但是如果修改wf2上的http的配置文件的话,wf1将命令推过来的时候,就会将更改的配置文件覆盖掉,就相当于没有更改。所以需要将wf2上的httpde配置文件scp到wf1的一个目录当中,并且监控,如果修改过的话,就要重启服务
在wf1上:
cd /srv/salt/apache
mkidr files
在wf2上:
scp /etc/httpd/conf/httpd.conf [email protected]:/srv/salt/apache/files
在wf1上:
cd /srv/salt/apache
vim install.sls
httpd:
pkg.installed:
- pkgs:
- httpd
- php
- php-mysql
service.running:
- name: httpd
- enable: True
- watch:
- file: /etc/httpd/conf/httpd.conf ##监控配置文件,如果修改,就重启服务
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://apache/files/httpd.conf
- mode: 644
- user: root
- group: root
salt wf2 state.sls apache.install
测试:
在wf1上:
cd /srv/salt/apache
cd files/
vim httpd.conf
Listen 8080 ##将端口改成8080
salt wf2 state.sls apache.install
在wf2上:
netstat -antlp ##可以看到http的端口改成了8080
5.开启服务和安装分开进行,编写两个sls文件
cd /srv/salt/apache
ls
vim install.sls
httpd:
pkg.installed:
- pkgs:
- httpd
- php
- php-mysql
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/files/httpd.conf
- mode: 644
- user: root
- group: root
vim service.sls
include:
- apache.install
apache-service:
service.running:
- name: httpd
- enable: True
- watch:
- file: apache-install
salt wf2 state.sls apache.install
6.在wf3上开启nginx服务 并将开启和安装分开进行,编写两个sls文件
(1).将nginx的服务器的配置文件scp到wf1上
scp /usr/local/nginx/conf/nginx.conf [email protected]:/srv/salt/nginx/files ##如果配置文件更改的话,将配置文件也发到虚拟机上去,然后覆盖原来的配置文件,注意,如果要更改配置文件的话,需要在master上更改,如果在minion上更改的话,在master执行salt操作的话,文件会被salt上的文件覆盖掉,更改的内容也就不见了。
(2)将nginx的安装包放在files目录下
cd /srv/salt/
mkdir nginx
mkdir nginx/files
mv nginx-1.14.0.tar.gz nginx/files
(3)将nginx的配置文件scp到wf1的nginx的files目录下
scp nginx.conf [email protected]:/srv/salt/nginx/files
(4)将开启服务的命令放到另一个sls的文件里
vim install.sls ##配置如下图
==================================================================================
注意:也可以将安装全部放在一个文件中,只需要调用就好了
cd /srv/salt
mkdir pkgs
cd pkgs
vim make.sls
pkg.installed:
- pkgs:
- gcc
- pcre-devel
- openssl-devel
==================================================================================
salt wf3 state.sls nginx.install
(5)安装nginx的发布目录
用已经编译好的nginx的发布的文件,放到默认发布目录下就好
mv nginx /etc/init.d
cd /etc/init.d
chmod +x nginx
测试一下,看发布文件能否使用:
/etc/init.d/nginx start
curl localhost ##出现nginx的页面就代表可以使用
/etc/init.d/nginx stop
scp nginx [email protected]:/srv/salt/nginx/files
在wf3上: ps ax ##查看执行的进程
7.高级推
cd /srv/salt
ls
vim top.sls
base:
"wf2":
- apache.service
"wf3":
- nginx.install
salt ‘*‘ state.highstate
salt ‘*‘ test.ping ## * 匹配的是salt里面的所有的远程主机
8.在wf1上下载salt-minion配置和wf2,3一样 让wf1做haproxy的服务器 用作负载均衡
salt-key -L
salt-key -a wf1
salt-key -L
cd /srv/salt/
ls
mkdir haproxy
cd haproxy/
mkdir files ##将haproxy的压缩包放在files文件中。
vim install.sls
vim service.sls
salt wf1 state.sls haproxy.install
cd ..
cd haproxy-1.6.11/examples
ls
cp haproxy.init content-sw-sample.cfg /srv/salt/haproxy/files/
cd /srv/salt/haproxy/files
mv content-sw-sample.cfg haproxy.cfg
mkdir users
cd users/
vim install.sls
haproxy-group:
group.present:
- name: haproxy
- group: 200
haproxy-user:
user.present:
- name: haproxy
- uid: 200
- gid: 200
- home: /usr/local/haproxy
- shell: /sbin/nologin
- createhome: False
cd ..
cd haproxy/
vim service.sls
- users.install
编辑haproxy的配置文件:如下图所示
vim top.sls
"wf1":
- haproxy.install
在wf2上编写http的默认发布文件:
cd /var/www/html/
ls
vim index.html
apache
在网页上测试,会出现轮询的效果: 172.25.254.1
9.拿取远端机器的数据:静态,动态
查看远端服务器的数据的命令:
salt wf2 grains.item os ##查看wf2的os的类型
salt wf2 grains.item ipv4 ##查看wf2的ip
salt -G ‘os:redhat‘ cmd.run hostname ##-G表示匹配 ‘os:redhat‘表示前面匹配所有红帽的系统 cmd表示匹配到一致的远端的服务器执行cmd后面的命令
更改信息的方式有两种:一在minion端改,二在master端改
(1)在minion端,有两种方法更改grains
方法一:在minion的配置文件中更改默认的roles值
cd /etc/salt/
ls
vim minion
grains:
roles:
- apache ##更改默认的roles的值
/etc/init.d/salt-minion restart ##因为是静态的更改配置文件,所以要重新启动服务
测试:在master上 salt wf2 grains.item roles
##可以看到刚更改的配置文件的数据
方法二:在minion端的salt下编写一个文件
cd /etc/salt
ls
vim grains
roles: nginx ##因为不是配置文件所以不需要重起
测试:在master端上 salt wf3 grains.item roles
##虽然编写了配置文件,但是master端没有识别这个文件,需要触发一下,模块刷一下
salt wf3 saltutil.sync_grains ##刷新
salt wf3 grains.item roles ##再次查看就可以看到信息
(2)在master端,有两种方法更改grains
##什么系统操作什么命令 role自定义角色
##无需重起,只需要在master上触发一下grains
方法一:编辑top.sls文件
top file中不需要匹配主机名,批量的配置服务器
vim top.sls
base:
"wf1":
- haproxy.service
"roles:apache":
- match: grain
- apache.install
"roles:nginx":
- match: grain
- nginx.service
方法二:在master端,编写py脚本 优点是:不需要登陆远程的服务端
mkdir _grains
cd _grains/
vim my_grains.py
#!/usr/bin/env python
def my_grains():
grains = {}
grains[‘hello‘] = ‘westos‘
grains[‘salt‘] = ‘stack‘
return grainsa
salt wf3 saltutil.sync_grains
测试:
在wf3处: cd /var/cache/salt -> tree . -> 将my文件传送了过来
在wf1处: salt wf3 grains.item hello/salt
==================================================================================
注意:如果同时编写了这些,那么这四个的优先级又是什么呢?
1.grains
2./etc/salt/grains
3./etc/salt/minion
4._grains/my_grains.py
==================================================================================
10.pillar
Pillar是在salt 0.9.8版本后才添加的功能组件。它跟grains的结构一样,也是一个字典格式,数据通过key/value的格式进行存储。在Salt的设计中,Pillar使用独立的加密sessiion,所以Pillar可以用来传递敏感的数据,例如ssh-key,加密证书等。
存储位置:存储在master端存放需要提供给minion的信息
应用场景:敏感信息:每个minion只能访问master分配给自己的信息
pillar的配置
在wf1上:
cd /etc/salt/
vim master
pillar_roots:
base:
- /srv/pillar
/etc/init.d/salt-master restart
mkdir /srv/pillar
cd /srv/pillar
mkdir web
cd web
vim install.sls
{% if grains[‘fqdn‘] == ‘wf2‘ %}
webserver: httpd
{% elif grains[‘fqdn‘] == ‘wf3‘ %}
webserver: nginx
{% endif %}
cd ..
vim top.sls
base:
‘*‘:
- web.install
测试: salt ‘*‘ pillar.items
salt ‘*‘ saltutil.refresh_pillar ##刷新
salt wf2/3 pillar.item webserver ##单独看的话,就查看不了,需要刷新
salt ‘*‘ saltutil.refresh_pillar ##刷新
salt wf2/3 pillar.item webserver ##刷新过后就可以查看
==================================================================================
注意:pillar的用法:-I 匹配 -S扫描整个网络
salt -I ‘webserver:httpd‘ test.ping
salt -S 172.25.254.0/24 test.ping
==================================================================================
11.JINJA在STATES中的使用 可以用于管理文件
(1)
cd /srv/salt/apache
vim install.sls
- template: jinja
- context:
port: 8080
bind: 172.25.254.2
vim files/httpd.conf
Listen {{ bind }}:{{ port }}
salt wf2 state.sls apache.install
测试:
在wf2上: netstat -antlp ##端口格式被修改
vim /etc/httpd/conf/httpd.conf ##配置文件中的格式也被修改了
(2)不足:bind的信息是手动加进去的,如果有很多的服务器,不可能一个一个手动添加
改进:
vim install.sls
bind: {{ grains[‘fqdn_ip4‘]}} ##将bind处修改
salt wf2 state.sls apache.install
测试:
在wf2上: netstat -antlp ##端口格式被修改
vim /etc/httpd/conf/httpd.conf ##配置文件中的格式也被修改了
但是却是列表的形式
接着改进:
bind: {{ grains[‘ipv4‘][1] }}
测试:
在wf2上: netstat -antlp ##端口格式被修改
vim /etc/httpd/conf/httpd.conf ##配置文件中的格式也被修改了
12.
vim files/httpd.conf
{% from ‘apache/lib.sls‘ import port with context%}
{% from ‘apache/lib.sls‘ import bind with context%}
cd /srv/salt/apache
vim lib.sls
{% set port = 8080 %}
{% set bind = ‘172.25.254.2‘ %}
13.
vim /srv/pillar/web/install.sls
{% if grains[‘fqdn‘] == ‘ww2‘ %}
webserver: httpd
port: 80
bind: 172.24.254.2
{% elif grains[‘fqdn‘] == ‘ww3‘ %}
webserver: nginx
% endif %}
vim files/httpd.conf
Listen {{ pillar[‘bind‘] }}:{{ pillar[‘port‘] }}
14.
cd /var/cache/salt/master/jobs
salt-run jobs.list_jobs ##查看执行过的命令
在wf2上:
yum install MySQL-python -y
cd /etc/salt
vim minion
mysql.host: ‘172.25.254.1‘
mysql.user: ‘salt‘
mysql.pass: ‘westos‘
mysql.db: ‘salt‘
mysql.port: 3306
/etc/init.d/salt-minion restart
在wf1上:
yum install mysql-server -y
/etc/init.d/mysqld start
mysql < add.sql
mysql
mysql> grant all on salt.* to [email protected]‘%‘ identified by ‘westos‘;
mysql> grant all on salt.* to [email protected]‘localhost‘ identified by ‘westos‘;
==================================================================================
下面是 add.sql 文件中的东西:
CREATE DATABASE `salt`
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
USE `salt`;
--
-- Table structure for table `jids`
--
DROP TABLE IF EXISTS `jids`;
CREATE TABLE `jids` (
`jid` varchar(255) NOT NULL,
`load` mediumtext NOT NULL,
UNIQUE KEY `jid` (`jid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#CREATE INDEX jid ON jids(jid) USING BTREE;
--
-- Table structure for table `salt_returns`
--
DROP TABLE IF EXISTS `salt_returns`;
CREATE TABLE `salt_returns` (
`fun` varchar(50) NOT NULL,
`jid` varchar(255) NOT NULL,
`return` mediumtext NOT NULL,
`id` varchar(255) NOT NULL,
`success` varchar(10) NOT NULL,
`full_ret` mediumtext NOT NULL,
`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
KEY `id` (`id`),
KEY `jid` (`jid`),
KEY `fun` (`fun`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Table structure for table `salt_events`
--
DROP TABLE IF EXISTS `salt_events`;
CREATE TABLE `salt_events` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`tag` varchar(255) NOT NULL,
`data` mediumtext NOT NULL,
`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`master_id` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `tag` (`tag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
==================================================================================
salt ‘*‘ test.ping --return mysql ##执行一条return命令
mysql
mysql> use salt
mysql> show tables;
mysql> select * from salt_returns; ##会有刚才测试的 test.ping 的记录
在wf1上:
yum install MySQL-python -y
cd /etc/salt
vim master
master_job_cache: mysql
mysql.host: ‘localhost‘
mysql.user: ‘salt‘
mysql.pass: ‘westos‘
mysql.db: ‘salt‘
mysql.port: 3306
/etc/init.d/salt-master restart
测试:
salt wf3 cmd.run hostname ##执行一条return命令
mysql
mysql> use salt
mysql> show tables;
mysql> select * from salt_returns; ##会有刚才测试的 test.ping 的记