【saltstack】saltstack自动化运维(master与minion配置、远程执行、sls文件、modules、grains、jinja、pillar)

一、saltstack简介

模块-官网文档:http://docs.saltstack.cn/ref/modules/all/index.html#all-salt-modules

saltstack简介

  • saltstack是一个配置管理系统,能够维护预定义状态的远程节点。
  • saltstack是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据。
  • saltstack是运维人员提高工作效率、规范业务配置与操作的利器。

saltstack通信机制

  • SaltStack 采用 C/S模式,minion与master之间通过ZeroMQ消息队列通信,默认监听4505端口。
    在这里插入图片描述

  • Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听4506端口(请求响应端口)。
    在这里插入图片描述

特点

  • 基于python开发的C/S架构配置管理工具
  • 底层使用ZeroMQ消息队列pub/sub方式通信
  • 使用SSL证书签发的方式进行认证管理,传输采用AES加密

服务架构

  • 服务器端:Master
  • 客户端:Minion

功能

  • 远程执行
  • 配置管理/状态管理
  • 云管理(cloud)
  • 事件驱动

运行方式

  • local本地运行
  • Master/Minion传统方式
  • Syndic分布式
  • Salt ssh

配置文件

  • /etc/salt/master:主控端(控制端)配置文件
  • /etc/salt/minion:受控端配置文件

二、安装与配置

master端:
server1:172.25.2.1

minion端:
server2:172.25.2.2
server3:172.25.2.3

01_minion端配置

  • 配置软件仓库
    vim /etc/yum.repos.d/salt-3000.repo
[salt-3000]
name=SaltStack 3000 Release Channel for Python 2 RHEL/Centos $releasever
baseurl=https://mirrors.aliyun.com/saltstack/yum/redhat/7/$basearch/3000
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/saltstack-signing-key, file:///etc/pki/rpm-gpg/centos7-signing-key
  • 安装salt-minion
    yum install -y salt-minion
  • 设置对应的master端
    vim /etc/salt/minion
 16 master: 172.25.2.1
  • 开启服务
    systemctl enable --now salt-minion
  • 每次修改主机名后,都要删除/etc/salt/minion_id此文件,并修改解析

02_master端配置

  • 配置软件仓库
    yum install https://repo.saltstack.com/yum/redhat/salt-repo-3000.el7.noarch.rpm
    sed -i "s/repo.saltstack.com/mirrors.aliyun.com\/saltstack/g" /etc/yum.repos.d/salt-3000.repo
  • 查看仓库文件
    cat /etc/yum.repos.d/salt-3000.repo
[salt-3000]
name=SaltStack 3000 Release Channel for Python 2 RHEL/Centos $releasever
baseurl=https://mirrors.aliyun.com/saltstack/yum/redhat/7/$basearch/3000
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/saltstack-signing-key, file:///etc/pki/rpm-gpg/centos7-signing-key
  • 安装salt-master
    yum install -y salt-master
  • 开启服务
    systemctl enable --now salt-master
    在这里插入图片描述
  • 认证
    salt-key -A:接受所有minion等待认证的key
    salt-key -L:列出所有公钥信息
-a minion#接受指定minion等待认证的key
-r minion#拒绝指定minion等待认证的key
-R#拒绝所有minion等待认证的key

在这里插入图片描述

03_远程测试

  • 查看端口及进程
    yum install -y lsof#可以显示监听端口详细信息
    yum install -y python-setproctitle#可以显示进程详细信息
    systemctl restart salt-master.service
    在这里插入图片描述
    在这里插入图片描述
  • 测试

salt '*' test.ping
salt '*' cmd.run hostname
salt '*' cmd.run 'uname -a'

在这里插入图片描述

三、远程执行shell命令

salt '*' cmd.run 'uname -a' :查看内核相关内容
salt 'server2' sys.doc pkg :查看模块文档
salt 'server2' pkg.install httpd :安装apache
salt 'server2' pkg.remove httpd :卸载apache

http://docs.saltstack.cn/ref/modules/all/index.html

salt 'server2' sys.doc pkg:查看模块文档

  • 测试httpd
#安装httpd
salt server2 pkg.install httpd
#列出安装包
salt server2 cmd.run 'rpm -q httpd'
##开启服务
salt server2 service.start httpd

在这里插入图片描述

  • 复制文件
echo server2 > index.html
salt-cp server2 index.html /var/www/html/

在这里插入图片描述

四、编写.sls文件

  • 规则一: 缩进
    Salt需要每个缩进级别由两个空格组成,不要使用tabs。
  • 规则二: 冒号
    字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。
    my_key: my_value
  • 规则三: 短横杠
    想要表示列表项,使用一个短横杠加一个空格。
    list_value_one
    list_value_two

mkdir -p /srv/salt/apache/files
mv index.html /srv/salt/apache/files

01_安装单个软件包

方法一:

vim /srv/salt/apache/install.sls

httpd:
  pkg.installed

salt server2 state.sls apache.install
在这里插入图片描述方法二:

vim /srv/salt/apache/install.sls

apache:
  pkg.installed:
    - name: httpd

salt server2 state.sls apache.install
在这里插入图片描述

02_安装多个软件包

vim /srv/salt/apache/install.sls

apache:
  pkg.installed:
    - pkgs:
      - httpd
      - php
      - php-mysql

salt server2 state.sls apache.install
在这里插入图片描述

03_文件管理

vim /srv/salt/apache/install.sls

apache:
  pkg.installed:
    - pkgs:
      - httpd
      - php
      - php-mysql
  file.managed:
    - source: salt://apache/files/index.html
    - name: /var/www/html/index.html

salt server2 state.sls apache.install
在这里插入图片描述

  • 改变发布测试页内容

vim /srv/salt/apache/files/index.html

server2
server2
server2

salt server2 state.sls apache.install 发生变化
在这里插入图片描述

04_服务管理

整合方法:
vim /srv/salt/apache/install.sls

apache:
  pkg.installed:
    - pkgs:
      - httpd
      - php
      - php-mysql
  file.managed:
    - source: salt://apache/files/index.html
    - name: /var/www/html/index.html
  service.running:
    - name: httpd

salt server2 state.sls apache.install
在这里插入图片描述
分开方法
vim /srv/salt/apache/install.sls

apache:
  pkg.installed:
    - pkgs:
      - httpd
      - php
      - php-mysql

/var/www/html/index.html:
  file.managed:
    - source: salt://apache/files/index.html

httpd:
  service.running

salt server2 state.sls apache.install
在这里插入图片描述

  • 修改端口
    方法一:
    cp /etc/httpd/conf/httpd.conf apache/files/:复制模板文件

vim apache/files/httpd.conf:修改端口检测
在这里插入图片描述

vim /srv/salt/apache/install.sls

apache:
  pkg.installed:
    - pkgs:
      - httpd
      - php
  file.managed:
    - source: salt://apache/files/index.html
    - name: /var/www/html/index.html
  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/files/httpd.conf

salt server2 state.sls apache.install
在这里插入图片描述

server2 测试

在这里插入图片描述
方法二:
vim /srv/salt/apache/install.sls

apache:
  pkg.installed:
    - pkgs:
      - httpd
      - php
  file.managed:
    - source: salt://apache/files/httpd.conf
    - name: /etc/httpd/conf/httpd.conf
  service.running:
    - name: httpd
    - enable: true
    - watch:
        - file: apache

salt server2 state.sls apache.install

五、编写远程执行模块 _modules

  • mkdir /srv/salt/_modules:创建模块目录
  • vim _modules/mydisk.py:编写模块
def df():
    return __salt__['cmd.run']('df -h')
  • salt server2 cmd.run df
    在这里插入图片描述
  • salt server2 saltutil.sync_modules:同步模块
    在这里插入图片描述
  • 同步后可在minion主机的 /var/cache/salt/minion/extmods/modules/ 查看到

六、grains配置(存放在minion端)

  • Grains是SaltStack的一个组件,存放在SaltStack的minion端。
  • 当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。
  • 由于grains是静态数据,因此不推荐经常去修改它。

应用场景:

  • 信息查询,可用作CMDB。
  • 在target中使用,匹配minion。
  • 在state系统中使用,配置管理模块。

master端查看信息

#列出每一项
salt server2 grains.ls
#查看每一项的具体值
salt server2 grains.items
#查看单项的值
salt server2 grains.item ipv4
salt server2 grains.item fqdn

在这里插入图片描述在这里插入图片描述

01_minion端添加grains

server2和server3方法均可适用

server2

  • 编辑配置文件
    vim /etc/salt/minion
129 grains:
130   roles:
131     - apache
  • 重启服务
    systemctl restart salt-minion
    在这里插入图片描述

server3

  • 编辑配置文件
    vim /etc/salt/grains
129 grains:
130   roles:
131     - apache
  • 同步server3数据
    salt server3 saltutil.sync_grains
    在这里插入图片描述
  • 查询自定义项
    在这里插入图片描述

02_编写grains模块

在server1

  • 建立文件夹
    mkdir /srv/salt/_grains
  • 编辑grains模块
    vim /srv/salt/_grains/mygrains.py
def my_grains():
    grains = {}
    grains['salt'] = 'stack'
    grains['hello'] = 'world'
    return grains
  • 同步grains模块到minion端
    salt '*' saltutil.sync_grains
    在这里插入图片描述

  • 列出grains
    在这里插入图片描述

03_grains匹配运用

  • 在target中匹配minion
salt -G roles:apache cmd.run hostname
salt -G roles:nginx test.ping
salt -G salt:stack test.ping
salt -G hello:world test.ping

在这里插入图片描述

  • top.sls文件匹配

1 mkdir -p /srv/salt/nginx/files/

[root@server1 salt]# ls nginx/files/
nginx-1.18.0.tar.gz

2 vim /srv/salt/top.sls

base:
  'roles:apache':
    - match: grain
    - apache
  'roles:nginx':
    - match: grain
    - nginx

3 vim /srv/salt/nginx/init.sls

nginx:
  file.managed:
    - source: salt://nginx/files/nginx-1.18.0.tar.gz
    - name: /mnt/nginx-1.18.0.tar.gz

4 salt '*' state.highstate:读取所有环境的top.sls文件

在这里插入图片描述

七、nginx应用

  1. cd /src/salt/
  2. vim nginx/files/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
  1. vim nginx/install.sls
nginx-install:
  pkg.installed:
    - pkgs:
      - gcc
      - pcre-devel
      - openssl-devel
  file.managed:
    - source: salt://nginx/files/nginx-1.18.0.tar.gz
    - name: /mnt/nginx-1.18.0.tar.gz
  cmd.run:
    - name: cd /mnt && tar zxf nginx-1.18.0.tar.gz && cd nginx-1.18.0 && ./configure --prefix=/usr/local/nginx --with-http_ssl_module &> /dev/null && make &> /dev/null && make install &> /dev/null
    - creates: /usr/local/nginx
  1. vim nginx/init.sls
include:
  - nginx.install

/usr/local/nginx/conf/nginx.conf:
  file.managed:
    - source: salt://nginx/files/nginx.conf

nginx-service:
  user.present:
    - name: nginx
    - shell: /sbin/nologin
    - home: /usr/local/nginx
    - createhome: false
  file.managed:
    - source: salt://nginx/files/nginx.service
    - name: /usr/lib/systemd/system/nginx.service
  service.running:
    - name: nginx
    - enable: true
    - reload: true
    - watch:
      - file: /usr/local/nginx/conf/nginx.conf
  1. salt server3 state.sls nginx.install
  2. scp server3:/usr/local/nginx/conf/nginx.conf nginx/files/
  3. vim nginx/files/nginx.conf
user  nginx;
  1. salt server3 state.sls nginx
  2. salt '*' state.highstate

八、jinja模板

  • 定义:{% XXX %}
  • 引用:{{ XXX }}

01_示例

  1. vim test.sls
/mnt/testfile:
  file.append:
    {% if grains['fqdn'] == 'server2' %}
    - text: server2
    {% elif grains['fqdn'] == 'server3' %}
    - text: server3
    {% endif %}
  1. salt '*' state.sls test
  2. 查看实验结果
    在这里插入图片描述
    在这里插入图片描述

02_apache结合jinja模板

  1. cd /src/salt/
  2. vim apache/init.sls
apache:
  pkg.installed:
    - pkgs:
      - httpd
  file.managed:
    - source: salt://apache/files/httpd.conf
    - name: /etc/httpd/conf/httpd.conf
    - template: jinja
    - context:
      port: 80
      bind: {{ grains['ipv4'][-1] }}
  service.running:
    - name: httpd
    - enable: true
    - watch:
        - file: apache
/var/www/html/index.html:
  file.managed:
    - source: salt://apache/files/index.html
    - template: jinja
    - context:
      NAME: {{ grains['ipv4'][-1] }}
  1. vim apache/files/index.html
{{ grains['os'] }} - {{ grains['fqdn'] }}
{{ NAME }}
  1. vim apache/files/httpd.conf
Listen {{ bind }}:{{ port }}
  1. salt server2 state.sls apache
  2. 在minion端查看实验结果
    在这里插入图片描述

九、pillar

官方文档

01_pillar简介

  • pillar和grains-样也是一个数据系统,但是应用场景不同。
  • pillar是将信息动态的存放在master端,主要存放私密、敏感信息(如用户名密码等),而且可以指定某一个minion才
    可以看到对应的信息。
  • pillar更加适合在配置管理中运用

02_常用命令

  • 刷新pillar数据

salt '*' saltutil.refresh_pillar

  • 查询pillar数据

salt '*' pillar.items

salt '*' pillar.item XXX

  • 数据匹配

salt -I XXX:XXX test.ping

03_定义pillar

  • 创建pillar默认目录
    mkdir /srv/pillar
  • 自定义pillar项
    vim /srv/pillar/package.sls
{% if grains['fqdn'] == 'server3' %}
package: httpd
{% elif grains['fqdn'] == 'server2' %}
package: mairadb
{% endif %}

vim /srv/pillar/top.sls

base:
  '*':
    - package
  • 刷新pillar数据

salt '*' saltutil.refresh_pillar

  • 查询pillar数据

salt '*' pillar.items不刷新就可查询到

salt '*' pillar.item package必须刷新才可查询

  • 数据匹配

salt -I package:httpd test.ping
在这里插入图片描述

04_应用于apache

  1. vim /srv/pillar/package.sls
{% if grains['fqdn'] == 'server3' %}
package: nginx
{% elif grains['fqdn'] == 'server2' %}
port: 8080
bind: 172.25.2.2
{% endif %}
  1. vim /srv/salt/apache/init.sls
apache:
  pkg.installed:
    - pkgs:
      - httpd
  file.managed:
    - source: salt://apache/files/httpd.conf
    - name: /etc/httpd/conf/httpd.conf
    - template: jinja
    - context:
      port: {{ pillar['port'] }}
      bind: {{ pillar['bind'] }}
  service.running:
    - name: httpd
    - enable: true
    - watch:
        - file: apache
/var/www/html/index.html:
  file.managed:
    - source: salt://apache/files/index.html
    - template: jinja
    - context:
      NAME: {{ grains['ipv4'][-1] }}
  1. vim /srv/salt/apache/files/httpd.conf
Listen {{ bind }}:{{ port }}
  1. salt server2 state.sls apache
    在这里插入图片描述

05_应用于jinja模板import导入变量

1 vim /srv/salt/apache/lib.sls

{% set port = 80 %}

2 vim /srv/salt/apache/files/httpd.conf

{% from 'apache/lib.sls' import port %}#做完实验删除
Listen {{ bind }}:{{ port }}

3 salt server2 state.sls apache
发现在/srv/pillar/package.sls/srv/salt/apache/lib.sls都定义了port变量,最后读取的才被使用,lib.sls的port80被使用
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值