saltstack--自動化運維管理


server1 :192.168.1.11 master端
server2 : 192.168.1.12 minion端
server3 : 192.168.1.13 minion端

saltstack簡介

  • saltstack是一個配置管理系統,能夠維護預定義狀態的遠程節點。
  • saltstack是一個分佈式遠程執行系統,用來在遠程節點上執行命令和查詢數據。
  • saltstack是運維人員提高工作效率、規範業務配置與操作的利器。

Salt的核心功能

  • 使命令發送到遠程系統是並行的而不是串行的

  • 使用安全加密的協議

  • 使用最小最快的網絡載荷

  • 提供簡單的編程接口

  • Salt同樣引入了更加細緻化的領域控制系統來遠程執行,使得系統成爲目標不止可以通過主機名,還可以通過系統屬性。

  • 區別:
    Salt 和ansible 最大的區別在於salt是具有客戶端的,而 ansible 沒有,salt 直接獲取root權限進行訪問

saltstack通信機制

  • SaltStack 採用 C/S模式,minion與master之間通過ZeroMQ(輕量級)消息隊列通信,默認監聽4505端口。saltstack的優勢就在於這個ZMQ,它運行起來的速度比ansible快很多

在這裏插入圖片描述

  • Salt Master運行的第二個網絡服務就是ZeroMQ REP系統,默認監聽4506端口,就是接受客戶端的回執的。

在這裏插入圖片描述

安裝與配置

  • 進入官網下載,或者使用國內的開源鏡像網站(如清華大學鏡像中科大鏡像網站或者阿里雲)進行下載:

      yum install https://mirrors.aliyun.com/saltstack/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
    
  • 設置官方yum倉庫
    因爲這條命令會產生一個新的yum源,然而這個yum源的鏡像地址並不是非常快,我們把它換成aliyun的地址,會快一些

      [root@rhel7 yum.repos.d]# ls
      redhat.repo  salt-latest.repo
      [root@rhel7 yum.repos.d]# cat salt-latest.repo 
      [salt-latest]
      name=SaltStack Latest Release Channel for RHEL/Centos $releasever
      baseurl=https://mirrors.aliyun.com/saltstack/yum/redhat/7/$basearch/latest
      ##阿里雲的鏡像地址
      failovermethod=priority
      enabled=1
      gpgcheck=1
      gpgkey=file:///etc/pki/rpm-gpg/saltstack-signing-key
    

    更改後查看yum源是否配置好:

      [root@rhel7 yum.repos.d]# yum repolist
      Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-
                    : manager
      This system is not registered with an entitlement server. You can use subscription-manager to register.
      repo id            repo name                                              status
      salt-latest/x86_64 SaltStack Latest Release Channel for RHEL/Centos 7Serv 83
      repolist: 83
    

    在server2上做同樣的配置。

    master節點配置:server1

      [root@rhel7 yum.repos.d]# yum install -y salt-master
      Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-
                    : manager
      This system is not registered with an entitlement server. You can use subscription-manager to register.
      Resolving Dependencies
      --> Running transaction check
      ---> Package salt-master.noarch 0:3000.3-1.el7 will be installed
      ......省略
      --> Finished Dependency Resolution
      Error: Package: salt-3000.3-1.el7.noarch (salt-latest)  ##注意這裏的依賴性並沒有得到解決
                 Requires: python-markupsafe
      Error: Package: salt-3000.3-1.el7.noarch (salt-latest)
                 Requires: python-jinja2
       You could try using --skip-broken to work around the problem
       You could try running: rpm -Va --nofiles --nodigest
    

    解決依賴性,成功安裝

      設置自啓動
      [root@server1 Downloads]# systemctl enable salt-master 
      Created symlink from /etc/systemd/system/multi-user.target.wants/salt-master.service to /usr/lib/systemd/system/salt-master.service.
      啓動
      [root@server1 Downloads]# systemctl start salt-master
      安裝用來查看已經打開的端口的包
      [root@server1 Downloads]# yum install -y lsof
      Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-
                    : manager
      This system is not registered with an entitlement server. You can use subscription-manager to register.
      Nothing to do
      接受請求
      [root@server1 Downloads]# lsof -i :4506
      COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
      salt-mast 11417 root   23u  IPv4  82603      0t0  TCP *:4506 (LISTEN)
      消息隊列
      [root@server1 Downloads]# lsof -i :4505
      COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
      salt-mast 11411 root   15u  IPv4  82565      0t0  TCP *:4505 (LISTEN)
    

    minion節點配置:server2,server3

      yum install -y salt-minion  #安裝minion端
      vim /etc/salt/minion #對minion端的配置文件進行配置
      master: 192.168.1.11  #指定master端
      systemctl enable salt-minion  #設置自啓動minion
      systemctl start salt-minion  #開啓自啓動
    

    配置完minion端之後,查看master端

      [root@server1 Downloads]# lsof -i :4506 #請求消息端口
      COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
      salt-mast 14705 root   23u  IPv4 104656      0t0  TCP *:4506 (LISTEN)
      # server2向server1發送的請求
      salt-mast 14705 root   30u  IPv4 115223      0t0  TCP server1:4506->192.168.1.12:51154 (ESTABLISHED)
      # server3向server1發送的請求
      salt-mast 14705 root   31u  IPv4 115229      0t0  TCP server1:4506->192.168.1.13:45888 (ESTABLISHED)
      [root@server1 Downloads]# lsof -i :4505  #消息隊列
      COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
      salt-mast 14699 root   15u  IPv4 104627      0t0  TCP *:4505 (LISTEN)
    

    這時master端需要通過key去允許minion端的連接

      [root@server1 Downloads]# salt-key -L
      Accepted Keys:
      Denied Keys:
      Unaccepted Keys:
      server2
      server3
      Rejected Keys:
    

    同意key:-A允許所有

      [root@server1 Downloads]# salt-key -A
      The following keys are going to be accepted:
      Unaccepted Keys:
      server2
      server3
      Proceed? [n/Y] y
      Key for minion server2 accepted.
      Key for minion server3 accepted.
    

    再次查看

      [root@server1 Downloads]# salt-key -L
      Accepted Keys:
      server2
      server3
      Denied Keys:
      Unaccepted Keys:
      Rejected Keys:
      #請求隊列
      [root@server1 Downloads]# lsof -i :4506
      COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
      salt-mast 14705 root   23u  IPv4 104656      0t0  TCP *:4506 (LISTEN)
      #消息隊列(已經建立長鏈接,master發的時候,minion端就可以收到)
      [root@server1 Downloads]# lsof -i :4505
      COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
      salt-mast 14699 root   15u  IPv4 104627      0t0  TCP *:4505 (LISTEN)
      salt-mast 14699 root   17u  IPv4 118817      0t0  TCP server1:4505->192.168.1.12:53022 (ESTABLISHED)
      salt-mast 14699 root   18u  IPv4 118822      0t0  TCP server1:4505->192.168.1.13:41772 (ESTABLISHED)
    

    注意: 當我們更改了主機名時,要及時的去這個文件中更改,或者刪除文件,重啓minion端。因爲salt會去讀文件中的名字

      [root@server2 salt]# cat minion_id 
      server2
      [root@server2 salt]# pwd
      /etc/salt
    

查看更詳細的進程信息:

安裝
[root@server1]# yum install -y python-setproctitle.x86_64
重啓salt
[root@server1]# systemctl restart salt-master.service 
[root@server1]# ps ax
...
 19546 ?        S      0:00 /usr/bin/python /usr/share/PackageKit/helpers/yum/yu
 19554 ?        Ss     0:00 /usr/bin/python /usr/bin/salt-master ProcessManager
 19565 ?        S      0:00 /usr/bin/python /usr/bin/salt-master Multiprocessing
 消息隊列
 19578 ?        Sl     0:00 /usr/bin/python /usr/bin/salt-master ZeroMQPubServer
 19579 ?        S      0:00 /usr/bin/python /usr/bin/salt-master EventPublisher
 19582 ?        S      0:00 /usr/bin/python /usr/bin/salt-master Maintenance
 請求隊列
 19583 ?        S      0:00 /usr/bin/python /usr/bin/salt-master ReqServer_Proce
 維護隊列
 19584 ?        Sl     0:00 /usr/bin/python /usr/bin/salt-master MWorkerQueue
 19585 ?        R      0:00 /usr/bin/python /usr/bin/salt-master MWorker-0
 19586 ?        R      0:00 /usr/bin/python /usr/bin/salt-master MWorker-1
 19593 ?        Sl     0:00 /usr/bin/python /usr/bin/salt-master FileserverUpdat
 19594 ?        R      0:00 /usr/bin/python /usr/bin/salt-master MWorker-2
 19595 ?        R      0:00 /usr/bin/python /usr/bin/salt-master MWorker-3
 19598 ?        R      0:00 /usr/bin/python /usr/bin/salt-master MWorker-4
 19897 pts/1    R+     0:00 ps ax

在master端測試ping在minion端的執行情況:

[root@server1 ~]# salt '*' test.ping  #*表示在key中能識別的所有主機
server3:
    True
server2:
    True

指定key進行測試:

[root@server1 ~]# salt server2 test.ping
server2:
    True

我們當前是以超戶身份進行遠程命令:

[root@server1 ~]# salt server2 cmd.run pwd
server2:
    /root

[root@server1 ~]# salt server2 cmd.run 'touch /tmp/file'
server2:

[root@server2 yum.repos.d]# ls /tmp/file
/tmp/file

slatstack遠程執行

  • 測試連接
  • 遠程執行命令

salt命令

salt命令由三個主要部分組成:

salt   '<target>'   <function>   [arguments]
  • target:指定哪些minion,默認的規則是使用glob匹配minion_id

      salt '*' test.ping
    

    targets也可以使用正則表達式:

      salt -E 'server[1-3]' test.ping
    

    targets也可以指定列表:

      salt -L 'server2,server3' test.ping
    
  • function是module提供的功能,salt內置了大量有效的functions

      http://docs.saltstack.cn/	查看中文手冊
    
      [root@server1 ~]# salt '*' cmd.run 'uname -a'
      server3:
          Linux server3 3.10.0-957.el7.x86_64 #1 SMP Thu Oct 4 20:48:51 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
      server2:
          Linux server2 3.10.0-957.el7.x86_64 #1 SMP Thu Oct 4 20:48:51 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
    
  • arguments通過空格來界定參數

      salt 'server2' sys.doc pkg  #查看模塊文檔
      salt 'server2' pkg.install httpd
      salt 'server2' pkg.remove httpd  #這樣就很簡單的完成了遠程安裝
      [root@server1 ~]# salt 'server2' pkg.remove httpd
      server2:
          ----------
          httpd:
              ----------
              new:
              old:
                  2.4.6-88.el7
      [root@server1 ~]# salt 'server2' pkg.install httpd
      server2:
          ----------
          httpd:
              ----------
              new:
                  2.4.6-88.el7
              old:
    

命令由4505端口推送,結果由4506接收

salt內置的執行模塊(寫文件時的用法)

	http://docs.saltstack.cn/ref/modules/all/index.html

salt的數據都會保存在/var/cache/salt目錄中

[root@server2 yum.repos.d]# cd /var/cache/salt
[root@server2 salt]# tree .
.
└── minion
    ├── extmods
    └── proc

3 directories, 0 files

編寫遠程執行模塊

除了由salt內置的執行模塊,作爲用戶自己也可以再編寫自己的模塊。

配置管理

  • salt狀態系統的核心是SLS,或者叫SaLt State文件。
  • SLS表示系統將會是什麼樣的一個狀態,而且是以一種很簡單的格式來包含這些數據,常被叫做配置管理。
  • sls文件命名:
    1.sls文件以“.sls”後綴結尾,但在調用時不用寫此後綴
    2.使用子目錄來做組織是個很好的選擇
    3.init.sls在一個子目錄裏面表示引導文件,也就表示子目錄本身,所以apache/init.sls文件就是表示apache本身
    4.如果同時存在“apache/init.sls”和“apache.sls”文件,則“apache/init.sls”被忽略,“apache.sls”將被用來表示apache

YAML語法

  • 規則一:縮進
    Salt需要每個縮進級別由兩個空格組成,不要使用tab
  • 規則二:冒號
    字典keys在YMAL中的表現形式是一個以冒號結尾的字符串
    my_key:my_value
  • 規則三:段橫槓
  • 想要表示列表項,使用一個段橫槓加一個空格
    - list_value_one
    -list_value_two

grains與pillar詳解

grains

  • grains是saltstack的一個組件,它被存放在minion端
  • 當salt-minion啓動時會把數據靜態存儲到grains當中,只有當minion重啓時纔會進行數據的更新
  • 由於grains時靜態數據,所以不推薦常去改它
  • 應用場景:
    信息查詢,可做CMDB
    在target中使用,匹配minion
    在state模塊中使用,配置管理模塊

信息查詢

用於查詢minion端的IP,FQDN等信息
默認可用的grains

自定義grains項

編寫grains模塊

grains匹配應用

pillar

  • 與grains一樣也是一個數據系統,但是應用場景不同
  • pillar是將信息動態的存放在master端,主要存放私密,敏感信息(如用戶名,密碼等),而且可以指定某一個minion端纔可以看到對應的信息
  • pillar更適合在配置管理中應用

聲明pillar

自定義pillar

數據匹配

Jinja模板

簡介

  • Jinja是一種基於python的模板引擎,在sls文件裏可以直接使用jinja模板來做一些操作
  • 通過jinja模板可以爲不同服務器定義各自的變量
  • 兩種分隔符:{%…%}和{{…}},前者用於執行諸如for循環或賦值的語句,後者把表達式的結果打印到模板上

使用方式

引用變量

Job管理

  • master在下發指令任務時,會附帶上產生的jid
  • minion在接受到指令開始執行時,會在本地的/var/cache/salt/minion/proc目錄下產生該gid命名的文件,用於在執行過程中,master查看當前任務的執行情況
  • 指令執行完畢將結果傳送給master後,刪除該臨時文件
    在這裏插入圖片描述

簡介

管理

salt-ssh和salt-syndic

salt-ssh

salt-syndic

salt-api配置

簡介

配置

使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章