Saltstack入门与实践之配置管理


  salt远程执行我们要学习的saltstack的远程执行模块salt配置管理我们要学习saltstack的状态模块
  我们学习saltstack重要培养的我们的架构能力,比如:saltstack远程管理我们会玩了,配置管理会玩了,现在丢给你一个架构,能不能用saltstack来实现这个架构的能力;

一、如何理解Saltstack的配置管理

学习配置管理之前,我们要理解状态管理;
怎么理解saltstack状态管理:
saltstack的状态严格意义上是不能回滚的;
状态可以多次执行
  States是saltstack中的配置语言,日常管理中需编写大量的states文件,如安装一个包,管理一个配置文件,最后保证服务正常运行,我们需要编写sates sls文件(状态配置文件)描述和实现我们需要的功能;
  states sls文件都是YAML语法同时也支持phthon来编写;
下面我们了解下如何编写states sls文件
1.查看minion 所有states列表
salt 'minion' sys.list_state_modules
2.查看指定states的所有function
salt 'minion' sys.list_state_functions file
3.查看指定state的用法
salt 'minion' sys.state_doc file
4.查看指定的states指定function用法
要查看file.managed states详细用法:
salt 'minion' sys.states_doc file.managed
5.简单的例子如了解states

states的流程:
  1.编写top.sls文件(非必须)
  2.编写states.sls文件

  说明:top.sls 是states 系统的入口文件,它在大规模的配置管理工作中负责指定的哪些设备调用哪些states.sls文件;
states 工作目录(base环境默认在/srv/salt)下创建一个one.sls.states文件

cat /srv/salt/one.sls
/tmp/foo.conf:    #id
  file.managed:      #file states的managed funciton
     - source: salt://foo.conf   #文件来源(salt://代表states的工作目录)
     - user: root       #文件属主
     - group: root      #文件属组
     - mode: 644        #文件权限
     - backup: minion   #备份原文件

  这是一个简单文件管理states.sls文件,我们可以通过上面介绍的方法查看file.managed更多的参数,这个states.sls文件的功能就是实现对minion 的/tmp/foo.conf文件进行统一管理。
下面介绍使用top.sls入口文件同时对多台机器进行一个简单的配置管理,首先在states的工作目录下新建top.sls文件

cat /src/salt/top.sls
base:       #base环境
  '*':        #Target(代表所有Target)
    - one   #引用one.sls或者one/init.sls states文件
  'Minion':     #Target(代表匹配Minion)
    - tow     #引用tow.sls 或者tow.init.sls states文件
  'Minion1'     #Target(代表批量Minion1)
    - three   #引用three.sls或者three/init.sls states文件

  然后我们新建3个state文件: one.sls tow.sls three.sls最后我们就可以使用state.highstate命令同时对Minion和Minion1两台机器进行管理了;
执行结果处理:
1.查看所有return列表

salt 'minion' sys.list_returners
Minion:
  - carbon
  - couchdb
  - etcd
  - local
  - local_cache
  - multi_returnner
  - smtp
  - sqlite3
  - syslog

这里显示一部分,所有的return列表可以去官网查看,上面已经详细介绍如何配置与使用Return
说明:return流程
  return是在master端触发任务,然后minion接受处理任务后直接与return存储服务器建立连接,然后把数据return存到存储服务器。
  因为这个过程都是Minion端操作存储服务器,所以要确保Minion端的配置跟依赖包是正确的;
2.Job管理
  在saltstack里面执行任何一个操作都会在Master上产生一个jid号。minion端会在cache目录下proc目录下的proc目录创建一个以jid为名称的文件,这个文件里面的内容就是此次操作的记录,当操作处理完成后该文件就会自动删除。Master端会记录每次操作的详细信息,这个记录都是存到在Master端cache目录下的jobs下。
saltstack提供salt-run 和moudle 两种方式来管理job
1.通过salt-run来管理job
首先我们来查看下salt-run 对job管理的一些用法:
salt-run -d |grep jobs
这里会显示salt-run 关于job操作的所有命令。
下面我们通过具体是的实例来学习salt配置管理
Salt State SLS描述文件 YAML
我们先来看下 apache.sls文件

cd /srv/salt/web/
cat apache.sls
apache-install:
 pkg.installed:
  - names:
   - httpd
   - httpd-devel
apache-service:
 service.running:
  - name: httpd
  - enable: True

说明:
apache-install #为声明ID 默认是name声明
例如:

apache-services:    #ID声明   高级声明,ID必须为一
 service.running:  #ID的的方法;State声明 状态声明
  - name: httpd   #方法的参数(选项)声明
  - enable: True
php:
 pkg.installed

说明:一个ID声明下,一个状态只能使用一次,不能重复使用;
实例:saltstack部署
LAMP架构

  1.安装软件包  pkg
  2.修改配置文件  file
  3.启动服务   service
pkg.installed #安装
pkg.latest  #确保最新版本
pkg.remove  #卸载
pkg.purge   #卸载并删除位置文件

#同时安装多个包

common_packages:
 pkg.installed:
  - pkg.installed:
   - unzip:
   - dos2unix
   - salt-minion: 2015.8.5-1.el6
lamp-pgk:
 pkg.installed:
  - pkgs:
   - httpd
   - php
   - mariadb
   - mariadb-server
   - php-mysql
   - php-cli
   - php-mbstring
apache-config:
 file.managed:
  - name: /etc/httpd/conf/httpd.conf
  - source: salt://files/httpd.conf
  - user: root
  - group: root
  - mode: 644
php-config:
 file.managed:
  - name: /etc/php.ini
  - source: salt://files/php.ini
  - user: root
  - group: root
  - mode: 644
mysql-config:
 file.managed:
  - name: /etc/my.cnf
  - source: salt://files/my.cnf
  - user: root
  - group: root
  - mode: 644

我们先创建文件路径
cd /srv/salt/
mkdir -p lamp
cd lamp
vim lamp.sls
#把上面写的配置我们粘贴进来

lamp-pkg:
 pkg.installed:
  - pkgs:
   - httpd
   - php
   - mariadb
   - mariadb-server
   - php-mysql
   - php-cli
   - php-mbstring
apache-config:
 file.managed:
  - name: /etc/httpd/conf/httpd.conf
  - source: salt://lamp/files/httpd.conf
  - user: root
  - group: root
  - mode: 644
php-config:
 file.managed:
  - name: /etc/php.ini
  - source: salt://lamp/files/php.ini
  - user: root
  - group: root
  - mode: 644
mysql-config:
 file.managed:
  - name: /etc/my.cnf
  - source: salt://lamp/files/my.cnf
  - user: root
  - group: root
  - mode: 644
  - require_in:
   - service:mysql-service
apache-service:
 service.running:
  - name: httpd
  - enable: True
  - reload: True
  - require:
   - pkg: lamp-pkg
    - file: apache-config
mysql-service:
 service.running:
  - name: mariadb-server
  - enable: True
  - reload: True

#我们在创建file文件夹
然后把已经安装好的程序的配置文件拷贝到file文件夹

cd /srv/salt/lamp/file
cp /etc/httpd/conf/httpd.conf .
cp /etc/php.ini .
cp /etc/my.conf .

– source: salt:// #这里的salt:// 表示是指当前环境salt的根目录 /srv/salt/
例如:vim /salt/master

file_roots:
 base:
  - /srv/salt

那么salt://lamp/files/httpd.conf 表示/srv/salt/lamp/httpd.conf
所以我们要检查下上面sls文件的里面的source路径
然后我们在linux-node2上测试:

salt 'linux-node2*' test.ping
salt 'linux-node2*' state.sls lamp.lamp

执行后报错看日志排除:
====配置文件另外一种写法:按照服务写

apache-server:
 pkg.installed:
  - pkgs:
   - httpd
   - php
 file.managed:
  - name: /etc/httpd/conf/httpd.conf
  - source: salt://lamp/files/httpd.conf
  - user: root
  - group: root
  - mode: 644
 service.running:
  - name: httpd
  - enable: True
  - reload: True
mysql-server:
 pkg.installed:
  - pkgs:
   - mariadb
   - mariadb-server
  file.managed:
  - name: /etc/my.cnf
  - source: salt://lamp/files/my.cnf
  - user: root
  - group: root
  - mode: 644
  service.running:
  - name: mariadb-server
  - enable: True
  - reload: True
php-config:
 file.managed:
  - name: /etc/php.ini
  - source: salt://lamp/files/php.ini
  - user: root
  - group: root
   mode: 644

状态间关系:

  1.我依赖谁   require
  2.我被谁依赖  require_in
  3.我监控谁   watch
  4.我被谁监控
  5.我引用谁
  6.我拓展谁  include
apache-service:
 service.running:
  - name: httpd
  - enable: True
  - reload: True
  - require:
   - pkg: lamp-pkg
    - file: apache-config
   - watch:
    - file: apache-config

1.若果这个apache-config 这个id 的状态发生变化就reload
2.如果不加reload: True,那么就restart
如何编写SLS技巧:
 1.按状态分类 如果单独使用很清晰
 2.服务分类 可以被其他的SLS include 例如: LNMP include mysql服务(生产环境推荐)
=====配置管理之Jinja模板
  Jinja2 是一个 Python 的功能齐全的模板引擎。它有完整的 unicode 支持,一个可选 的集成沙箱执行环境,被广泛使用,以 BSD 许可证授权。
YAML-jinja模板包含 变量和表达式;
变量:
两种分隔符:
{% … %}和{{ … }}
使用一个模板需要三步:
1.高诉File模块,要使用jinja
例如:apache 如何告诉 – template: jinja
vim /srv.salt/lamp/config.sls

apache-config:
 file.managed:
  - name: /etc/httpd/conf/httpd.conf
  - source: salt://lamp/files/httpd.conf
  - user: root
  - group: root
  - mode: 644
  - template: jinja

2.列出参数对应模板列表
– defaults:
 PORT: 88
3.模板的引用
vim /srv/salt/lamp/files/httpd.conf
Listen {{ PORT }}或者Listen {{ grains[`fqdn_ip`][0] }}:{{ PORT }}

模板里面支持: salt granis pillar 进行赋值
1.写在模板文件中
Grains : Listen {{ grains['fqdn_ip'][0] }}:{{ PORT }}
salt远程执行的模块:

例如:MAC IS {{ salt['network.hw_addr']('eth0') }}
{{ salt['network.hw_addr']('eth0') }}

Pillar {{ pillar['apache'] }}
最后配置全部/srv/salt/lamp/files/httpd.conf

apache-config:
 file.managed:
  - name: /etc/httpd/conf/httpd.conf
  - source: salt://lamp/files/httpd.conf
  - user: root
  - group: root
  - mode: 644
  - template: jinja
  - defaults:
   PORT: 88

2.可以写在SLS里面的Defaults 变量列表中,

- defaults:
  IPADDR: {{ grains['fqdn_ip'][0] }}
  PORT: 88

案例:
https://github.com/saltstack-formulas

2 条评论

发表评论

*