saltstack配置管理

Saltstack状态模块

远程执行模块的执行是过程式,而状态是对minion的一种描述和定义,管理人员不需要关系部署任务如何完成的,只需要描述minion的状态描述。
它的和兴是写sls(Salt State file)文件,sls文件默认格式为YAML格式,并默认使用jinja模板,jinja是根据django的模板语言发展而来的语言,简单并强大,支持for if等循环语句。salt state主要用来描述系统,服务,配置文件的状态,常常被称为配置管理。

mysql-install:   #ID声明,必须唯一
pkg.installed: #state状态声明
- pkgs: #选项声明
- mariadb: #选项列表
- mariadb-server 说明:
一个ID只能出现一次
一个ID下相同模块只能使用一次
一个ID下不可以使用多个不同模块

模块帮助手册

#列出所有状态模块
[root@salt-master ~]# salt '*' sys.list_modules
#查看指定模块的所有方法
[root@salt-master ~]# salt '*' sys.list_state_functions pkg
#查看指定模块的使用方法
[root@salt-master ~]# salt '*' sys.state_doc pkg
#查看指定模块的指定方法的用法
[root@salt-master ~]# salt '*' sys.state_doc pkg.installed

pkg软件模块

pkg模块官档

pkg.installed 软件安装

php-install:
pkg.installed:
- pkgs:
- php
- php-mysql: ">=5.4.16" #指定安装版本
- php-pdo
- php-cli

指定安装最新版本的软件

php-install:
pkg.latest:
- pkgs:
- php
- php-mysql
- php-pdo
- php-cli

file文件模块

file模块官档

file.managed 下发文件,确保文件存在

[root@salt-master ~]# mkdir /srv/salt/base/files
[root@salt-master ~]# cp /etc/httpd/conf/httpd.conf /srv/salt/base/files/
[root@salt-master ~]# cat /srv/salt/base/apache_conf.sls
apache-config:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://files/httpd.conf
- user: root
- group: root
- mode: 说明:
- name: 表示存放目的地址
- source: 表示这个文件来自哪里(说明这个文件得提前准备) 或者这样写,直接已目的地址命令ID,这样ID也表示目的地址
[root@salt-master ~]# cat /srv/salt/base/apache_conf.sls
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://files/httpd.conf
- user: root
- group: root
- mode:
小示例:
[root@salt-master ~]# cat /srv/salt/base/test.sls
/tmp/passwd_back:
file.managed:
- source: salt://files/passwd
- user: root
- group: root
- mode:
[root@salt-master ~]# cp /etc/passwd /srv/salt/base/files/
[root@salt-master ~]# salt '*' state.sls test
[root@salt-master ~]# salt '*' cmd.run "ls -l /tmp/passwd_back"
salt-minion03:
-rw-r--r-- root root May : /tmp/passwd_back
salt-minion02:
-rw-r--r-- root root May : /tmp/passwd_back
salt-minion01:
-rw-r--r-- root root May : /tmp/passwd_back

file.directory 建立目录

[root@salt-master ~]# cat /srv/salt/base/directory.sls
/tmp/saltdir:
file.directory:
- user: root
- group: root
- mode:
- makedirs: True #如果上一级目录不存在自动创建;类似(mkdir -p) [root@salt-master ~]# salt '*' state.sls directory
[root@salt-master ~]# salt '*' cmd.run "ls -d /tmp/saltdir"
salt-minion03:
/tmp/saltdir
salt-minion02:
/tmp/saltdir
salt-minion01:
/tmp/saltdir

file.recurse 下发整个目录

[root@salt-master ~]# cat /srv/salt/base/httpd_conf_dir.sls
httpd_conf_dir:
file.recurse:
- name: /etc/httpd/conf.d
- source: salt://files/conf.d
- file_mode: #文件权限
- dir_mode: #目录权限
- include_empty: True #同步空目录
- clean: True #使用后minion与master保持一致 [root@salt-master ~]# rsync -avh /etc/httpd/conf.d /srv/salt/base/files/

file.symlink 建立软链接

[root@salt-master ~]# cat /srv/salt/base/target_link.sls
/etc/grub.cfg:
file.symlink:
- target: /etc/grub2.cfg [root@salt-master ~]# salt '*' state.sls target_link
[root@salt-master ~]# salt '*' cmd.run "ls -l /etc/grub.cfg"
salt-minion03:
lrwxrwxrwx root root May : /etc/grub.cfg -> /etc/grub2.cfg
salt-minion01:
lrwxrwxrwx root root May : /etc/grub.cfg -> /etc/grub2.cfg
salt-minion02:
lrwxrwxrwx root root May : /etc/grub.cfg -> /etc/grub2.cfg

service服务模块

service模块官档

[root@salt-master ~]# cat /srv/salt/base/service_httpd.sls
httpd:
service.running:
- name: httpd #服务名称
- enable: True #开机自启动
- reload: True #允许重载配置文件,不写则是restart 或者这样写
[root@salt-master ~]# cat /srv/salt/base/service_httpd.sls
httpd: #即表示ID,又表示服务名
service.running:
- enable: True
- reload: True

高级状态模块

当我们想要不同的主机应用不同的配置,那么可以使用高级状态管理 top file
来进行管理。可以通过正则,grain模块,或分组名,来进行匹配,再下一级是要执行的state文件

可以将我们的配置需求转换为YAML并在Top file文件中表示:

Top file示例

base:
'*': #通过正则去匹配所有minion
- app.nginx webserver: #定义的分组名称
- match: nodegroup
- app.cron 'os:centos': #通过grains模块匹配
- match: grains
- nginx

Top file 高级状态的执行

[root@salt-master ~]# salt '*' state.highstate

LAMP架构案例

说明:该案例在prod环境配置

1)环境准备,定义file_roots环境

[root@salt-master ~]# vim /etc/salt/master
file_roots:
base:
- /srv/salt/base
dev:
- /srv/salt/dev
prod:
- /srv/salt/prod

2)创建对应环境目录

[root@salt-master ~]# mkdir -p /srv/salt/{base,dev,prod}
[root@salt-master ~]# mkdir /srv/salt/prod/{httpd,php,mysql,files}

3)配置文件准备及测试文件准备

[root@salt-master ~]# cp /etc/my.cnf /srv/salt/prod/files/
[root@salt-master ~]# cp /etc/httpd/conf/httpd.conf /srv/salt/prod/files/
[root@salt-master ~]# cp /etc/php.ini /srv/salt/prod/files/
[root@salt-master ~]# echo "<h1>LAMP html</h1>" >>/srv/salt/prod/files/index.html
[root@salt-master ~]# echo "<?php phpinfo(); ?>" >> /srv/salt/prod/files/index.php

4)编写state sls状态文件

#httpd
[root@salt-master ~]# cat /srv/salt/prod/httpd/init.sls
apache-install:
pkg.installed:
- pkgs:
- httpd
- httpd-tools apache-config:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://files/httpd.conf
- user: root
- group: root
- mode: apache-service:
service.running:
- name: httpd
- enable: True #php
[root@salt-master ~]# cat /srv/salt/prod/php/init.sls
php-install:
pkg.installed:
- pkgs:
- php
- php-mysql
- php-pdo
- php-cli php-config:
file.managed:
- name: /etc/php.ini
- source: salt://files/php.ini
- user: root
- group: root
- mode: #mysql
[root@salt-master ~]# cat /srv/salt/prod/mysql/init.sls
mariadb-install:
pkg.installed:
- pkgs:
- mariadb-server
- mariadb mariadb-config:
file.managed:
- name: /etc/my.cnf
- source: salt://files/my.cnf
- user: root
- group: root
- mode: mariadb-service:
service.running:
- name: mariadb
- enable: True #测试文件
[root@salt-master ~]# cat /srv/salt/prod/testfile.sls
/var/www/html/index.html:
file.managed:
- source: salt://files/index.html /var/www/html/index.php:
file.managed:
- source: salt://files/index.php

6)topfile文件编写

[root@salt-master ~]# cat /srv/salt/base/top.sls
prod:
'salt-minion*':
- httpd.init
- php.init
- mysql.init
- testfile

7)部署LAMP整体state文件查看

[root@salt-master ~]# tree /srv/salt/
/srv/salt/
├── base
│   └── top.sls
├── dev
└── prod
├── files
│   ├── httpd.conf
│   ├── index.html
│   ├── index.php
│   ├── my.cnf
│   └── php.ini
├── httpd
│   └── init.sls
├── mysql
│   └── init.sls
├── php
│   └── init.sls
└── testfile.sls

8)执行topfile

[root@salt-master ~]# salt '*' state.highstate

States状态依赖

通过上面的lamp可以看出已经可以使用state模块来定义minion的状态了,但是如果一个主机涉及多个状态,并且状态之间相互关联,在执行顺序上有先后之分,那么必须引用requisites来进行控制

关系说明:
1、require 我依赖某个状态,我依赖谁
2、require_in 我被某个状态依赖,谁依赖我
3、watch 我关注某个状态,当状态发生改变,进行restart或者reload操作
4、watch_in 我被某个状态关注
5、include 我引用谁

1)修改上面lamp状态间依赖关系

#httpd
[root@salt-master ~]# cat /srv/salt/prod/httpd/init.sls
apache-install:
pkg.installed:
- pkgs:
- httpd
- httpd-tools apache-config:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://files/httpd.conf
- user: root
- group: root
- mode:
- require:
- pkg: apache-install #表示上面apache-install执行成功,才能执行apache-config apache-service:
service.running:
- name: httpd
- enable: True
- require:
- file: apache-config
- watch:
- file: apache-config #php
[root@salt-master ~]# cat /srv/salt/prod/php/init.sls
php-install:
pkg.installed:
- pkgs:
- php
- php-mysql
- php-pdo
- php-cli
- reqiure_in:
- file: php-config php-config:
file.managed:
- name: /etc/php.ini
- source: salt://files/php.ini
- user: root
- group: root
- mode: #mysql
[root@salt-master ~]# cat /srv/salt/prod/mysql/init.sls
mariadb-install:
pkg.installed:
- pkgs:
- mariadb-server
- mariadb mariadb-config:
file.managed:
- name: /etc/my.cnf
- source: salt://files/my.cnf
- user: root
- group: root
- mode:
- require:
- pkg: mariadb-install mariadb-service:
service.running:
- name: mariadb
- enable: True
- reload: True
- require:
- file: mariadb-config
- watch:
- file: mariadb-config

2)修改引用关系后include

[root@salt-master ~]# tree /srv/salt/
/srv/salt/
├── base
│   └── top.sls
├── dev
└── prod
├── files
│   ├── httpd.conf
│   ├── index.html
│   ├── index.php
│   ├── my.cnf
│   └── php.ini
├── httpd
│   └── init.sls
├── lamp.sls
├── mysql
│   └── init.sls
├── php
│   └── init.sls
└── testfile.sls [root@salt-master ~]# cat /srv/salt/prod/lamp.sls
include:
- httpd.init
- php.init
- mysql.init
- testfile [root@salt-master ~]# cat /srv/salt/base/top.sls
prod:
'salt-minion*':
- lamp

3)编写SLS技巧

、按照状态分类,如果单独使用,清晰明了
、按照服务分类,可以被其它SLS引用

Jinja模板使用

配置文件一般灵活多变,比如配置apacheIP地址或者端口PORT等,则可以动态传值。

Jinja官档
salt jinja官档

Jinja2 模板包含变量和表达式,变量用 {{ … }} 包围,表达式用 {% … %} 包围。变量使用示例:

[root@salt-master ~]# cat /srv/salt/base/var.sls
{% set var= 'hello world!' %}
test_var:
cmd.run:
- name: echo "测试变量 {{ var }}" [root@salt-master ~]# salt 'salt-minion01' state.sls var
salt-minion01:
----------
ID: test_var
Function: cmd.run
Name: echo "测试变量 hello world!"
Result: True
Comment: Command "echo "测试变量 hello world!"" run
Started: ::58.302424
Duration: 12.358 ms
Changes:
----------
pid: retcode: stderr:
stdout:
测试变量 hello world! Summary for salt-minion01
------------
Succeeded: (changed=)
Failed:
------------
Total states run:
Total run time: 12.358 ms

jinja2 常用变量

1、字符串类型

{% set var = 'test' %}  #定义变量
{{ var }} #调用变量

2、列表类型

{% set list = ['one', 'two', 'three'] %}
{{ list[] }} #获取变量的第一个值

3、字典类型

{% set dict = {'key1':'value1', 'key2':'value2'} %}
{{ dict['key1'] }} #获取'key1'的值

示例1:Saltstack使用jinja模块配置apache监听端口

#.告诉file状态模块,需要使用jinja
- template: jinja
#.列出参数列表
- defaults:
PORT:
#.配置文件引用jinja模板
{{ PORT }} # 配置示例
apache-config:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://files/httpd.conf
- user: root
- group: root
- mode:
- template: jinja
- defaults:
PORT: # 修改httpd.conf配置文件引用变量
Listen {{ PORT }}

示例2:使用grinas 方式进行赋值

#配置示例
apache-config:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://files/httpd.conf
- user: root
- group: root
- mode:
- template: jinja
- defaults:
PORT:
IPADDR: {{ grains['fqdn_ip4'][] }} # 修改httpd.conf配置文件引用变量
Listen {{ IPADDR }}:{{ PORT }}

示例3:通过jinja+grains根据系统不同安装apache

[root@salt-master ~]# cat /srv/salt/base/httpd.sls
#根据grains获取的值判别系统后安装软件
httpd-install:
pkg.installed:
{% if grains['os'] == 'CentOS' %}
- name: httpd
{% elif grains['OS'] == 'Debin' %}
- name: apache2
{% endif %}

saltstack快速入门

saltstack远程执行

saltstack状态判断

saltstack使用salt-ssh

SaltStack--配置管理的更多相关文章

  1. SaltStack配置管理-jinja模板

    上一篇:SaltStack配置管理-状态间关系 需求:需要apache配置文件里面监听的端口是每个minion本地的地址 saltstack默认的模板是jinjia模板 参考文档:http://doc ...

  2. SaltStack配置管理-状态间关系

    上一篇:SaltStack配置管理-LAMP状态设计 include包含 上篇安装LAMP环境是一个个环境安装,可以通过include模块全部安装 lamp.sls include: - apache ...

  3. SaltStack配置管理-LAMP状态设计

    上一篇:SaltStack之Salt-ssh 配置文件模板 apache: pkg.installed: - name: httpd service.running: - name: httpd /e ...

  4. SaltStack配置管理之状态模块和jinja2(五)

    官方文档 https://docs.saltstack.com/en/latest/topics/states/index.html 配置管理之SLS Salt  State  SLS描述文件(YAM ...

  5. saltstack配置管理之states

    states是saltstack中的配置语言,我们安装一个包,管理一个配置文件,最后保证服务的正常运行,都需要我们编写一些states sls文件(描述状态的文件)去描述和实现我们的功能.sls文件都 ...

  6. Saltstack配置管理(2)

    1.SaltStack批量安装zabbix_agent端. vim /etc/salt/states/init/zabbix_agnet.sls zabbix_install.conf: pkg.in ...

  7. Saltstack配置管理

    制作简单初始化模块(在minion主机安装软件): 1.定义master配置文件file_roots [root@localhost~]# cat /etc/salt/master file_root ...

  8. SaltStack配置管理--状态间的关系(六)

    一.include的引用 需求场景:用于含有多个SLS的状态,使用include可以进行多个状态的组合,将安装apache,php,mysql集合在一个sls中 [root@7mini-node1 p ...

  9. saltStack 配置管理(也就是替换文件)

    目录  /srv/salt/base下面新建一个文件dns.sls /opt/resolv.conf_bak:     #这个是文件替换的位置,也就说替换到远程文件的/opt/resolv.conf_ ...

  10. 自动化运维工具saltstack02 -- 之SaltStack的配置管理

    SaltStack的配置管理 1.配置管理说明 配置管理,顾名思义及配置与管理, salt-master的配置文件编写格式之YAML语法说明: 数据的结构通过缩进来表示,每一级用两个空格来表示缩进,如 ...

随机推荐

  1. javascript中的作用域和变量提升

    js的运行主要分两个阶段:js的预解析和运行,预解析阶段所有的变量声明和函数定义都会提前,但是变量的赋值不会提前.

  2. React 积累

    1. Fragment 标签 使用介绍:因React要求每个组件都需要一个大的外层包裹起来才可以,否则报错,如果你并不想组件外层由一个大大外层包裹,则可以使用Fragment 标签 代码示例: imp ...

  3. 透彻的掌握 Spring 中@transactional 的使用

    事务管理是应用系统开发中必不可少的一部分.Spring 为事务管理提供了丰富的功能支持.Spring 事务管理分为编码式和声明式的两种方式.编程式事务指的是通过编码方式实现事务:声明式事务基于 AOP ...

  4. centos7 df 命令卡死

    登录服务器想查看磁盘使用情况,使用了df,但卡住半天没有响应. 运行strace df -h,发现最后卡在了 stat("/proc/sys/fs/binfmt_misc", 无法 ...

  5. Jenkins+Docker+Git+Registry

    从0到1体验Jenkins+Docker+Git+Registry实现CI自动化发布   笔者:@拿着保温瓶的年轻人 目录: 一.前言 二.发布流程 三.环境准备 四.部署思路梳理 五.三台机器上操作 ...

  6. SpringCloud 基础

    目录 SpringCloud 基础 一.概述 二.服务发现组件 Eureka 1. 介绍 2. 搭建 Maven 父工程 3. 创建 Eureka 集群 4. 创建服务提供方集群 5. 创建服务消费方 ...

  7. MarkDown的常规用法

    MarkDown的常规用法 标题 # 一级标题 ## 二级标题 ... ###### 六级标题 列表 第二级 - 和 空格 + 和 空额 * 和 空格 第三级 代码块 多行代码块 3个` 回车 单行代 ...

  8. Prometheus 重新标签

    Prometheus 重新标签 允许在采集之前对任何目标及其标签进行修改 • 重命名标签名 • 删除标签 • 过滤目标 action:重新标签动作 replace:默认,通过regex匹配source ...

  9. MyBatis-Plus入门Demo详解

    一.简介: 引用官方文档(本文主要参考官方文档示例): MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生 ...

  10. python matplotlib 设置x轴文本间隔显示(数字的话可以转为字符之后处理)

    一个国际友人绘图遇到的问题,查了一手资料.主要参考的是这个老哥的做法(https://blog.csdn.net/wyquin/article/details/80508260) #totalSeed ...