1. 程式人生 > >自動化運維之saltstack(2)

自動化運維之saltstack(2)

這次主要介紹saltstack的配置管理,這一部分在企業應用中比較重要,也經常用到。
states是saltstack系統中的配置語言,在日常運維中需要編寫大量的states檔案,例如:建立使用者、安裝軟體、配置軟體、服務執行等。需要編寫一些"states sls"檔案。該檔案主要使用YAML語言,也可以支援使用python語言編寫。

配置管理中常用模組

pkg模組

列出所有狀態模組
salt '' sys.list_modules
檢視狀態模組中的函式:如pkg模組
[[email protected] _grains]# salt '
' sys.list_state_functions pkg
salt-minion01:

  • 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
    salt-minion02:
  • 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

    file模組
    [email protected] app]# mkdir files
    [[email protected] app]# cp /etc/resolv.conf files/
    [[email protected] app]# cat dns.sls
    dns-config:
    file.managed:

  • name: /etc/resolv.conf #file of
  • source: salt://app/files/resolv.conf salt代表file根目錄
  • user: root
  • group: root
  • mode: 644
    • backup: minion ------備份到minion端
      修改/srv/salt/app/files下的resolv.conf檔案
      [[email protected] files]# cat resolv.conf

nameserver 101.206.4.6
nameserver 114.114.114.114
###########saltstack configure ----------》新增一行註釋
salt 'salt-minion01' state.sls app.dns test=True 測試
salt 'salt-minion01' state.sls app.dns
檢視
[[email protected] salt]# cat /etc/resolv.conf

nameserver 101.206.4.6
nameserver 114.114.114.114
###########saltstack configure
file.directory ------建立目錄

[[email protected] app]# cat dir.sls
mkdir_tmp_dns:
file.directory:

  • name: /tmp/dns
  • user: root
  • group: root
  • mode: 755
  • makedirs: True

目錄下發 file.recurse
[[email protected] app]# cat xf.sls
httpd-config:
file.recurse:

  • name: /etc/httpd/conf.d/
  • source: salt://app/files/httpd_conf.d
  • file_mode: 644
  • dir_mode: 755
  • include_empty: True
  • clean: True #####遠端強制刪除
    mkdir files/httpd_conf.d
    [[email protected] app]# cat files/httpd_conf.d/www.conf
    server {

    www
    }
    [[email protected] app]# cat files/httpd_conf.d/blog.conf
    erver {
    blog

}
[[email protected] app]# salt 'salt-minion01' state.sls app.xf
minion01
[[email protected] tmp]# ls /etc/httpd/conf.d/
autoindex.conf fcgid.conf README userdir.conf www.conf
blog.conf manual.conf ssl.conf welcome.conf

可以直接採用以下方法:
[[email protected] app]# cat ln.sls
Link:
cmd.run:

  • name: ln -s /tmp /mnt

service模組
httpd_service:
service.running:

  • name: httpd
  • enable: True
  • reload: True #######允許過載,不寫表示restart
  • watch: #####監控誰
    -pkg.httpd-file

    cron模組
    [[email protected] app]# cat cron.sls
    crontab_scripts:
    cron.present:

  • name: /usr/bin/uptime >/dev/null 2>&1
  • user: root
  • minute: '/5'
    salt 'salt-minion01' state.sls app.cron
    結果:
    [[email protected] tmp]# crontab -l
    /30 /usr/sbin/ntpdate time.windows.com
    /5 * /usr/bin/uptime >/dev/null 2>&1

    高階狀態模組,高階狀態檔案需要在base環境下編寫
    base:
    '*': 匹配所有minion

  • app.httpd #base模組下httpd目錄下的安裝sls檔案
    #webserver: #定義的分組名稱進行匹配,需要定義nodegroups

    'os:centos': #通過grains模組匹配

  • match: grains
  • app.cron
    top.sls需要寫在/srv/salt下
    執行是salt '*' state.highstate

LAMP架構部署

此案例在prod生產環境下部署
修改master端配置檔案
file_roots:
base:

  • /srv/salt/base
    prod:
  • /srv/salt/prod

systemctl restart salt-master
mkdir /srv/salt/{base,prod} -p
把之前的基礎環境下寫的放在base下
1 先手動安裝lamp環境
yum install httpd mariadb mariadb-server php php-mysql php-gd gd -y
[[email protected] init]# pwd
/srv/salt/prod/init
mkdir files -------相關配置寫在該目錄下
2 準備相應目錄與對應配置檔案
cp /etc/httpd/conf/httpd.conf files/
cp /etc/my.cnf files/
cp /etc/php.ini files/
在init目錄下寫lamp安裝,配置 啟動
3 部署狀態檔案lamp.sls
[[email protected] init]# cat lamp.sls
#yum install httpd mariadb-server php php-mysql php-gd gd -y
httpd-install:
pkg.installed:

  • names:
    • httpd
    • httpd-tools
      httpd-config:
      file.managed:
  • name: /etc/httpd/conf/httpd.conf
  • source: salt://init/files/httpd.conf
  • user: root
  • group: root
  • mode: 644
  • backup: minion
    httpd-service:
    service.running:
  • name: httpd
  • enable: True
  • reload: True
    php-install:
    pkg.installed:
  • names:
    • php
    • php-mysql
    • php-gd
    • gd
      php-config:
      file.managed:
  • name: /etc/php.ini
  • source: salt://init/files/php.ini
  • user: root
  • group: root
  • mode: 644
  • backup: minion
    mysql-install:
    pkg.installed:
  • names:
    • mariadb
    • mariadb-server
      mysql-config:
      file.managed:
  • name: /etc/my.cnf
  • source: salt://init/files/my.cnf
  • user: root
  • group: root
  • mode: 644
  • backup: minion
    mysql-service:
    service.running:
  • name: mariadb
  • enable: True

salt 'salt-minion01' state.sls init.lamp saltenv=prod 指定為prod環境,因為預設為base環境
通過高階狀態進行管理

通過高階狀態來管理更方便,需要在base下寫top.sls

[[email protected] base]# cat top.sls
prod:
'salt-minion01':

  • init.lamp

然後執行salt 'salt-minion01' state.highstate
檢視目錄結構
[[email protected] base]# tree /srv/salt/
/srv/salt/
├── base
│ ├── app
│ │ ├── cron.sls
│ │ ├── dir.sls
│ │ ├── dns.sls
│ │ ├── files
│ │ │ ├── httpd_conf.d
│ │ │ │ ├── blog.conf
│ │ │ │ └── www.conf
│ │ │ └── resolv.conf
│ │ ├── httpd.sls
│ │ ├── ln.sls
│ │ ├── service.sls
│ │ ├── vsftpd.sls
│ │ └── xf.sls
│ ├── _grains
│ │ └── my_grains.py
│ ├── top.sls
│ └── top.sls20181121
└── prod
└── init
├── files
│ ├── httpd.conf
│ ├── my.cnf
│ └── php.ini
└── lamp.sls
states狀態依賴管理
可以用state模組來定義minion的狀態,但是如果一個主機涉及多個狀態,並且狀態之間有相互關聯,需要在執行順序上有先後之分,那麼必須引入requisites 來進行控制。

  1. require 我依賴某個狀態,我依賴誰
  2. require_in 我被某個狀態依賴,誰依賴我
  3. watch 我監控某個狀態,如當狀態發生變化時,就進行restart或reload操作
  4. watch_in 我被某個狀態關注
  5. include 我引用誰
    require寫法
    httpd-install:
    pkg.installed:
    • names:
      • httpd
      • httpd-tools
        httpd-config:
        file.managed:
    • name: /etc/httpd/conf/httpd.conf
    • source: salt://init/files/httpd.conf
    • user: root
    • group: root
    • mode: 644
    • backup: minion
    • require:
      • pkg: httpd-install 因為要修改配置需要先安裝軟體

watch寫法
httpd-service:
service.running:

  • name: httpd
  • enable: True
  • reload: True
  • require:
    • file: httpd-config
  • watch:
    • file: httpd-config
      watch_in寫法
      php-config:
      file.managed:
  • name: /etc/php.ini
  • source: salt://init/files/php.ini
  • user: root
  • group: root
  • mode: 644
  • backup: minion
  • watch_in:
    • service: httpd-service
      利用include將lamp拆分,如將mysql拆分出來

[[email protected] init]# cat mysql.sls
mysql-install:
pkg.installed:

  • names:
    • mariadb
    • mariadb-server
      mysql-config:
      file.managed:
  • name: /etc/my.cnf
  • source: salt://init/files/my.cnf
  • user: root
  • group: root
  • mode: 644
  • backup: minion
  • require:
    • pkg: mysql-install
      mysql-service:
      service.running:
  • name: mariadb
  • enable: True
  • require:
    • file: mysql-config

[[email protected] init]# mv lamp.sls apache.sls
在prod目錄建立lamp.sls
[[email protected] prod]# cat lamp.sls
include:

  • init.apache
  • init.mysql
    執行salt 'salt-minion01' state.sls lamp saltenv=prod
    通過高階狀態管理:修改topfile檔案如下:
    prod:
    'salt-minion01':
    • lamp

Jinja模板使用

配置檔案一般都是固定無法靈活多變,實際生產過程中,需要配置檔案靈活多變,不能寫死,有時還需要進行流程控制,這就需要用到jinjia,可以很靈活地進行配置管理及簡化配置過程。
Jinja2模板包含變數和表示式
變數用{{...}}包圍,表示式用{%...%}包圍

看一個簡單的例子
[[email protected] prod]# cat var.sls
{% set var= 'hello world!' %}
test_var:
cmd.run:

  • name: echo "{{ var }}"
    字串型別
    {% set var= 'hello world!' %}
    列表型別
    {% set list = ['one','two' ] %}
    {{ list[1]}}

字典型別
{% set dict = {'first':'value','second':'value1'} %}
{{ dict['first'] }}

 Jinja模板使用步驟
  1. 告訴file狀態模組,需要使用jinja
    • template: jinja
      2列出引數列表
    • defaults:
      PORT: 88
      3.配置檔案引用jinja模板
      {{ PORT }}
      配置例項,修改apache埠
      httpd-config:
      file.managed:
    • name: /etc/httpd/conf/httpd.conf
    • source: salt://init/files/httpd.conf
    • user: root
    • group: root
    • mode: 644
    • backup: minion
    • require:
      • pkg: httpd-install
    • template: jinja
    • defaults:
      PORT: 8000
      files目錄下http配置檔案中將Listen 80改為Listen {{ PORT }}
      然後執行salt 'salt-minion01' state.highstate
      檢視minion端埠已改動
      [[email protected] ~]# netstat -tnlp|grep 8000
      tcp6 0 0 :::8000 :::* LISTEN 3915/httpd

模板支援grains pillar進行賦值
grains方式
通過grains獲取minion端IP
[[email protected] prod]# salt 'salt-minion01' grains.item fqdn_ip4
salt-minion01:

fqdn_ip4:
    - 192.168.132.31

如果想在http配置檔案中使用IP:PORT
Listen {{ IPADDR}}:{{ PORT }}
apache檔案中修改

  • defaults:
    PORT: 8000
    IPADDR: {{ grains['fqdn_ip4'][0]}} ---取列表中的第一個值即IP地址

    pillar方式:
    apache:
    IP: {{ grains['fqdn_ip4'][0] }}
    PORT: 8008
    引用
    {{ pillar['apache'][IP] }}
    {{ pillar['apache'][port] }}

實際場景中,如系統有centos和ubuntu,都要安裝apache,由於安裝的包不一樣,則可以根據grains靜態資料,使用jinja2流程控制
httpd_install:
pkg.installed:

  • template: jinja
    {% if grains['os_family'] == 'Debian' %}

    • name: apache2
      {% elif grains['os_family'] == 'RedHat' %}
    • name: http
      {% endif %}

      saltstack Job管理

      Job概述
      salt每次執行任務都會將任務釋出到pub-sub匯流排,minion會對任務作出響應,為區分不同的任務,saltmaster每次釋出一個任務都會為該任務建立一個jobid。
      master預設情況下會快取24小時內的所有job的詳細操作
      master快取目錄:/var/cache/salt/master/jobs/
      minion端每次執行任務都會快取在/var/cache/salt/minion/proc/目錄下,任務執行完成後檔案會被刪除。
      在master端執行一個長時間的任務
      salt 'salt-minion01' cmd.run "sleep 100"
      在minion01上用strings檢視檔案內容
      [[email protected] proc]# strings 20181125111411231106
      tgt_type
      glob
      20181125111411231106
      salt-minion01
      user
      root
      sleep 100
      cmd.run

    Job管理
    通過salt-run 命令來管理job也可以通過salt util模組
    在master中執行一個長時間的命令
    salt 'salt-minion01' cmd.run "sleep 1000;echo hello"
    然後ctrl+c結束,獲取jobid後登陸檢視
    salt 'salt-minion01' saltutil.find_job-id
    salt 'salt-minion01' saltutil.kill_job jobid 停掉任務
    檢視master上cache的所有job
    salt 'salt-minion' saltutil.runner jobs.list_jobs