saltstack自动化运维管理--远程部署apache/nginx、grains数据系统、Jinja模板

1、saltstack安装与配置

官方文档:http://docs.saltstack.cn/
saltsack是一个配置管理系统,能够维护预定义状态的远程节点;是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据。

[root@server1 ~]# yum install https://repo.saltstack.com/yum/redhat/salt-repo-3000.el7.noarch.rpm 
[root@server1 ~]# yum list salt-*
[root@server1 ~]# yum install -y salt-master.noarch
[root@server1 ~]# systemctl enable --now salt-master.service 
[root@server1 ~]# netstat -antlp

saltstack采用C/S模式,minion与master之间通过ZeroMQ消息队列通信,默认监听4505端口。
每个节点安装minion端通过消息队列订阅数据,master发布数据,所有端口通过4505拿到数据,是并行的。4505做消息队列的发布和订阅系统。
4506端口是请求响应端,当客户端执行结束后,想知道结果,通过4506端口反馈。
在这里插入图片描述

minion端配置
server2 server3做同样的配置
[root@server1 yum.repos.d]# scp salt-3000.repo server2:/etc/yum.repos.d/
[root@server2 yum.repos.d]# vim salt-3000.repo 
gpgcheck=0
[root@server2 ~]# sed -i "s/repo.saltstack.com/mirrors.aliyun.com\/saltstack/g" /etc/yum.repos.d/salt-3000.repo
[root@server2 ~]# cat /etc/yum.repos.d/salt-3000.repo
[root@server2 ~]# yum install -y salt-minion.noarch
[root@server2 ~]# cd /etc/salt/
[root@server2 salt]# vim minion
16 master: 192.168.0.1
[root@server2 salt]# systemctl enable --now salt-minion.service
[root@server3 salt]# systemctl enable --now salt-minion.service 

[root@server1 ~]# netstat -antlp
tcp        0      0 192.168.0.1:4506        192.168.0.2:58004       ESTABLISHED 3565/python        
tcp        0      0 192.168.0.1:4506        192.168.0.3:33720       ESTABLISHED 3565/python         

在这里插入图片描述

master端执行命令允许minion连接
[root@server1 ~]# yum install -y lsof
[root@server1 ~]# salt-key -L  ##列出
[root@server1 ~]# salt-key -A ##允许所有
[root@server1 ~]# salt-key -L
[root@server1 ~]# netstat -antlp
tcp        0      0 192.168.0.1:4505        192.168.0.2:50796       ESTABLISHED 3559/python         
tcp        0      0 192.168.0.1:4505        192.168.0.3:52172       ESTABLISHED 3559/python      
[root@server1 ~]# lsof -i :4505
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
salt-mast 3559 root   15u  IPv4  31266      0t0  TCP *:4505 (LISTEN)
salt-mast 3559 root   17u  IPv4  87974      0t0  TCP server1:4505->server2:50796 (ESTABLISHED)
salt-mast 3559 root   18u  IPv4  87975      0t0  TCP server1:4505->server3:52172 (ESTABLISHED)

在这里插入图片描述

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

master端执测试与minion的连接
[root@server1 ~]# salt '*' test.ping  ##test 调用的模块 ping 模块内的ping方法
[root@server1 ~]# salt '*' cmd.run "ip addr"
[root@server1 ~]# salt '*' cmd.run hostname
[root@server1 ~]# salt server2 test.ping
[root@server1 ~]# salt server* test.ping
[root@server1 ~]# salt server? test.ping
[root@server1 ~]# salt server[23] test.ping

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

执行过的命令都被保存,默认缓存是24小时,

[root@server1 salt]# cd /var/cache/salt/
[root@server1 salt]# ls
master
[root@server1 salt]# cd master/
[root@server1 master]# ls
jobs  minions  proc  queues  roots  syndics  tokens
[root@server1 master]# cd jobs/
[root@server1 jobs]# ls
43  5b  8f  bb
[root@server1 ~]# yum install -y python-setproctitle.x86_64
[root@server1 ~]# systemctl restart salt-master.service 
[root@server1 ~]# ps ax #查看进程

[root@server2 salt]# pwd
/etc/salt
[root@server2 salt]# ls
cloud         cloud.deploy.d  cloud.profiles.d   master    minion    minion_id  proxy    roster
cloud.conf.d  cloud.maps.d    cloud.providers.d  master.d  minion.d  pki        proxy.d
[root@server2 salt]# cat minion_id 
server2

minion_id:启动minion后,会产生主机名文件,更改主机名后,要删除这个文件,每次启动时都会用原来生成的文件id去连接master,不删除文件的话,会读取这个文件,更改主机名后会不生效。删除后重启,会自动以当前主机名生成新的文件。
在这里插入图片描述

2、saltstack远程执行

salt 命令由三个主要部分构成:salt'<target>'<funcation>[arguments]
target: 指定哪些minion, 默认的规则是使用glob匹配minion id.
# salt '*' test.ping
Targets也可以使用正则表达式:
# salt -E 'server[1-3]' test.ping
Targets也可以指定列表:
# salt -L 'server2,server3' test.ping

funcation是module提供的功能,Salt内置了大量有效的functions.
# salt '*' cmd.run 'uname -a'

arguments通过空格来界定参数.
# salt 'server2' sys.doc pkg			#查看pkg模块文档
# salt 'server2' sys.doc pkg | grep pkg.install
# salt 'server2' pkg.install httpd
# salt 'server2' pkg.remove httpd
salt内置的执行模块列表:
http://docs.saltstack.cn/ref/modules/all/index.html
[root@server1 ~]# salt server2 pkg.install httpd
[root@server1 ~]# salt server2 cmd.run 'rpm -q httpd'
[root@server1 ~]# salt 'server2' sys.doc service   ###查看service模块文档
[root@server1 ~]# salt 'server2' service.start httpd
[root@server1 ~]# vim index.html
server2
[root@server1 ~]# salt-cp server2 index.html /var/www/html
[root@server1 ~]# curl server2
server2
[root@server1 ~]# salt server2 file.stats /var/www/html/index.html

在这里插入图片描述

在这里插入图片描述

配置管理
Salt 状态系统的核心是SLS,或者叫SaLt State 文件。
•SLS表示系统将会是什么样的一种状态,而且是以一种很简单的格式来包含这些数据,常被叫做配置管理。
•sls文件命名:
•sls文件以”.sls”后缀结尾,但在调用是不用写此后缀。
•使用子目录来做组织是个很好的选择。
• init.sls 在一个子目录里面表示引导文件,也就表示子目录本身, 所以``apache/init.sls`` 就是表示``apache``.
•如果同时存在apache.sls 和 apache/init.sls,则 apache/init.sls 被忽略,apache.sls将被用来表示 apache.

创建一个sls文件:
# vim /srv/salt/apache.sls
httpd:                 	# ID声明
  pkg:                  	# 状态声明
    - installed           	# 函数声明
指定主机执行:
# salt server2 state.sls apache

准备Top文件:
# vim /srv/salt/top.sls
base:
  '*':
    - apache
批量执行:
# salt '*' state.highstate
编写远程执行模块:在server2 中部署apache

在server2 中部署apache

[root@server1 ~]# cd /srv/
[root@server1 srv]# mkdir salt
[root@server1 srv]# cd salt/
[root@server1 salt]# mkdir apache
[root@server1 salt]# mv ~/index.html  apache/
[root@server1 salt]# cd apache/
[root@server1 apache]# mkdir files
[root@server1 apache]# vim files/index.html
server2
[root@server1 apache]# vim 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
[root@server1 apache]# salt server2 state.sls apache.install  ##所有的文件路径都是基于/srv/salt来确定的,调用apache目录下的install文件
[root@server1 apache]# md5sum files/index.html  ##每个文件都有md5码
01bc6b572ba171d4d3bd89abe9cb9a4c  files/index.html

在这里插入图片描述

在这里插入图片描述

[root@server2 salt]# tree .
[root@server2 salt]# pwd  ##缓存路径
/var/cache/salt
[root@server2 salt]# cd minion/files/base/apache/
[root@server2 apache]# ls
files  install.sls
[root@server2 apache]# cd files/
[root@server2 files]# ls
index.html
[root@server2 files]# md5sum index.html
01bc6b572ba171d4d3bd89abe9cb9a4c  index.html

在这里插入图片描述

[root@server1 apache]# scp server2:/etc/httpd/conf/httpd.conf file/
[root@server1 apache]# vim files/httpd.conf
Listen 8080
[root@server1 apache]# vim 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
    - enable: true
    - watch:
      - file: /etc/httpd/conf/httpd.conf
##唯一性声明
/etc/httpd/conf/httpd.conf:
  file.managed:
    - source: salt://apache/files/httpd.conf
[root@server1 apache]# salt server2 state.sls apache.install  
[root@server2 salt]# netstat -antlp   ##未触发成功时,更改端口多试几次
tcp6       0      0 :::8080                 :::*                    LISTEN      14505/httpd  

在这里插入图片描述
在这里插入图片描述
另一种写法

[root@server1 apache]# vim install.sls 
apache:
  pkg.installed:
    - pkgs:
      - httpd
      - php
      - php-mysql

  file.managed:
    - source: salt://apache/files/httpd.conf
    - name: /etc/httpd/conf/httpd.conf

  service.running:
    - name: httpd
    - enable: true
    - watch:
      - file: apache
[root@server1 apache]# salt server2 state.sls apache.install
 init.sls 在一个子目录里面表示引导文件,也就表示子目录本身, 所以``apache/init.sls`` 就是表示``apache``.
如果同时存在apache.sls 和 apache/init.sls,则 apache/init.sls 被忽略,apache.sls将被用来表示 apache.

在这里插入图片描述

创建模块
[root@server1 ~]# mkdir /srv/salt/_modules ##创建模块目录
[root@server1 ~]# cd /srv/salt/_modules
[root@server1 _modules]# ls
[root@server1 _modules]# vim mydisk.py ##编写模块文件
def df():
    return __salt__['cmd.run']('df -h')
[root@server1 _modules]# salt server2 saltutil.sync_modules   ##同步模块
server2:
    - modules.mydisk
[root@server1 _modules]# salt server2 mydisk.df
[root@server1 _modules]# salt server2 cmd.run df 

[root@server2 salt]# cd /var/cache/salt/minion/
[root@server2 minion]# tree .

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

3、grains

grains定义数据系统

- Grains是SaltStack的一个组件,存放在SaltStack的minion端。
- 当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。
- 由于grains是静态数据,因此不推荐经常去修改它。
- 应用场景:
信息查询,可用作CMDB。
在target中使用,匹配minion。
在state系统中使用,配置管理模块。
信息查询

用于查询minion端的IP、FQDN等信息。
默认可用的grains:

列出所有的key
在这里插入图片描述
列出所有 key和值
在这里插入图片描述

指定key的值
在这里插入图片描述

自定义grains项
在/etc/salt/minion中定义
[root@server2 minion]# cd /etc/salt/
[root@server2 salt]# vim minion  ##129行
grains:
  roles:
    - apache
[root@server2 salt]# systemctl restart salt-minion
[root@server1 _modules]# salt server2 test.ping
server2:
    True
[root@server1 _modules]# salt server2 grains.item ipv4
server2:
    ----------
    ipv4:
        - 127.0.0.1
        - 192.168.0.2
[root@server1 _modules]# salt server2 grains.item roles  ##指定角色
server2:
    ----------
    roles:
        - apache
[root@server1 _modules]# pwd
/srv/salt/_modules

在这里插入图片描述

在/etc/salt/grains中定义
[root@server3 salt]# pwd
/etc/salt
[root@server3 salt]# vim grains
roles:
  - nginx
[root@server1 _modules]# salt server3 saltutil.sync_grains ##同步数据
[root@server1 _modules]# salt '*' grains.item roles

在这里插入图片描述

在salt-master端创建_grains目录
[root@server1 _modules]# mkdir /srv/salt/_grains
[root@server1 _modules]# cd /srv/salt/_grains
[root@server1 _grains]# vim my_grain.py
def my_grain():
    grains = {}
    grains['salt'] = 'stack'
    grains['hello'] = 'world'
    return grains
[root@server1 _grains]# salt '*' saltutil.sync_grains  ##同步grains到minion端
[root@server1 _grains]# salt '*' grains.item hello
[root@server1 _grains]# salt '*' grains.item salt

[root@server2 ~]# tree /var/cache/salt/

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

grains匹配运用:在server3部署nginx
在target中匹配minion

在这里插入图片描述

在top文件中匹配:nginx

不同的主机部署不同的服务:server3部署nginx

[root@server1 _grains]# cd /srv/salt/
[root@server1 salt]# vim top.sls
base:
  'roles:apache':
    - match: grain
    - apache
  'roles:nginx':
    - match: grain
    - nginx
[root@server1 salt]# cd apache/
[root@server1 apache]# ls
files  install.sls
[root@server1 apache]# mv install.sls init.sls

[root@server1 salt]# mkdir nginx
[root@server1 salt]# cd nginx/
[root@server1 nginx]# mkdir files
[root@server1 nginx]# vim init.sls
nginx:
  file.managed:
    - source: salt://nginx/files/nginx-1.18.0.tar.gz
    - name: /mnt/nginx-1.18.0.tar.gz
[root@server1 nginx]# cd files/
[root@server1 files]# ls
[root@server1 files]# pwd
/srv/salt/nginx/files
[root@foundation50 qq]# scp nginx-1.18.0.tar.gz root@192.168.0.1:/srv/salt/nginx/files
[root@server1 salt]# salt '*' state.highstate

[root@server2 ~]# ps ax
14508 ?        S      0:00 /usr/sbin/httpd -DFOREGROUND
14509 ?        S      0:00 /usr/sbin/httpd -DFOREGROUND
14510 ?        S      0:00 /usr/sbin/httpd -DFOREGROUND
14511 ?        S      0:00 /usr/sbin/httpd -DFOREGROUND

[root@server3 salt]# cd /mnt/
[root@server3 mnt]# ls
nginx-1.18.0.tar.gz

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

在这里插入图片描述

nginx源码方式安装
[root@server1 nginx]# pwd
/srv/salt/nginx
[root@server1 nginx]# vim 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
[root@server1 nginx]# salt server3 state.sls nginx.install

install.sls
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

[root@server1 files]# scp server3:/usr/local/nginx/conf/nginx.conf .
[root@server1 files]# vim nginx.service 
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.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

[root@server1 files]# vim nginx.conf  ##默认情况下nginx服务是nobody身份运行,更改为nginx用户运行。
2 user  nginx;

[root@server1 nginx]# vim 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
[root@server1 nginx]# salt server3 state.sls nginx
[root@server1 nginx]# curl server3
<title>Welcome to nginx!</title>
[root@server1 nginx]# salt '*' state.highstate

[root@server3 conf]# ps aux
nginx    18051  0.0  0.2  46320  2032 ?        S    20:36   0:00 nginx: worker process

nginx.service
在这里插入图片描述
init.sls
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

4、Jinja模板

通过jinja模板可以为不同服务器定义各自的变量。
Jinja最基本的用法是使用控制结构包装条件:

[root@server1 apache]# salt server2 grains.item os
server2:
    ----------
    os:
        RedHat
[root@server1 apache]# salt server2 grains.item fqdn
server2:
    ----------
    fqdn:
        server2
[root@server1 salt]# vim test.sls
/mnt/testfile:
  file.append:
    {% if grains['fqdn'] == 'server2' %}
    - text: server2
    {% elif grains['fqdn'] == 'server3' %}
    - text: server3
    {% endif %}
[root@server1 salt]# salt '*' state.sls test

[root@server2 mnt]# cat /mnt/testfile 
server2
[root@server3 ~]# cat /mnt/testfile 
server3

在这里插入图片描述

Jinja在普通文件的使用:

[root@server1 apache]# vim init.sls ##添加在文件最后行
/var/www/html/index.html:
  file.managed: 
    - source: salt://apache/files/index.html
    - template: jinja
    - context:
      NAME: {{ grains['ipv4'][-1] }}
[root@server1 apache]# salt server2 state.sls apache
[root@server2 html]# cat index.html 
RedHat - server2
192.168.0.2
      
[root@server1 apache]# vim init.sls ##优化
apache:
  pkg.installed:
    - pkgs:
      - httpd
      - php
      - php-mysql

  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] }}

[root@server1 apache]# vim files/httpd.conf 
Listen {{ bind }}:{{ port }} ## 直接引用grains变量

[root@server1 apache]# vim files/index.html  
{{ grains['os'] }} - {{ grains['fqdn'] }}
{{ NAME }}
[root@server1 apache]# salt server2 state.sls apache
[root@server2 html]# netstat -antlp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 192.168.0.2:80          0.0.0.0:*               LISTEN      15847/httpd     

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

配置文件被更改
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值