设为首页 收藏本站
查看: 822|回复: 0

[经验分享] SaltStack (二)

[复制链接]

尚未签到

发表于 2018-7-31 11:17:14 | 显示全部楼层 |阅读模式
  SaltStack配置管理
  saltstack配置管理又称为状态管理,saltstack无法对状态进行回滚。在我们编写sls文件时,要支持多次执行,如:编写了软件的安装模块,每次执行这个状态时,都会去检查这个软件是否安装。
  在saltstack中编写的sls描述文件实质是salt stack的缩写,使用的是YAML的描述语法。
  sls文件说明
# cat /srv/salt/web/apache.sls  
apache-install:       #ID声明,ID必须唯一
  
  pkg.installed:      #state声明,状态声明,执行什么操作
  
    - names:          #选项声明,具体行为参数
  
      - httpd
  
      - httpd-devel
  sls文件格式有多种写法,一般都包含这三部分,多个参数会使用'-' 列表,使用层级递进关系。
  使用SaltStack安装LAMP
  在安装LAMP环境时,使用不同的配置文件来完成整改环境的安装和部署。整个过程可以分为三步:
  1、使用pkg 模块安装软件包
  2、使用file 模块修改配置文件
  3、使用service 模块启动服务
  PKG模块
  https://docs.saltstack.com/en/latest/ref/states/all/salt.states.pkg.html#module-salt.states.pkg
  使用pkg.installed 可以同时安装多个软件包:
common_packages:  
  pkg.installed:
  
    - pkgs:          #指定多个包
  
      - unzip
  
      - dos2unix
  
      - salt-minion: 2015.8.5-1.el6  #末尾指定版本
  pkg中其他的一些常用方法:
pkg.installed     # 安装  
pkg.latest        # 确保最新版本
  
pkg.remove        # 卸载
  
pkg.purge         # 卸载并删除配置文件
  lamp中对于apache,mysql,php的安装,先创建目录和sls文件:
mkdir /srv/salt/lamp  
vim /srv/salt/lamp/lamp.sls
  安装LAMP环境编写的配置:
lamp-pkg:  
  pkg.installed:
  
    - pkgs:
  
      - httpd
  
      - php
  
      - mariadb
  
      - mariadb-server
  
      - php-mysql
  
      - php-cli
  
      - php-mbstring
  File模块
  https://docs.saltstack.com/en/latest/ref/states/all/salt.states.file.html#module-salt.states.file
  当需要对安装的服务修改配置时,通过file模块来分发对应的配置文件,对于不同的服务必须要使用不同的ID,在同一个ID下不能有两个及以上的模块方法行为。如在下面的lamp.sls的文件中,一个ID下面只能有一个file.managed的方法调用。
  lamp中对于apache,mysql,php的文件配置,增加如下内容到lamp.sls:
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 #此处表示当前环境的根目录(当前环境分为base、dev、pro)
  
    - 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
  对于source中指定的路径,必须要是当前环境的根目录为起始路径,如在master的配置文件中,指定了base环境则为/srv/salt. dev环境和pro环境在master配置文件中分别指定了对应的起始路径。
  将各个服务需要的配置文件放入指定的路径中,如果没有这些配置文件,可以在一台机上安装对应的软件,然后将配置文件拷贝到指定路径(这里对应文件中source指定的/srv/salt/files):
cp /etc/httpd/http.conf /srv/salt/lamp/files/  
cp /etc/php.ini /srv/salt/lamp/files/
  
cp /etc/my.cnf /srv/salt/lamp/files/
  这样当执行file.managed模块时,会自动将配置好的配置文件分发到对应的目录中。
  Service模块
  service模块用来启用服务,在lamp.sls文件最后,添加如下内容:
apache-service:  
  service.running:     #启动服务模块
  
    - name: httpd      #需要指定服务名称,否则会将ID名称当做服务名称而出错
  
    - enable: True     #开机自启动
  
    - reload: True     #重载
  
mysql-service:
  
  service.running:
  
    - name: mariadb
  
    - enable: True
  
    - reload: True
  在master上执行部署命令:
# salt 'node2' state.sls lamp.lamp  在node2上,这些服务会自动安装,替换文件,并且启动。
  由于同一个ID和同一个状态模块只能使用一次,所以上面的配置文件也可以按照单个服务的部署流程来写,在一个ID下对一个服务定义一系列动作:
apache-service:  
  pkg.installed:
  
    - pkgs:
  
      - httpd
  
  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
  注意:sls文件的解析模式是从上往下,按顺序解析,在编写模块时,要注意顺序,比如要安装完才能配置、启动服务。
  状态间关系
  在各个模块相互调用的时候,就涉及到一个先后顺序的问题,如当我们需要启动某项服务的时候,必须确保先安装这个服务,配置完成才能启动。对于模块之间复杂的调用,需要有一个定义它的方式来指定状态间的关系。
  各个状态之间存在一些相互作用的关系,主要有下面几种关系:
  1、依赖谁          require,如运行启动服务的模块必须先运行安装模块 ,也依赖于配置模块
  2、被谁依赖      require_in,安装模块被启动模块依赖
  3、监控谁          watch, 如果监控的模块状态变化就reload,如果没有reload参数,则会重启。
  4、被谁监控      watch_in,和watch功能相同,模块的对象和位置是对应的。
  5、引用谁         include  直接导入执行其他的文件并执行,可以指定多个文件去运行。
  6、扩展谁
  如上面的实例:
lamp-pkg:  
  pkg.installed:
  
    - pkgs:
  
      - httpd
  
      - php
  
      - 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
  
    - require:    #依赖于安装模块
  
      - pkg: lamp-pkg   #状态模块: ID
  
php-config:
  
  file.managed:
  
    - name: /etc/php.ini
  
    - source: salt://lamp/files/php.ini
  
    - user: root
  
    - group: root
  
    - mode: 644
  
    - require:    #依赖于安装模块
  
      - pkg: lamp-pkg  #状态模块:ID
  
mysql-config:
  
  file.managed:
  
    - name: /etc/my.cnf
  
    - source: salt://lamp/files/my.cnf
  
    - user: root
  
    - group: root
  
    - mode: 644
  
    - require:    #依赖于安装模块
  
      - pkg: lamp-pkg
  

  
apache-service:
  
  service.running:
  
    - name: httpd
  
    - enable: True
  
    - reload: True
  
    - require:          #依赖于安装和配置模块
  
      - pkg: lamp-pkg
  
      - file: apache-config
  
    - watch:            # 当监控的apache-config状态(文件)发生变化就执行reload
  
      - file: apache-config
  
    #注意:如果此状态模块中没有- enable: True参数,状态变化时则会重启服务。
  

  
mysql-service:
  
  service.running:
  
    - name: mariadb
  
    - enable: True
  
    - reload: True
  
    - require:         #此模块执行时,依赖于lamp-pkg和mysql-config模块
  
      - pkg: lamp-pkg
  
      - file: mysql-config
  include使用,可以将上面的内容分别写在不同的sls文件中,在主配置文件中使用include来是这些不同的文件依次运行:
# cat init.sls  
include:
  
  - lamp.pkg
  
  - lamp.config
  
  - lamp.service
  在当前目录中分别有pkg.sls, concfig.sls, service.sls 文件。
  执行salt命令时直接执行init.sls模块即可:
salt 'node2' state.sls lamp.init  如果将所有没有互相依赖的单个服务的安装配置启动写到一个sls文件中,在编写主配置的时候灵活性就会大大提高,可以选择需要服务的对应文sls件include。
  通过状态间的关系,可以将各个服务单独模块化,可以重复被其他模块调用,方便管理和配置。
  编写sls的技巧:
  1、安装状态分类。单独使用会很清晰。
  2、按服务分类,可以被其它的SLS include。
  Jinja模板
  Jinja2是python的模板语言。模板仅仅是文本文件,可以生成任何基于文本的格式。
  模板包含表达式和变量,分别用{%...%} 和``.``.``.`` 表示。使用jinja模板时一般有三个步骤:

  •   在使用Jinja模板时,需要在sls文件中声明使用jinja
- template: jinja

  •   列出参数列表,
- defaults:  
  PORT: 88    # 表示PORT变量的值为88

  •   模板的引用,
  在分发的配置文件中,可以将PORT变量的值赋予配置文件的参数:
Listen {{ PORT }}  # PORT变量的值会自动添加到变量中 Listen 88  Jinja中使用Grains
  在使用变量修改minion端修改某些minion自身的参数时,可以使用salt,grains和pillar来获取minion本身的参数,如本机的IP地址。
  先在sls的配置文件中添加Jinja模板
- template: jinja  如上例,修改httpd.conf文件监听端口:
Listen {{ grains['fqdn_ip4'][0]}}:{{ PORT }}  这里的fqdn_ip4是获取的 grains中 fqdn_ip4对应的输出:
# salt '*' grains.item fqdn_ip4  
node2:
  
    ----------
  
    fqdn_ip4:
  
        - 172.16.10.61
  
node1:
  
    ----------
  
    fqdn_ip4:
  
        - 172.16.10.60
  由于是一个列表,[0] 表示列表中的第一个值,也就是IP地址。对应到node2上的配置文件格式为:
Listen 172.16.10.61:88  Jinja中使用salt
  可以使用salt本身的模块获取主机参数,如获取本机eth0的mac地址:
# salt '*' network.hw_addr eth0  
node2:
  
    00:0c:29:04:73:9d
  
node1:
  
    00:0c:29:e8:97:67
  可以在某个需要填入本机mac地址配置的区域添加如下参数:
{{ salt['network.hw_addr']('eth0') }}  需要在sls中指定Jinja模板。
  Jinja中使用Pillar
  Jinja中也可以使用Pillar,如果有自定义的Pillar值,可以直接通过Jinja模板获取,当然首先必须添加了Jinja模板。
# salt '*' pillar.items  
node1:
  
    ----------
  
node2:
  
    ----------
  
    apache:
  
        httpd
  在配置文件中使用如下参数来获取pillar:
{{ pillar['apache'] }}  这样,在分发给node2上的配置文件就会 添加一个httpd的参数。
  这个用法可以用来配置文件中涉及到的账户密码等敏感信息。
  在SLS模板中定义
  也可以将需要配置写在SLS里面的Defaults,变量列表中。
- template: jinja  
- defaults:
  
      IPARRD: {{ grains['fqdn_ip4'][0] }}
  
      PORT: 88
  然后在文件中直接引用变量` IPADDR `即可。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-544080-1-1.html 上篇帖子: SaltStack-job管理 下篇帖子: SaltStck 搭建Web集群运用示例 (一)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表