zoukankan      html  css  js  c++  java
  • Saltstack学习(四)-state状态模块及配置管理

    一、state状态模块

    1.1、状态模块简介

    StatesSaltStack系统中的配置语言,在日常运维中需要编写大量的States文件,例如:创建用户、安装软件、配置软件、服务运行等。需要编写一些States SLS文件,即状态配置文件去描述和实现相应的功能。
    States SLS主使用YAML语言,也可以支持使用Python语言编写。

    apache-install: #ID声明,ID必须唯一
      pkg.installed: #State状态声明
        - names: #选项声明
          - httpd  #选项列表
          - httpd-devel
     
    apache-service:
      service.running:  
        - name: httpd   
        - enable: True
    
    #一个ID只能出现一次
    #一个ID下相同模块只能使用一次
    #一个ID下可以使用多个不同模块

    查找状态模块:https://docs.saltstack.com/en/latest/ref/states/all

    [root@salt-master ~]# salt 'salt-minion1-c7' sys.list_modules   #列出所有状态模块
    [root@salt-master ~]# salt 'salt-minion1-c7' sys.list_state_functions pkg  #查看状态模块中支持的函数
    salt-minion1-c7:
        - pkg.downloaded
        - pkg.group_installed
        - pkg.installed
        - pkg.latest
        - pkg.mod_aggregate
        - pkg.mod_init
        - pkg.mod_watch
        - pkg.patch_downloaded
        - pkg.patch_installed
        - pkg.purged
        - pkg.removed
        - pkg.uptodate

    1.2、常用状态模块

    1.2.1、pkg模块

    文档:https://docs.saltstack.com/en/latest/ref/states/all/salt.states.pkg.html#module-salt.states.pkg

    1)软件安装

    mypkgs:
      pkg.installed:
        - pkgs:
          - httpd
          - httpd-tools: '>=2.4.6' #指定相应的版本

    2)指定安装的rpm来源

    mypkgs:
      pkg.installed:
        - sources:
          - foo: salt://rpms/foo.rpm
          - bar: http://somesite.org/bar.rpm
          - qux: ftp://somesite.org/qux.rpm

    3)指定安装最新的版本

    mypkgs:
      pkg.latest:
        - pkgs:
          - httpd
          - httpd-tools

    1.2.2、file模块

    文档:https://docs.saltstack.com/en/latest/ref/states/all/salt.states.file.html#module-salt.states.file

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

    /etc/resolv.conf:
      file.managed:
        - source: salt://files/resolv.conf.defaults
        - user: root
        - group: root
        - mode: 644
        - backup: minion

    2)file.directory建立目录

    /tmp/dns:
      file.directory:
        - user: root
        - group: root
        - mode: 755
        - makedirs: True

    3)file.recurse下发整个目录

    nginx-vhost-config:
      file.recurse:
        - name: /etc/nginx/conf.d
        - source: salt://app/files/nginx_conf.d
        - file_mode: 600 #文件权限
        - dir_mode: 777 #目录权限
        - include_empty: True #同步空目录
        - clean: True #使用后minion与master强制一致

    4)file.symlink建立软连接

    /etc/target.conf:  #目标
      file.symlink:
        - target: /etc/grub2.cfg #源

    1.2.3、service模块

    redis-service:
      service.running:
        - enable: True #开机自启动
        - reload: True #允许重载,不写则是restart
        - watch: #我监控谁
          - pkg.redis-files

    1.2.4、cron模块

    crontab_scripts:
      cron.present:
        - name: bash /scripts/nginx.sh &>/dev/null
        - user: root
        - minute: '*/5'

    1.3、高级状态模块

    top.sls默认从base标签开始解析执行,下一级是操作的目标,可以通过正则,grain模块,或分组名,来进行匹配,再下一级是要执行的state文件

    topfile实例:

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

    执行方式:

    salt '*' state.highstate

    二、配置管理实例-LAMP及redis主从

    2.1、状态依赖及关联

    主机涉及多个状态时,状态之间可能有相互关联,需要决定先后执行顺序,解决依赖关系

    require		我依赖某个状态, 我依赖谁
    require_in	我被某个状态依赖, 谁依赖我
    watch		我关注某个状态, 当状态发生改变,进行restart或reload操作
    watch_in	我被某个状态关注
    include		我引用谁

    2.2、LAMP架构实现

    1)编辑master主配置文件

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

    2)创建相关目录

    [root@salt-master salt]# tree
    .
    ├── base
    └── prod
        ├── apache
        ├── mysql
        └── php

    3)先手动安装,便于提取文件

    [root@salt-master ~]# yum -y install httpd mariadb-server php php-mysql php-gd gd

    4)准备相应目录及文件

    #目录结构
    [root@salt-master salt]# tree /srv/salt/
    /srv/salt/
    ├── base
    │   └── top.sls
    └── prod
        ├── apache
        │   ├── files
        │   │   └── httpd.conf
        │   └── init.sls
        ├── lamp.sls
        ├── mysql
        │   ├── files
        │   │   └── my.cnf
        │   └── init.sls
        └── php
            ├── files
            │   └── php.ini
            └── init.sls
    
    #apache配置文件
    [root@salt-master salt]# cat prod/apache/init.sls 
    apache-install:
      pkg.installed:
        - name: httpd
    
    apache-config:
      file.managed:
        - name: /etc/httpd/conf/httpd.conf
        - source: salt://apache/files/httpd.conf
        - user: root
        - group: root
        - mode: 644
        - backup: minion
        - require:
          - pkg: apache-install
    
    apache-service:
      service.running:
        - name: httpd
        - enable: True
        - reload: True
        - require:
          - file: apache-config
        - watch:
          - file: apache-config
    
    #php配置文件
    [root@salt-master salt]# cat prod/php/init.sls 
    php-install:
      pkg.installed:
        - pkgs:
          - php
          - php-pdo
          - php-mysql
          - php-gd
          - gd
        - require_in:
          - file: php-config
    
    php-config:
      file.managed:
        - name: /etc/php.ini
        - source: salt://php/files/php.ini
        - user: root
        - group: root
        - mode: 644
        - backup: minion
        - watch_in:
          -service: apache-service
    
    #mysql配置文件
    [root@salt-master salt]# cat prod/mysql/init.sls 
    mysql-install:
      pkg.installed:
        - pkgs:
          - mariadb
          - mariadb-server
    
    mysql-config:
      file.managed:
        - name: /etc/my.cnf
        - source: salt://mysql/files/my.cnf
        - user: root
        - group: root
        - mode: 644
        - backup: minion
        - reqiure:
          - pkg: mysql-install
    
    mysql-service:
      service.running:
        - name: mariadb
        - enable: True
        - reload: True
        - require:
          - file: mysql-config
        - watch:
          - file: mysql-config
    
    #lamp配置文件
    [root@salt-master salt]# cat prod/lamp.sls 
    include:
      - apache.init
      - php.init
      - mysql.init
    
    #topfile文件,需要定义在base中
    [root@salt-master salt]# cat base/top.sls 
    prod:
      'salt-minion3-c7':
        - lamp

    执行需要注意

    [root@salt-master salt]# salt 'salt-minion3*' state.highstate test=True   #正式执行之前先干跑下
    [root@salt-master salt]# salt 'salt-minion3*' state.highstate  #正式执行
    
    #执行单个模块,如apache
    [root@salt-master salt]# salt 'salt-minion3*' state.sls apache.init saltenv=prod  #需要指定环境

    2.3、redis主从实现

    先手工配置,然后写sls配置文件

    1)redis目录结构

    [root@salt-master prod]# tree redis
    redis
    ├── files
    │   └── redis.conf
    ├── init.sls
    ├── master.sls
    └── slave.sls

    2)相关配置文件

    [root@salt-master redis]# cat init.sls 
    redis-install:
      pkg.installed:
        - name: redis
    
    redis-config:
      file.managed:
        - name: /etc/redis.conf
        - source: salt://redis/files/redis.conf
        - user: root
        - group: root
        - mode: 644
        - backup: minion
        - template: jinja
        - defaults:
          PORT: 6379
          IPADDR: {{ grains['fqdn_ip4'][0] }}
    
    redis-service:
      service.running:
        - name: redis
        - enable: True
        - reload: True
        - watch:
          - file: redis-config
    
    #master配置文件
    [root@salt-master redis]# cat master.sls 
    include:
      - redis.init
    
    #slave配置文件,需要配置主从
    [root@salt-master redis]# cat slave.sls 
    include:
      - redis.init
    
    salve-config:
      cmd.run:
        - name: redis-cli -h 10.0.0.22 slaveof 10.0.0.21 6379
        - unless: redis-cli -h 10.0.0.22 info|grep role:slave
        - require:
          - service: redis-service
    
    #topfile文件
    [root@salt-master redis]# cat /srv/salt/base/top.sls 
    #prod:
    #  'salt-minion2-c7':
    #    - lamp
    
    prod:
      'salt-minion1-c7':
        - lamp
        - redis.master
      'salt-minion2-c7':
        - lamp
        - redis.slave 
      'salt-minion3-c7':
        - lamp

    三、Jinja模板的使用

    当配置文件需要根据主机的不同而改变时,就需要使用jinja模板,这样更加灵活

    jinja使用变量{{….}}和表达式{%….%}

    jinja中文文档:http://docs.jinkan.org/docs/jinja2/

    3.1、jinja变量

    1)字符串类型

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

    2)列表类型

    {% set list = ['one', 'two', 'three'] %}
    {{ list[1] }}  #最终显示one

    3)字典类型

    {% set dict = {'first': 'value1', 'second': 'value2'} %}
    {{ dict['first'] }}

    3.2、使用jinja模板步骤

    通用步骤:

    #1.告诉file状态模块, 需要使用jinja
      - template: jinja
    #2.列出参数列表
      - defaults:
        PORT: 88
    #3.配置文件引用jinja模板
    {{ PORT }}

    配置示例:

    # 配置示例
    httpd-config:
      file.managed:
        - name: /etc/httpd/conf/httpd.conf
        - source: salt://init/files/httpd.conf
        - backup: minion
        - template: jinja
        - defaults:
          PORT: 9000
    
    # 修改httpd.conf配置文件引用变量
    Listen {{ PORT }}

    3.3、使用grains,pillar赋值

    1)使用grains赋值

    #配置httpd模板
    Listen {{ grains['fqdn_ip4'][0] }}:{{ PORT }}    #salt '*' grains.item fqdn_ip4或者salt '*' grains.get fqdn_ip4获取
    
    #编辑sls文件
    [root@salt-master apache]# vim init.sls  #添加
        - template: jinja
          IP: {{ grains['fqdn_ip4'][0] }}
          PORT: 8080
    
    #测试
    [root@salt-master apache]# salt -S '10.0.0.21' state.sls apache.init saltenv=prod

    示例:使用jinja+grains安装不同系统的apache

    httpd_install:
      pkg.installed:
    {% if grains['os_family'] == 'Debian' %}
        - name: apache2
    {% elif grains['os_family'] == 'RedHat' %}
        - name: httpd
    {% endif %}

    2)使用pillar赋值

    #master打开pillar
    [root@salt-master pillar]# vim /etc/salt/master  
    pillar_roots:
      base:
        - /srv/pillar
    
    #编写pillar文件
    [root@salt-master pillar]# cat apache.sls 
    apache:
      IP: {{ grains['fqdn_ip4'][0] }}
      PORT: 8090 
      
    [root@salt-master pillar]# cat top.sls 
    base:
      'salt-minion1-c7':
         - zabbix
         - apache   #添加
    
    #模板及sls文件调用
    [root@salt-master apache]# vim init.sls
        - template: jinja
          IP: {{ pillar['apache']['IP'] }}  #注意需要加引号,否则报Jinja variable 'IP' is undefined
          PORT: {{ pillar['apache']['PORT'] }}
    
    #httpd模板
    Listen {{ IP }}:{{ PORT }}

    四、Salt Job管理

    4.1、salt job概述

    salt每次运行任务都会将任务发布到pub-sub总线,minion会对任务作出响应,为区分不同的任务SaltMaster每次发布一个任务都会为该任务创建一个jobid。

    master默认情况下会缓存24小时内的所有job的详细操作。/etc/salt/master中keep_jobs控制

    master缓存目录:/var/cache/salt/master/jobs/

    minion缓存目录:/var/cache/salt/minion/proc,会创建以jobid为名称的文件

    #master上执行
    [root@salt-master apache]# salt '*' cmd.run "sleep 100"
    
    #minion上测试
    [root@salt-minion1-c7 conf]# ls /var/cache/salt/minion/proc
    20190831231027455618
    [root@salt-minion1-c7 conf]# strings /var/cache/salt/minion/proc/20190831231027455618 
    tgt_type
    glob
    20190831231027455618
    user
    root
    sleep 100
    cmd.run

    4.2、job管理

    可以使用saltutil模块来管理job

    #master上执行一个长时间命令
    [root@salt-master ~]# salt '*' cmd.run "sleep 100"
    
    #新开一个master端口,查看正在运行的jobs
    [root@salt-master ~]# salt '*' saltutil.running
    
    #通过saltutil.find_job查看相关job信息
    [root@salt-master ~]# salt '*' saltutil.find_job 20190831232203795443
    
    #kill掉指定的job
    [root@salt-master ~]# salt '*' saltutil.kill_job 20190831232203795443
  • 相关阅读:
    关于根据索引 删除队
    Vs 2012 编译C 语言
    动态绑定 dgvlist 列
    自定义控件闪烁问题
    程序员都不读书,但你应该读
    对于委托的理解 委托和事件
    ​label 中 文字的位置
    vs2010 折叠C/c++中的if
    关于动态创建控件性能提高 以及 SuspendLayout & ResumeLayout 的使用
    c# WinForm开发 DataGridView控件的各种操作总结(单元格操作,属性设置)
  • 原文地址:https://www.cnblogs.com/hujinzhong/p/11439101.html
Copyright © 2011-2022 走看看