saltstack
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了saltstack相关的知识,希望对你有一定的参考价值。
master:安装 salt-master
配置 /etc/salt/master
启动 salt-master
node:
安装 salt-minion
配置 /etc/salt/minion
master: master ip
id: node name
启动 salt-minion
#--------------------------#
master:
查看
salt-key -L
删除
salt-key -d nodename
添加
salt-key -a nodename
添加所有
salt-key -A -y
删除所有
salt-key -D
测试所有主机连通性
salt ‘*‘ test.ping
在任意主机上执行指令
salt ‘node1‘ cmd.run ‘ifconfig‘
salt ‘*‘ cmd.run ‘uptime‘
\d 匹配一个数字 \d+ 匹配 1..n 个数字
salt -E "node\d" test.ping
L 列表 后面跟随主机的名称,用 “,”分割
salt -L "node1,node3,node5" test.ping
使用分组
配置 /etc/salt/master
nodegroups:
group1: ‘[email protected],node5‘
重启 salt-master
salt -N group1 test.ping
通过 IP 掩码分组匹配
salt -S "192.168.4.13" test.ping
salt -S "192.168.4.0/24" test.ping
文件分发
mkdir -p /srv/salt/files
cd /srv/salt/files
创建要分发到节点的文件 testfile
执行分发指令
{指令} {目标主机匹配模式}{模块.指令}{源文件地址} {目标文件地址}
salt -N group1 cp.get_file salt://files/testfile /var/tmp/f1
验证
salt -N group1 cmd.run ‘md5sum /var/tmp/*‘
查看模块,功能和使用方法
列出所有模块
salt ‘node1‘ sys.list_modules
列出模块所有的方法
salt ‘node1‘ sys.list_functions test
查看模块帮助
salt ‘node1‘ sys.doc test
拷贝文件(相当于 ssh 到目的主机执行 cp)
salt -L ‘node1,node2‘ file.copy /etc/passwd /var/tmp/passwd
拷贝文件夹
salt -L ‘node1,node2‘ file.copy /etc/selinux /var/tmp/selinux recurse=True
验证结果:
salt ‘*‘ cmd.run ‘tree -L 2 /var/tmp‘
添加用户
salt ‘node3‘ user.add zhang3 2000
grains 模块
查看 节点 grains 的所有信息
salt ‘node1‘ grains.items
在节点上定义角色,配置节点上的 /etc/salt/minion
grains:
role: webserver
grains:
deployment: datacenter4
配置完以后要重启节点 salt-minion 服务
查看角色
salt ‘‘ grains.item role
salt ‘‘ grains.item deployment
通过 grains 查看节点系统是什么
salt ‘‘ grains.item os
查看系统ip网卡信息
salt ‘‘ grains.item ip4_interfaces
查询主机名
salt ‘*‘ grains.item fqdn
客户端的 grains 配置文件修改后,必须重启服务或刷新后才有效
重启服务
systemctl restart salt-minion
刷新服务
salt ‘*‘ saltutil.sync_grains
pillar 模块
修改 master 上的 pillar 相关配置 /etc/salt/master
pillar_roots:
base:
-
/srv/pillar
创建 pillar root 的根目录
mkdir -p /var/pillarpillar 的数据组织是使用 sls 的文件,入口文件是 top.sls
base:
‘node3‘: - data
- users
data.sls 文件
appname: website
flow:
maxconn: 3000
maxmem: 6G
users文件夹下默认的 init.sls 文件
users:
zhang3: 2000
li4: 2001
数据同步
salt ‘*‘ saltutil.refresh_pillar
获取所有pillar数据
salt ‘*‘ pillar.items
获取指定的数据
salt ‘*‘ pillar.item appname
根据 pillar 定义的数据匹配主机,执行
salt -I ‘appname:website‘ test.ping
jinja 模版
在state文件中使用"- template: jinja"声明使用 jinja 模版
在模版中变量是使用 {{name}} 表示
模版中支持循环,判断语句,使用格式
{% if ... %} ... ... {%endif%}
{%for ...%} ... ... {%endfor%}
按照用户纬度查询
注: 2015 版本有bug,查询有时候会出不来,升级到 2016 版,问题解决
salt ‘*‘ pillar.item ‘users:zhang3‘
salt -I ‘users:zhang3‘ test.ping
salt 模块 state
查看 state 所有模块
salt ‘node1‘ sys.list_state_modules
查看 state 模块方法
salt ‘node1‘ sys.list_state_functions modules_name
修改配置文件 /etc/salt/master
file_roots:
base:
- /srv/salt/base
dev: - /srv/salt/dev
prod: - /srv/salt/prod
创建对应的文件夹
mkdir -p /srv/salt/{base,dev,prod}
重启服务
systemctl restart salt-master
文件管理
更改 base 环境的 dns 配置,首先在 base 文件夹下创建入口文件 top.sls
目的1,修改 node1 的 resolv.conf 配置
目的2,给 node1,node4 的 issue 文件追加内容
base:
‘node1‘:
- dns
- issue
‘node4‘: - issue
‘[email protected],node3,node5‘ - rpm_pkgs
这里引用的 dns 配置文件 dns.sls 和 issue 追加配置文件 issue.sls
dns.sls
resolv_conf:
file.managed:
- name: /etc/resolv.conf
- source: salt://files/resolv.conf
- user: root
- group: root
- mode: 644
- template: jinja
- defaults:
DNS_IP: 192.168.113.254
这里指定了 source 文件在 files/resolv.conf,并且在配置中使用了 jinja 模版定义 dns_ip
创建files文件夹和 resolv.conf 文件
mkdir -p /srv/salt/bash/files
resolv.conf 文件
ameserver {{DNS_IP}}
issue.sls
issue_file:
file.append:
- name: /etc/issue
- text:
- Red Hat Enterprise Linux 7
- Tedu Ltd Server
创建文件夹 rpm_pkgs
配置文件 rpm_pkgs.sls
rpms:
file.directory:
- name: /opt/rpm_pkgs
- user: root
- group: root
- dir_mode: 755
- file_mode: 644
测试执行
salt ‘*‘ state.highstate saltenv=base test=True
运行
salt ‘*‘ state.highstate saltenv=base test=False
为 salt 添加执行的条件判断
unless 判断条件为【假】的时候执行
onlyif 判断条件为【真】的时候执行
例子:
添加用户,当用户不存在的时候执行添加操作
add_user.sls
useradd zhang3:
cmd.run:
- unless: id zhang3
删除用户,当用户 存在的时候执行删除操作
del_user.sls
userdel zhang3:
cmd.run:
- onlyif: id zhang3
在 top.sls 对应要增加或删除的机器上配置
base:
"node3":
- add_user
"node4": - del_user
项目1:
利用 salt 给多台机器实现下列功能:
配置多台minion的dns服务器地址为192.168.4.1
配置history命令显示时间
配置系统内核参数 net.ipv4.ip_forward 打开路由转发
创建用户zhang3
设置初始化密码为123456
配置用户初次登陆必须修改密码
分析:
初始化的工作比较多,写入一个文件比较凌乱,设计一个初始化模块 init
在模块下分别配置 dns,sysctl, history, adduser 实现
创建 init 文件夹
mkdir /srv/salt/base/init
进入这个文件夹
cd /srv/salt/base/init
配置 dns
dns.sls
resolv_conf:
file.managed:
- name: /etc/resolv.conf
- source: salt://init/files/resolv.conf
- user: root
- group: root
- mode: 644
- template: jinja
- defaults:
DNS_IP: 192.168.4.1
创建文件夹
mkdir files
配置 files/resolv.conf 文件
nameserver {{DNS_IP}}
配置 history.sls 增加时间
history_file:
file.append:
- name: /etc/profile
- text:
- export HISTTIMEFORMAT="[%F_%T]:"
配置 sysctl.sls 开启路由转发
net.ipv4.ip_forward:
sysctl.present:
- value: 1
配置 add_user.sls
添加用户
useradd zhang3:
cmd.run:
- unless: id zhang3
设置默认密码
echo 123456 | passwd --stdin zhang3:
cmd.run:
- onlyif: id zhang3
设置初次登录修改密码策略
chage -d0 zhang3:
cmd.run:
- onlyif: id zhang3
配置入口文件 top.sls
base:
‘[email protected],node3,node4‘:
- init/dns
- init/history
- init/sysctl
- init/add_user
测试执行
salt ‘*‘ state.highstate saltenv=base test=True
运行
salt ‘*‘ state.highstate saltenv=base test=False
安装部署软件,使用 pkg 模块,这次使用 prod 环境部署
首先根据 /etc/salt/master 里面定义的路径创建 prod 的根目录
mkdir -p /srv/salt/prod
cd /srv/salt/prod
创建入口文件: top.sls
prod:
‘[email protected],node5‘:
- httpd
创建 httpd.sls 文件
httpd_pkg_installd:
pkg.installed:
- name: httpd
httpd_conf:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://files/httpd.conf
- template: jinja
- defaults:
PORT: 80 - require:
- pkg: httpd_pkg_installd
httpd_service_running:
service.running:
- name: httpd
- enable: true
- restart: true
- watch:
- file: httpd_conf
创建 files 文件夹,并编辑 httpd.conf 的配置文件
mkdir files
修改 httpd.conf 配置文件
Listen {{ PORT }}
ServerName local
测试执行
salt ‘*‘ state.highstate saltenv=prod test=True
运行
salt ‘*‘ state.highstate saltenv=prod test=False
以上就完成了 批量 安装 部署软件、批量修改配置文件,批量设置服务状态并且运行服务
nginx 源码编译安装,这次使用 dev 环境
1、编译源码包需要安装依赖 gcc gcc-c++ make autoconf prce-devel openssl-devel
创建 initpkg 文件夹,配置 pkg_install.sls 安装所需要的依赖包
mkdir initpkg ; pkg_install.sls
init_pkg_install:
pkg.installed:
- names:
- gcc
- gcc-c++
- make
- autoconf
- openssl-devel
- pcre-devel
2、创建 nginx 文件夹,用于配置安装 nginx 相关文件
mkdir /srv/salt/dev/nginx
创建 files 用于存放 nginx 的源文件和 服务启动文件
mkdir /srv/salt/dev/nginx/files
把 nginx 的源和 nginx的服务启动文件拷贝过去
cp /tmp/nginx-1.9.12.tar.gz /srv/salt/dev/nginx/files/
cp /tmp/nginx.service /srv/salt/dev/nginx/files/
编写 nginx 的编译安装文件 nginx_install.sls
include:
- initpkg.pkg_install
nginx_src_install:
file.managed:- name: /usr/local/src/nginx-1.9.12.tar.gz
- source: salt://nginx/files/nginx-1.9.12.tar.gz
- user: root
- group: root
- mode: 644
cmd.run: - name: useradd -s /sbin/nologin nginx && cd /usr/local/src && tar xzf nginx-1.9.12.tar.gz && cd nginx-1.9.12 && ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
- unless: test -d /usr/loca/nginx
- require:
- file: nginx_src_install
- pkg: init_pkg_install
nginx_init:
file.managed:
- name: /usr/lib/systemd/system/nginx.service
- source: salt://nginx/files/nginx.service
- user: root
- group: root
- mode: 644
cmd.run: - name: systemctl daemon-reload
nginx_service:
service.running:
- name: nginx
- enable: true
- restart: true
最后编辑入口文件 top.sls
dev:
‘[email protected],node3,node4‘:
- initpkg.pkg_install
- nginx.nginx_install
测试执行
salt ‘*‘ state.highstate saltenv=dev test=True
运行
salt ‘*‘ state.highstate saltenv=dev test=False
/srv/salt/dev 目录结构如下
/srv/salt/dev
├── initpkg
│ └── pkg_install.sls
├── nginx
│ ├── files
│ │ ├── nginx-1.9.12.tar.gz
│ │ └── nginx.service
│ └── nginx_install.sls
└── top.sls
执行后等待几分钟就可以看到 nginx 在服务器上已经正确启动运行了
以上是关于saltstack的主要内容,如果未能解决你的问题,请参考以下文章
首发分析 | SaltStack远程执行代码多个高危漏洞透析(CVE-2021-25281/25282/25283)
漏洞告警SaltStack多个高危漏洞(CVE-2021-25281/25282/25283)