saltstack 基本使用


目錄

1.1 准備實驗環境:安裝系統

1.2 克隆一台虛擬機完成使用環境

1.3 saltstack 介紹

1.4 saltstack 安裝

1.5 saltstack 常用模塊

1.6 salt ssh 詳解

1.7 salt Grains

1.8 salt Pillar

1.1 准備實驗環境:安裝系統

1) 硬件配置如下

  

 

 2) 先把光標放到“install CentOS 7”, 按 Tab鍵編輯內核參數,添加(net.ifnames=0 biosdevname=0)

  作用: 是網卡名稱 eth0 這樣的格式

  

 

 3) 建議安裝語言改成簡體中文,其他保持默認即可

  

 

 4) 設置完root密碼等待安裝完成重啟即可完成系統安裝

 5) 配置 VMware NAT 模式默認地址池 

  編輯-----> 虛擬網絡編輯器

  

1.2 克隆一台虛擬機完成使用環境

1) 配置網卡

  vi /etc/sysconfig/network-scripts/ifcfg-eth0

  

  systemctl restart network

  systemctl disable firewalld

  systemctl disable NetworkManager

2)設置主機名

  vi /etc/hostname

    linux-node1.example.com

3)設置主機名解析

  vi /etc/hosts

    192.168.56.11 linux-node1 linux-node1.example.com

    192.168.56.12 linux-node2 linux-node2.example.com

4)設置DNS

  vi /etc/resolv.conf

    nameserver 192.168.56.2

5)安裝最新epel yum 源

  注:此地址中有各種源(https://opsx.alibaba.com/mirror)

         rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm

6)yum安裝一些基礎包

  yum -y install net-tools vim lrzsz tree screen lsof tcpdump nc mtr nmap

7)關閉selinux

  vim /etc/selinux/config 

    SELINUX=disabled

8)重啟系統

  yum update -y && reboot          # 升級所有包同時也升級軟件和系統內核, 並重啟

9)確認是否一些服務是否已按計划關閉

  getenforce          # selinux是否關閉

  firewall-cmd --state         # 防火牆是否關閉

1.2 克隆一台虛擬機完成使用環境

  :克隆虛擬機必須要先關閉(shutdown)

  1)右鍵“管理” -------》 “克隆” ----》

  2)選擇從哪個狀態創建克隆

  

   3)克隆類型(創建完整克隆)

  

   4)新建虛擬機名稱

  

   5) 點擊 “完成” 即可完成虛擬機克隆

   6) 對克隆的虛擬機 node2 進行一些簡單修改

    vim /etc/hostname       # 1、修改主機名

      linux-node2.example.com

    vi /etc/sysconfig/network-scripts/ifcfg-eth0 

      IPADDR=192.168.56.12

    reboot

1.3 saltstack 介紹

  1、saltstack說明

    1)salt是一個異構平台基礎設置管理工具(雖然我們通常只用在Linux上),使用輕量級的通訊器ZMQ
    2)用Python寫成的批量管理工具,完全開源,遵守Apache2協議,與Puppet,Chef功能類似,有一個強大的遠程執行命令引擎
    3)也有一個強大的配置管理系統,通常叫做Salt State System。

    4)主要作用: 遠程執行、配置管理、事件驅動

      a.  遠程執行: 及支持 使用agent 支持 使用ssh遠程執行

      b. 配置管理: 如果用salt描述nginx,沒有就會幫你安裝,如果nginx配置不對就會幫你改對(保證機器狀態和你描述一致)

    5)特點:即可支持 agent 方式,也支持 ssh方式

  2、基本原理

    1)SaltStack 采用 C/S模式,server端就是salt的master,client端就是minion,minion與master之間通過ZeroMQ消息隊列通信

    2)minion上線后先與master端聯系,把自己的pub key發過去,這時master端通過salt-key -L命令就會看到minion的key,接受該minion-key后,也就是master與minion已經互信

    3)master可以發送任何指令讓minion執行了,salt有很多可執行模塊,比如說cmd模塊,在安裝minion的時候已經自帶了,它們通常位於你的python庫中

  3、saltstack具體步驟如下

    1)Salt stack的Master與Minion之間通過ZeroMq進行消息傳遞,使用了ZeroMq的發布-訂閱模式,連接方式包括tcp,ipc

    2)salt命令,將cmd.run ls命令從salt.client.LocalClient.cmd_cli發布到master,獲取一個Jodid,根據jobid獲取命令執行結果。

    3)master接收到命令后,將要執行的命令發送給客戶端minion。

    4)minion從消息總線上接收到要處理的命令,交給minion._handle_aes處理

    5)minion._handle_aes發起一個本地線程調用cmdmod執行ls命令。線程執行完ls后,調用minion._return_pub方法,將執行結果通過消息總線返回給master

    6)master接收到客戶端返回的結果,調用master._handle_aes方法,將結果寫的文件中

    7)salt.client.LocalClient.cmd_cli通過輪詢獲取Job執行結果,將結果輸出到終端。

  4、saltstack認證原理 

    1)salt-master和salt-minion第一次啟動時會在 /etc/salt/pki/master目錄下生成公鑰和私鑰用於身份驗證

      [root@linux-node1 master]# cd /etc/salt/pki/master

      [root@linux-node1 master]# ll -lh
      -r-------- 1 root root 1.7K Jan 7 05:36 master.pem
      -rw-r--r-- 1 root root 450 Jan 7 05:36 master.pub

    2)所有未認證minion的私鑰都會放到master的  /etc/salt/pki/master/minions_pre/ 文件夾下

    3)當minion通過認證后就會放到 /etc/salt/pki/master/minions 文件夾下

    4)master通過在認證的同時會把自己的公鑰發送給minion, minion會放到 /etc/salt/pki/minion/minion_master.pub 

    5)這樣就實現了雙向密鑰交換

1.4 saltstack 安裝

  注:saltstack官方提供了各種版本系統安裝方法(地址:http://repo.saltstack.com/#rhel)

    1、在linux-node1 中安裝saltstack master 和 minion

      yum -y install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm 

      yum -y install salt-master salt-minion

        /etc/salt/master(master配置文件)

        /etc/salt/minion(minion配置文件)

    2、在linux-node2 中安裝saltstack minion

      yum -y install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm 

      yum -y install salt-minion

        /etc/salt/minion(minion配置文件)

    3、在linux-node1中配置 salt-minion

      vim /etc/salt/minion

        #master: salt   修改為(master: 192.168.56.11) ----》配置master IP

        #id:           修改為(id: linux-node1.example.com)   ---》告訴master自己是誰,默認會讀取當前主機名

        注:saltstack是以主機名區分不同 agent 需保證主機名唯一

    4、在linux-node2中配置 salt-minion     

      vim /etc/salt/minion

        #master: salt   修改為(master: 192.168.56.11) ----》配置master IP

        #id:           修改為(id: linux-node2.example.com)   ---》告訴master自己是誰,默認會讀取當前主機名

    5、啟動linux-node1中salt-maser 和 salt-minion

      systemctl start salt-master       # 啟動salt-master

      systemctl enable salt-master       # 設置salt-master開機自啟動

      systemctl start salt-minion        # 啟動

      systemctl enable salt-minion     # 開機自啟動

    6、啟動linux-node2中salt-minion

      systemctl start salt-minion        # 啟動

      systemctl enable salt-minion      # 開機自啟動

    7、認證

      salt-key             # 在master中查看所有key的狀態

      salt-key -a linux-node1.example.com      # 認證 linux-node1.example.com的key

      salt-key -A          # 一次性認證所有key

    8、遠程執行測試

      salt  \*  test.ping         # 測試saltstack minion與master的連通性

      salt \* cmd.run 'df -h'     # 在所有minion中批量執行 df -h 命令

1.5 saltstack 常用模塊

  1、cmd.run (遠程執行)

    功能:  實現遠程命令執行

    salt '*'   cmd.run 'free -m'  

  2、cp模塊

    功能: 實現遠程文件、目錄復制,下載Url文件等操作

# 1、master配置同步根目錄(YAML語法,1. 每一級使用兩個空格 2. 短橫線表示列表)
vim /etc/salt/master

file_roots:
  base:
    - /srv/salt
  dev:
    - /srv/salt/dev

systemctl restart salt-master  # 需要重啟master
    
# 2、創建同步目錄文件夾,和測試文件 /srv/salt/test.sh
mkdir -p /srv/salt/dev
vim /srv/salt/test.sh   #創建測試文件

# 3、將 /srv/salt/ 下的test.sh文件同步到所有minion
salt '*' cp.get_file salt://test.sh /tmp/test.sh


# 4、創建目錄 makedirs(當分發的位置在目標主機上不存在時,自動創建該目錄)
salt '*' cp.get_file salt://test.sh /aaa/test.sh makedirs=True

# 5、將 /srv/salt 中的testdir 目錄復制到所有minion
mkdir /srv/salt/testdir/
salt '*' cp.get_dir salt://testdir /aaa/

# 6、下載百度首頁內容保存到所有minion中
 salt '*' cp.get_url http://www.baidu.com /tmp/index.html

  3、狀態管理(神筆馬良)

    1)修改 /etc/salt/master 文件

# 1、master配置同步根目錄(YAML語法,1. 每一級使用兩個空格 2. 短橫線表示列表)
vim /etc/salt/master

file_roots:
  base:
    - /srv/salt
  dev:
    - /srv/salt/dev

systemctl restart salt-master  # 需要重啟master

    2)在 /srv/salt/ 下配置狀態管理

      [root@linux-node1 /]#  vim /srv/salt/web/apache.sls

# 1.描述了要裝一個httpd服務
apache-install:  # 這個是一個名稱,可以隨便寫
  pkg.installed:  # pkg是狀態模塊,installed是狀態模塊中的方法
    - name: httpd  # 描述了我在里要裝一個httpd包

# 2.描述了httpd服務是啟動狀態,並且是開機自啟動狀態
apache-service:  # 這個是一個名稱,可以隨便寫
  service.running:  # 描述了httpd服務是運行的狀態
    - name: httpd
    - enable: True  # 描述httpd服務開機自動啟動

    3)在 salt-master中執行命令讓 linux-node2按照描述完成按照

      [root@linux-node1 web]# salt   linux-node2.example.com  state.sls  web.apache

      1)通過遠程執行,通知node2進行配置管理
      2)state.sls        # 遠程執行的一個方法
      3)web.apache      # 執行web目錄下的apache文件

  4、grains.item模塊

    功能:獲取機器基本信息(cpu、內存)

# 1、查看系統版本
[root@linux-node1 salt]# salt 'linux-node1.example.com'  grains.item os
linux-node1.example.com:
    ----------
    os:
        CentOS

# 2、查看cpu型號
[root@linux-node1 salt]# salt 'linux-node1.example.com'  grains.item cpu_model
linux-node1.example.com:
    ----------
    cpu_model:
        Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz
        
# 3、獲取ipv4地址
[root@linux-node1 salt]# salt 'linux-node1.example.com'  grains.item fqdn_ip4
linux-node1.example.com:
    ----------
    fqdn_ip4:
        - 192.168.56.11

# 4、查詢內核版本
[root@linux-node1 salt]# salt 'linux-node1.example.com'  grains.item kernelrelease
linux-node1.example.com:
    ----------
    kernelrelease:
        3.10.0-957.1.3.el7.x86_64
        
# 5、查看主機名
[root@linux-node1 salt]# salt 'linux-node1.example.com'  grains.item nodename
linux-node1.example.com:
    ----------
    nodename:
        linux-node1.example.com
        
# 6、查看系統版本號 centos6、centos7等
[root@linux-node1 salt]# salt 'linux-node1.example.com'  grains.item osmajorrelease
linux-node1.example.com:
    ----------
    osmajorrelease:
# 7、查看salt版本    
[root@linux-node1 salt]# salt 'linux-node1.example.com'  grains.item saltversion
linux-node1.example.com:
    ----------
    saltversion:
        2018.3.3

# 8、查看cpu數據量
[root@linux-node1 salt]# salt 'linux-node1.example.com'  grains.item num_cpus
linux-node1.example.com:
    ----------
    num_cpus:

# 9、查看內存大小
[root@linux-node1 salt]# salt 'linux-node1.example.com'  grains.item mem_total
linux-node1.example.com:
    ----------
    mem_total:

# 10、查看ipv4地址
[root@linux-node1 salt]# salt 'linux-node1.example.com'  grains.item ipv4
linux-node1.example.com:
    ----------
    ipv4:
        - 127.0.0.1
        - 192.168.56.11

grains.item獲取主機基本信息
grains.item獲取主機基本信息

  5、Service模塊

    salt '*' service.reload nginx 

1.6 salt ssh 詳解

  1、安裝(master和minion中都需要安裝)

    yum -y install salt-ssh

  2、配置花名冊,配置要管理的機器

    vim /etc/salt/roster

# Sample salt-ssh config file
#web1:
#  host: 192.168.42.1 # The IP addr or DNS hostname
#  user: fred         # Remote executions will be executed as user fred
#  passwd: foobarbaz  # The password to use for login, if omitted, keys are used
#  sudo: True         # Whether to sudo to root, not enabled by default
#web2:
#  host: 192.168.42.2

linux-node1.example.com:
  host: 192.168.56.11
  user: root
  passwd: chnsys@2016
  port: 22

linux-node2.example.com:
  host: 192.168.56.12
  user: root
  passwd: chnsys@2016
  port: 22

/etc/salt/roster
/etc/salt/roster

  3、常用命令 

    salt-ssh '*' test.ping -i                    # 使用salt自身模塊

    salt-ssh '*' cmd.run 'df -lh'

    salt-ssh '*' -r 'ifconfig'                    # 執行原生shell命令

-r, –raw, –raw-shell # 直接使用shell命令
–priv #指定SSH私有密鑰文件
–roster #定義使用哪個roster系統,如果定義了一個后端數據庫,掃描方式,或者用戶自定義的的roster系統,默認的就是/etc/salt/roster文件
–roster-file #指定roster文件
–refresh, –refresh-cache #刷新cache,如果target的grains改變會自動刷新
–max-procs #指定進程數,默認為25
-i, –ignore-host-keys #當ssh連接時,忽略keys
–passwd #指定默認密碼
–key-deploy #配置keys 設置這個參數對於所有minions用來部署ssh-key認證,
 這個參和–passwd結合起來使用會使初始化部署很快很方便。當調用master模塊時,並加上參數 –key-deploy 即可在minions生成keys,下次開始就不使用密碼

salt-ssh命令用法
salt-shh命令用法

1.7 salt Grains

  1、grains作用

    grains是minion第一次啟動的時候采集的靜態數據,可以用在salt的模塊和其他組件中。

    其實grains在每次的minion啟動(重啟)的時候都會采集,即向master匯報一次的。

    grains 的作用是在每個minion中配置 key value進行標識,使批量執行時可以區分

    salt 'linux-node1*' grains.ls          # grains支持通配符

  2、salt grains原生命令

    1. salt '*' grains.items                                          # 查看minion的全部靜態變量

    2. salt '*' grains.ls                                                # 顯示grains的變量名稱

    3. salt '*' grains.item os                                       # 顯示某一個變量

    4. salt '*' grains.get  ip4_interfaces:eth0              # 直接獲取內容

    5. salt -G 'os:CentOs' test.ping                             # 所有os的centos的 執行test.ping (-G就是grains)

  3、自定義grains:需要重啟 minion

# 1、編輯 minion 文件,配置角色名
vim /etc/salt/minion
'''
grains:
  roles: apache
'''
  
# 2、重啟minion
systemctl restart salt-minion

# 3、查看所有機器都有哪些roles
[root@linux-node1 ~]# salt '*' grains.item roles
linux-node1.example.com:
    ----------
    roles:
        apache
linux-node2.example.com:
    ----------
    roles:

# 4、讓所有角色為apache的機器執行命令'w',-G表示以grains進行目標選擇
salt -G 'roles:apache' cmd.run 'w'  

自定義grains:需要重啟 minion
自定義grains: 需要重啟 minion

  4、自定義grains:無需重啟minion

# 1、在minion中新建文件/etc/salt/grains,添加一個 key value
vim /etc/salt/grains
'''
test-grains: test-grains-value
'''

# 2、讓minion到所有grains中讀取配置
salt '*' saltutil.sync_grains

# 3、查看所有 key為test-grains的minion
[root@linux-node1 ~]# salt '*' grains.item test-grains
linux-node1.example.com:
    ----------
    test-grains:
        test-grains-value
linux-node2.example.com:
    ----------
    test-grains:
    
# 4、讓所有key=test-grains value=test-grains-value 的機器執行命令'w',-G表示以grains進行目標選擇
salt -G 'test-grains:test-grains-value' cmd.run 'w' 

自定義grains:無需重啟minion
自定義grains: 無需重啟 minion

1.8 salt Pillar

  1、Salt Pillar

    1. 存儲位置:存儲在master端,存放需要提供給minion的信息,minion每次需要動態從master獲取

    2. 應用場景:敏感信息,每個minion只能訪問master分配給自己的 pillar

  2、在master配置文件中指定pillar位置

vim /etc/salt/master
'''
pillar_roots:
  base:
    - /srv/pillar
'''

systemctl restart salt-master
mkdir /srv/pillar
cd /srv/pillar

  3、編輯一個pillar文件

    需求:在centos(httpd)和Ubuntu(apache2)都需要apache服務,但是兩種操作系統安裝的包名不同

vim /srv/pillar/apache.sls   # 編輯一個pillar文件

{% if grains['os'] == 'CentOS' %}
apache: httpd
{% elif grains['os'] == 'Debian' %}
apache: apache2
{% endif %}

  4、指定這個pillar文件給那個minion使用

vim top.sls  # 指定這個pillar文件給那個minion使用

base:
  'linux-node2.example.com':
  - apache

  5、確認 pillar中配置的items是否生效

[root@linux-node1 pillar]# salt '*' pillar.items       
linux-node1.example.com:
    ----------
linux-node2.example.com:
    ----------
    apache:
        httpd

  6、 Salt Grains 與  Salt Pillar 比較

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM