CONFIGURATION MANAGEMENT(第一部分)

CONFIGURATION MANAGEMENT(第一部分)

salt有一个强大而灵活的配置框架,它建立在远程执行模块的核心上,可以通过指定语言编写的sls文件轻易的在上万台主机上执行。

states的介绍:
  使用一个精简容易阅读和理解的配置文件表示主机状态。
  Full list of states
    包含一系列的states模块,譬如pkg,group功能模块等
  Pillar System
    关于pillar变量系统的描述
  Highstate data structure
    高级state文件的结构和语法定义
  Writing states
    如何管理和编写一个states文件,并且去扩展更多的功能

注意:
  执行模块和状态模块是有所区别的,执行模块参考:
  https://docs.saltstack.com/en/latest/ref/modules/all/index.html
  使用示例:
  salt ‘*‘ user.add name <uid> <gid> <groups> <home> <shell>
  状态模块是让目标达成一种预定的配置状态,不能在state文件中直接使用执行模块,可以通过module states来调用执行模块。

示例:

 1 moe:
 2   user.rename:
 3     - new_name: larry
 4     - onlyif: id moe
 5
 6 rename_moe:
 7   module.run:
 8     - m_name: moe
 9     - new_name: larry
10     - onlyif: id moe


Renderers

渲染器,salt使用模板语言来组织sls文件的格式和逻辑。

Full list of renderers

支持的模板使用列表,参考链接:

  https://docs.saltstack.com/en/2016.11/ref/renderers/all/index.html#all-salt-renderers


HOW DO I USE SALT STATES?

salt state配置的非常简单,同时也非常强大,salt系统的核心在于state文件,它作为一种状态的表示,使用简单的格式包装这些配置数据。


IT IS ALL JUST DATA

  sls文件是由字典,列表,数字,字符串组成的一个数据结构。


THE TOP FILE

  作为一个入口文件,定义了minion主机与sls文件之间的对应关系。


DEFAULT DATA - YAML

默认sls文件使用yaml格式组织起来。
一个典型的sls文件示例:

1 apache:
2   pkg.installed: []
3   service.running:
4     - require:
5       - pkg: apache

第一行:ID Declaration(声明),可以设置为被操作事务的名称。
第二,三行:<state_module>.<function>,state模块和函数声明:
最后两行:require定义了依赖关系,确保会先成功执行了pkg之后再执行服务启动。


ADDING CONFIGS AND USERS

 1 apache:
 2   pkg.installed: []
 3   service.running:
 4     - watch:
 5       - pkg: apache
 6       - file: /etc/httpd/conf/httpd.conf
 7       - user: apache
 8   user.present:
 9     - uid: 87
10     - gid: 87
11     - home: /var/www/html
12     - shell: /bin/nologin
13     - require:
14       - group: apache
15   group.present:
16     - gid: 87
17     - require:
18       - pkg: apache
19
20 /etc/httpd/conf/httpd.conf:
21   file.managed:
22     - source: salt://apache/httpd.conf
23     - user: root
24     - group: root
25     - mode: 644

这个示例极大的扩展了许多功能,如下简要说明:
(1)ID声明使用apache,并充当里面state模块的name参数,当然也可以使用内部的name参数来覆盖。
(2)一个ID状态声明包含了多个state模块状态,但是一个模块状态只能包含一个函数
(3)使用require和watch定义了配置之间的依赖关系,配置起来更为灵活
注意:watch与require的功能相似,但是watch要比require多一个监视功能,如果对象发生变化会触发动作。


MOVING BEYOND A SINGLE SLS

如果要将配置结构设计成可扩展灵活的形式,就需要将sls文件进行分类,这些sls文件被组织在一个state数状结构中。
示例:

1 apache/init.sls
2 apache/httpd.conf

注意:在sls文件的命名中不要使用点号,这样会导致top文件引用是识别文件名错误。

以下是一个较为复杂的示例:

ssh/init.sls:

 1 openssh-client:
 2   pkg.installed
 3
 4 /etc/ssh/ssh_config:
 5   file.managed:
 6     - user: root
 7     - group: root
 8     - mode: 644
 9     - source: salt://ssh/ssh_config
10     - require:
11       - pkg: openssh-client
12
13 ssh/server.sls:
14
15 include:
16   - ssh
17
18 openssh-server:
19   pkg.installed
20
21 sshd:
22   service.running:
23     - require:
24       - pkg: openssh-client
25       - pkg: openssh-server
26       - file: /etc/ssh/banner
27       - file: /etc/ssh/sshd_config
28
29 /etc/ssh/sshd_config:
30   file.managed:
31     - user: root
32     - group: root
33     - mode: 644
34     - source: salt://ssh/sshd_config
35     - require:
36       - pkg: openssh-server
37
38 /etc/ssh/banner:
39   file:
40     - managed
41     - user: root
42     - group: root
43     - mode: 644
44     - source: salt://ssh/banner
45     - require:
46       - pkg: openssh-server

看点:
(1)state文件结构组织比较合理,将客户端和服务端状态进行分离
(2)使用include将ssh文件导入到server状态文件中,实现重用
(3)定义了完整合理的依赖关系


EXTENDING INCLUDED SLS DATA

示例:

ssh/custom-server.sls:

1 include:
2   - ssh.server
3
4 extend:
5   /etc/ssh/banner:
6     file:
7       - source: salt://ssh/custom-banner

python/mod_python.sls:
示例:

 1 include:
 2   - apache
 3
 4 extend:
 5   apache:
 6     service:
 7       - watch:
 8         - pkg: mod_python
 9
10 mod_python:
11   pkg.installed

看点:
(1)示例1使用extend将/etc/ssh/banner state状态的source参数重新配置,实现灵活的变更
(2)示例2使用extend为apache模块添加依赖关系,并增加了一个依赖状态模块mod_python

注意:extend功能只是进行附加,而不是像watch和require那样引进一个完整的状态。


UNDERSTANDING THE RENDER SYSTEM

理解模板引擎

sls文件默认使用yaml_jinja,整个sls文件使用jinja模板渲染之后,再序列化成yaml的文档格式,jinja模板可用在state模块函数中。


GETTING TO KNOW THE DEFAULT - YAML_JINJA

示例:

 1 apache:
 2   pkg.installed:
 3     {% if grains[‘os‘] == ‘RedHat‘%}
 4     - name: httpd
 5     {% endif %}
 6   service.running:
 7     {% if grains[‘os‘] == ‘RedHat‘%}
 8     - name: httpd
 9     {% endif %}
10     - watch:
11       - pkg: apache
12       - file: /etc/httpd/conf/httpd.conf
13       - user: apache
14   user.present:
15     - uid: 87
16     - gid: 87
17     - home: /var/www/html
18     - shell: /bin/nologin
19     - require:
20       - group: apache
21   group.present:
22     - gid: 87
23     - require:
24       - pkg: apache
25
26 /etc/httpd/conf/httpd.conf:
27   file.managed:
28     - source: salt://apache/httpd.conf
29     - user: root
30     - group: root
31     - mode: 644

看点:
  以上的示例演示的是在sls文件中使用jinja模板,在jinja模板中salt,grains,pillar都可以使用,允许调用salt函数(指的是执行模块),非常强大,

下面以部署moosefs为例来讲解模板的一些复杂使用方法:
moosefs/chunk.sls:

 1 include:
 2   - moosefs
 3
 4 {% for mnt in salt[‘cmd.run‘](‘ls /dev/data/moose*‘).split() %}
 5 /mnt/moose{{ mnt[-1] }}:
 6   mount.mounted:
 7     - device: {{ mnt }}
 8     - fstype: xfs
 9     - mkmnt: True
10   file.directory:
11     - user: mfs
12     - group: mfs
13     - require:
14       - user: mfs
15       - group: mfs
16 {% endfor %}
17
18 /etc/mfshdd.cfg:
19   file.managed:
20     - source: salt://moosefs/mfshdd.cfg
21     - user: root
22     - group: root
23     - mode: 644
24     - template: jinja
25     - require:
26       - pkg: mfs-chunkserver
27
28 /etc/mfschunkserver.cfg:
29   file.managed:
30     - source: salt://moosefs/mfschunkserver.cfg
31     - user: root
32     - group: root
33     - mode: 644
34     - template: jinja
35     - require:
36       - pkg: mfs-chunkserver
37
38 mfs-chunkserver:
39   pkg.installed: []
40 mfschunkserver:
41   service.running:
42     - require:
43 {% for mnt in salt[‘cmd.run‘](‘ls /dev/data/moose*‘) %}
44       - mount: /mnt/moose{{ mnt[-1] }}
45       - file: /mnt/moose{{ mnt[-1] }}
46 {% endfor %}
47       - file: /etc/mfschunkserver.cfg
48       - file: /etc/mfshdd.cfg
49       - file: /var/lib/mfs

看点:
(1)使用了salt执行模块cmd.run。
(2)使用了模板的for逻辑处理结构


INTRODUCING THE PYTHON, PYDSL, AND THE PYOBJECTS RENDERERS

使用额外的其他模板
示例:

python/django.sls:

1 #!py
2
3 def run():
4     ‘‘‘
5     Install the django package
6     ‘‘‘
7     return {‘include‘: [‘python‘],
8             ‘django‘: {‘pkg‘: [‘installed‘]}}

sls文件的第一行表示使用py渲染器解释,再定义一个run函数,返回值设置为一个符合salt要求的数据结构。

示例:

1 #!pydsl
2
3 include(‘python‘, delayed=True)
4 state(‘django‘).pkg.installed(

示例:

1 #!pyobjects
2
3 include(‘python‘)
4 Pkg.installed("django")

说明:使用YAML是一个好的选择,同时使用纯python的sls文件可以获得更加复杂强大的功能。


RUNNING AND DEBUGGING SALT STATES

在准备运行sls文件的时候,最好先测试运行一下,示例:
在minion端运行:
  salt-call state.apply -l debug
或则打开前台运行观察详细执行情况
  salt-minion -l debug

时间: 2024-08-08 22:08:32

CONFIGURATION MANAGEMENT(第一部分)的相关文章

Ansible Configuration Management

安装ansible 只需要将管理节点安装ansible ,被管理节点不需要安装 但如果使用yum安装的话,必须配置epel源 rpm -Uvh  http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm rpm -import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 安装依赖关系包 yum -y install python-dev python-yamlpython-par

《Continuous Delivery》 Notes 2: Configuration Management

What is Configuration Management? Configuration Management refers to the process by which all artifacts relevant to your project, and the relationships between them, are stored, retrieved, uniquely identified and modified. As a good configuration man

Configuration Management

本来一直想做一个配置管理方面的工具,目的是能根据配置项自动生成配置页面.这样就可以省去很多编写配置界面的工作.但是根据最近的一些研究,发现这样的需求并不是很大,因为: 如果是简单的配置项,现在有很多开源的工具可以做这样的配置.例如Disconf 如果是比较复杂的配置,并不建议用配置页面.原因有两: 复杂配置不易暴露给客户.不然客户的抱怨会远大于这些配置带给他们的灵活度. 如果配置只是内部使用,那么更建议用SQL Script去做配置.这样更便于环境建的配置复制. 因为部署环境间有许多差别,如果用

软件工程读书笔记(1)——第一章 概述

第一章 概述 一.软件工程概念的提出 1968年NATO(North Atlantic Treaty Organization,北大西洋公约组织)会议首次提出“软件工程”概念. 软件工程是为了解决开发成本效益和软件质量的问题而产生. 二.软件 1.什么是软件? <IEEE Standard Glossary of Software Engineering Terminology>给出了有关软件的如下定义: 软件是计算机程序.规程以及运行计算机系统可能需要的相关文档和数据.(软件≠程序) 根据软

2017-2018-1 20179215 《构建之法》第一章总结

<构建之法>第一章总结 1.程序=数据结构+算法. 软件=程序+软件工程 ?客户们对程序员的需求从一个简单的程序,扩展到一个满足各种功能的应用软件,再扩展到一个能保证维修的软件服务程序,在这里指的是源程序,就是一行行的代码.仔细看过去,它们的确是建立在数据结构上的一些算法程序还要对数据进行操作,这些数据有些是静态的(例如软件的图标.提示信息),有些是动态的(例如程序生成的随机数字.程序通过网络下载的数据.用户的文字或语音输入等)但是光有代码和静态数据还是不行,工程师要把它们构建为机器能懂的可执

软件构造 第二章 第一节 软件生命周期和版本控制

软件构造第二章 第一节 软件生命周期和版本控制 基本内容 Software Development Lifecycle (SDLC) Traditional software process models (waterfall, incremental, V- model, prototyping, spiral) Agile development and eXtreme Programming (XP) Collaborative software development Software

浅谈对《构建之法——现代软件工程》第一章的理解

---恢复内容开始--- 一.精读第一章后对专业术语的整理 <构建之法——现代软件工程>一书第一章向我们主要介绍了计算机科学的领域.软件工程与计算机科学的关系.软件的特性以及软件工程的定义与组成部分. 1.通过对第一章的学习,我们了解到了软件的 几种分类: 系统软件:操作系统.设备驱动程序.工具软件等 应用软件:办公软件.通信软件.游戏视频软件等 恶意软件:软件病毒等 以及软件的几种特殊性:1.负责性:2.不可见性:3.易变性:4.服从性:5.非连续性: 2.软件工程与计算机科学的关系 首先,

《构建之法》第一章术语及书中部分问题解答

• 第一章专业术语: * 软件=程序+软件工程 * 程序=数据结构+算法 * 软件服务 * 软件架构(Software Architecture) * 软件设计与实现(Sofeware Design,Implementation and Debug) * 软件构建 * 源代码管理(Source Code Control) * 配置管理(Software Configuration Management) * 软件测试(Test) * 需求分析(Requirement Analysis) * 软件

《构建之法》阅读笔记第一篇——软件工程概论

1.软件=程序+软件工程 程序(源代码)是一行行的代码,是建立在数据结构上的一些算法.程序还要对数据进行操作,这些数据有的是静态的(如软件图标.提示信息),有的是动态的(如程序生成的随机数字.程序通过网络下载的数据.用户的文字或语音输入等). 光有代码和静态数据是不行的,工程师要把她们构件为机器能懂的可执行代码.一个复杂的软件不但要有合理的软件架构.软件设计与实现,还要有各种文件和数据来描述各个程序文件之间的依赖关系.编译参数.链接参数等等.这些都是软件构建的过程. 软件团队的成员每天都修改源代