企业运维实战--自动化运维Saltstack(上)
前言
在运维工作中,系统管理员日常会进行大量的重复性操作,例如安装软件,修改配置文件等,单靠人工去实现数量庞大的工作是效率极低的。于是我们有了自动化运维工具,,目前比较流行的有ansible、saltstack和puppet。
puppet是由rudy语言编写的,起初的使用率非常高,随着python语言的应用更加广泛,基于python语言编写的ansible和saltstack也越来越流行。
Saltstack为server-client模式的系统(在salstack中叫Master-Minion),自己本身支持多master。saltstack除了可以通过在节点安装客户端进行管理还支持直接通过ssh进行管理。运行模式为master端下发指令,客户端接收指令执行。
saltstack依赖于zeromq消息队列,采用yaml格式编写配置文件,比较简单。
支持api及自定义python模块,能轻松实现功能扩展。
Ansible类似与saltstack,基于python开发,关注的重点是精简和快速。不需要在节点安装代理软件,通过ssh执行所有功能。安装运行简单。
其模块可以用任何语言开发,采用yaml格式编写配置文件。
没有客户端,较难扩展。
详细ansible学习教程可参考本人博客:
Ansible–1.Ansible的安装及部署
Ansible–2.Ansible中的常用模块
Ansible–3.使用Ansible中的playbook
Ansible–4.Ansible中的变量及加密
Ansible–5.Ansible中的任务执行控制
Ansible–6.Ansible中的角色使用
本章我们主要介绍saltstack自动化运维的知识,主要内容包括saltstack的安装部署、远程执行、grains和pillar详解以及Jinja模板。
一、Saltstack安装部署
环境介绍:三台rhel7.6虚拟机,server1负责saltstack-master端,server2\3负责saltstack-minion端。
火墙与selinux均关闭。
server1:
配置软件仓库
vim /etc/yum.repos.d/salt.repo
yum repolist
yum list salt-*
cat /etc/yum.repos.d/salt.repo
[salt]
name=salt 3000
baseurl=http://172.25.9.254/saltstack
gpgcheck=0
server2、3配置软件仓库
scp /etc/yum.repos.d/salt.repo server2:/etc/yum.repos.d/
scp /etc/yum.repos.d/salt.repo server3:/etc/yum.repos.d/
server1端安装salt-master,并开启服务,查看端口4505和4506是否开启
yum install -y salt-master.noarch
systemctl enable --now salt-master.service
netstat -antlp
server2\3:
安装salt-minion
yum repolist
yum list salt-*
yum install -y salt-minion.noarch
vim /etc/salt/minion
master: 172.25.9.1
修改完配置文件后开启服务
systemctl enable --now salt-minion.service
添加minion端,信任
salt-key -L #查看清单
salt-key -A #添加所有主机到信任清单,-a可指定单个添加
salt-key -L
查看salt-key 更多用法
salt-key --help
测试: ping minion端
salt '*' test.ping
yum install -y lsof
端口使用状况查看
lsof -i :4505
lsof -i :4506
默认4505端口开启并指向minion端,连接方式为established。
注意:
monion端修改主机名后,需要删除/etc/salt/minion_id 否则master端会一直显示之前的主机名
附加:
ps ax 显示python进程简要作用
yum list python-*
yum install -y python-setproctitle.x86_64
systemctl restart salt-master.service
ps ax
二、sls文件远程执行
salt支持通配符
salt server? test.ping
使用cmd.run模块查看远程主机系统名和系统信息
salt server2 cmd.run uname
salt server2 cmd.run 'uname -a'
使用pkg模块安装httpd服务
salt server2 pkg.install 'httpd'
pkg查看httpd版本
salt server2 pkg.version 'httpd'
创建salt自定义模板目录
mkdir -p /srv/salt/_modules
cd /srv/salt/_modules
创建自动逸模板
vim my_disk.py
同步自定义模板到server2
salt server2 saltutil.sync_modules
进入server2中查看
执行模块
salt server2 my_disk.df
saltstack安装httpd并启动
编写.sls文件,为了规范起见,我们采用目录将一类操作的.sls文件归类,操作时可直接指定目录名,默认读取init.sls文件
mkdir apache
cd apache/
vim init.sls
apache:
pkg.installed:
- pkgs:
- httpd
- php
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/httpd.conf
service.running:
- name: httpd
- enable: true
- reload: true
- watch:
- file: apache
执行文件,在server2上安装apache
salt server2 state.sls apache
vim httpd.conf # 修改端口后触发watch
再次执行
salt server2 state.sls apache
查看端口修改情况
saltstack源码编译安装nginx
先创建目录
vim init.sls
nginx-install:
pkg.installed:
- pkgs:
- gcc
- pcre-devel
- openssl-devel
file.managed:
- name: /mnt/nginx-1.20.1.tar.gz
- source: salt://nginx/nginx-1.20.1.tar.gz
cmd.run:
- name: cd /mnt && tar zxf nginx-1.20.1.tar.gz && cd nginx-1.20.1 && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --with-http_ssl_module --with-threads --with-file-aio &> /dev/null && make &> /dev/null && make install &> /dev/null
- creates: /usr/local/nginx
执行后结果
启动服务nginx
vim service.sls
include:
- nginx
nginx-user:
user.present:
- name: nginx
- shell: /sbin/nologin
- home: /usr/local/nginx
- createhome: false
/usr/local/nginx/conf/nginx.conf:
file.managed:
- source: salt://nginx/nginx.conf
nginx-service:
file.managed:
- name: /usr/lib/systemd/system/nginx.service
- source: salt://nginx/nginx.service
service.running:
- name: nginx
- enable: true
- reload: true
- watch:
- file: /usr/local/nginx/conf/nginx.conf
执行结果
三、grains自带主机信息以及pillar
查看模块
salt server2 grains.ls
salt server2 grains.items
查看ip
salt server2 grains.item ipv4
三种添加角色的方式。两种来自minion端,一种再master端
minion端:
修改主配
vim /etc/salt/monion
修改完后记得重启minion服务
查看角色
salt server2 grains.item roles
添加文件
vim /etc/salt/grains
roles: nginx
查看server3模板
salt server3 grains.item roles
刷新并查看所有角色
salt '*' saltutil.sync_grains
salt server? grains.item roles
mkdir _grains
cd _grains/
vim grains.py
cat grains.py
#!/usr/bin/env python
def grains():
grains = {}
grains['hello'] = 'world'
grains['salt'] = 'stack'
return grains
salt '*' saltutil.sync_grains
#同步修改到minion
salt server? grains.item hello
vim grains.py
不同节点执行不同角色策略
vim top.sls
base:
'server2':
- apache
'server3':
- nginx.service
highstate执行top
salt '*' state.highstate
四、jinja模板使用
模板使用小测试test
vim /srv/salt/test.sls
/mnt/testfile:
file.append:
{% if grains['fqdn'] == 'server2' %}
- text: server2
{% elif grains['fqdn'] == 'server3' %}
- text: server3
{% endif %}
vim /srv/salt/apache/init.sls
apache:
pkg.installed:
- pkgs:
- {{ pillar['package'] }}
service.running:
- name: httpd
- enable: true
- reload: true
- watch:
- file: /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://apache/httpd.conf
salt '*' state.sls apache
执行后查看minion端/mnt/testfile
为httpd服务添加并修改端口
vim /srv/pillar/pkgs.sls
{% if grains['fqdn'] == 'server2' %}
package: httpd
port: 80
{% elif grains['fqdn'] == 'server3' %}
package: httpd
port: 8080
{% endif %}
vim /srv/pillar/top.sls
base:
'*':
- pkgs
查看pillar是否配置成功
salt '*' pillar.items
vim apache/init.sls
apache:
pkg.installed:
- pkgs:
- {{ pillar['package'] }}
service.running:
- name: httpd
- enable: true
- reload: true
- watch:
- file: /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://apache/httpd.conf
- template: jinja
- context:
http_port: {{ pillar['port']}}
http_host: {{ grains['ipv4'][-1]}}
调用已经定义的变量
vim httpd.conf
Listen {{ http_host}}:{{ http_port }}
salt '*' state.sls apache
执行成功无报错,查看httpd端口修改成功