1. 程式人生 > >saltstack管理集群

saltstack管理集群

鍵值 列表 啟動 包管理 ping 發的 數據 語法 改密

saltstack saltstack是基於Python開發的一套C/S架構配置管理工具 底層使用ZeroMQ消息隊列pub/sub方式通信 saltstack 兩個主要功能:配置管理與遠程執行 Saltstack基於C/S架構 服務端稱 master 客戶端稱 minion Saltstack工作機制 Master和Minion都以守護進程的方式運行 Master監聽配置文件裏定義的ret_port(接收minion請求),和publish_port(發布消息)的端口 當Minion運行時,他會自動連接到配置文件裏定義的Master地址ret_port端口進行連接認證 本地yum createrepo ./ //在提供yum源的文件目錄執行 安裝Master 一、服務端裝包salt-master yum -y install salt-master 二、配置文件不需要修改任何 /etc/salt/master vim /etc/hosts 域名解析 192.168.4.10 ms 192.168.4.20 web1 192.168.4.22 web2 192.168.4.25 db1 三、啟動服務: systemctl start salt-master systemctl enable salt-master netstat -lantpu |grep ":4505|:4506" 一、客戶端裝包salt-minion yum -y install salt-minion 二、修改配文件 vim /etc/salt/minion master: sm 指定master域名 id: web1 指定自己的域名 vim /etc/hosts 192.168.4.10 ms 192.168.4.20 web1 192.168.4.22 web2 192.168.4.25 db1 三、起服務 systemctl start salt-minion systemctl enable salt-minion Master與Minion互信 Minion上線後先與Master端聯系,把自己的pubkey發過去 Master接收Minion的公鑰後,互信建立完成 秘鑰選項 salt-key -h -L: 列出密鑰 -a: 接受某個密鑰 -A: 接受全部密鑰 -D: 刪除全部密鑰 -d: 刪除某個密鑰 接受所有密鑰,完成互信 salt-key -A -y salt命令使用方法: 格式:salt [options] ‘<target>‘ <function> [arguments] [options] //選項(修飾目標) ‘<target>‘ //目標(所有minion主機集合) <function> //函數 (模塊.方法) [arguments] //傳遞給對方的參數(修飾函數) function一般采用python的 模塊.方法 樣式 Minion上運行,可以采用通配符 ‘*’ 模塊 cp.get_file == scp file.copy == cp cmd.run ‘命令‘ //執行命令的模塊 test.ping ping命令 選項: -L 列表 -E 正則 -N 匹配組 -S CIDR -G 調用grains -I 調用pillar salt -L ‘web1‘ cmd.run ‘uptime‘ salt -E "web[0-9]" test.ping 分組 vim /etc/salt/master nodegroups: abc: ‘L@web1,web2‘ 可以寫多臺minion主機 other: ‘E@db[0-9] and N@abc‘ and是交集 #other: ‘E@db[0-9] or N@abc‘ or是並集 !!!! 前面必須是四個空格 salt -N abc test.ping /srv/salt 是Master默認的根目錄 mkdir -p /srv/salt/oh 向abc組傳輸文件 salt -N abc cp.get_file salt://oh/ /tmp/co 模塊及功能 salt ‘minion域名‘ sys.list_modules 列出所有可用的模塊 salt ‘web1‘ sys.list_modules salt ‘web2‘ sys.list_functions <模塊名> 查看模塊所有功能 salt ‘db1‘ sys.doc <模塊名> 查看模塊的用法 例: salt -N abc file.cop /etc/selinux /tmp/selinux 拷貝任意文件和目錄 salt -N abc user.add zhangsna 2000 創建用戶 Grains(收集客戶端信息) 1、打標簽的模塊 2、命令用法 3、自帶收集客戶端信息 4、信息存在客戶端 5、是在現有的配置文件修改 YAML規則(Master和Minion的配置文件采用YAML語法) 項目使用"-"來表示 鍵值對使用":"來表示 YAML使用一個固定的縮進風格表示數據層級結構關系 一般每個縮進級別由兩個空格組成 註意不能用tab鍵 YAML的鍵值對采用冒號分隔 YAML的鍵值對對應python的字典 YAML表示形式 name: web 或 name: web 字典可以嵌套 hosts: name: web 列表項使用一個短橫杠加一個空格 - web - dba 列表可以作為一個鍵值對的value(值) pkg-http: - httpd - php Grains是saltstack最重要的組件之一 可以獲取minion端的基本信息,這些信息一般都是靜態的,如CUP、內存、操作系統等 Grains存儲在minion本地 管理員可以在minion端進行grains值的修改,如增加、刪除等 salt ‘target‘ grains.items 查看grains提供的信息 salt ‘web1‘ grains.itmes salt ‘target‘ grains.items [key] 查看grains指定的key信息 salt ‘*‘ saltutil.sync_grains 刷新所有配置 salt -G ‘os:RedHat‘ cmd.run ‘uptime‘ 匹配minion端os為RedHat的執行uptime命令 在minion上定義grains vim /etc/salt/minion grains: role: nginx 重啟:systemctl restart salt-minion 或在minion上單獨定義grains vim /etc/salt/minion.d/grains.conf 創建grains配置文件 grains: role: nginx 重啟:systemctl restart salt-minion 在master上查看角色信息 salt ‘web1‘ saltutil.sync_grains 刷新所有配置 salt ‘web1‘ grains.item role salt ‘web1‘ grains.item |grep -i nginx Pillar組件 pillar也是saltstack最重要的組件之一 作用是定義與被控主機相關的任何數據,定義好的數據可以被其他組件使用 存儲在master端,存放需要提供給minion的信息 常用於敏感信息,每個minion只能訪問master分配給自己的pillar信息 用於經常動態變化的信息 pillar需要一個pillar_roots來維護pillar的配置 默認pillar_roots為/srv/pillar pillar_roots在Master配置文件中定義 例:vim /etc/salt/master pillar_roots: base: - /srv/pillar mkdir /srv/pillar pillar執行時需要一個名為top.sls的入口文件 通過top.sls文件作為入口,組織其它的pillar文件 sls文件采用YAML格式 例: cd /srv/pillar vim top.sls base: #與pillar_roots定義一致 ‘L@web1,web2‘: #過濾目標 - appweb #用於包含appweb.sls ‘E@db\d‘: #過濾目標 - appdb #用於包含appdb.sls - user #用於包含user.sls vim appdb.sls dbname: mysql vim appweb.sls appname: web software: - apache - nginx vim user.sls users: zhangsan: 1000 lisi: 1001 同步Pillar數據 salt ‘*‘ saltutil.refresh_pillar 刷新所有配置 salt ‘*‘ pillar.items 獲取pillar全部數據 salt ‘web‘ pillar.items 獲取pillar提供的信息 salt ‘web‘ pillar.items appweb 獲取pillar指定的key信息 salt -I ‘appename:web‘ test.ping 使用grains信息分類匹配主機 salt -I ‘appename:web‘ cmd.run ‘uptime‘ 匹配minion端appename為web的執行uptime命令 jinja模板 jinja是基於python的模板引擎 在saltstack中我們使用yaml_jinja渲染器來根據模板生產對應的配置文件 對於不同的操作系統或者不同的情況,通過Jinja可以讓配置文件或者操作形成一種模板的編寫方法 jinja使用步驟 在state文件中使用"- template: jinja"聲明 在模板文件中使用變量"{{name}}"聲明,name為變量,自己定義 在state文件中使用"- defautls: name: value"聲明 使用變量 變量的基本格式為:{{變量}} 一級字典變量格式為:{{pillar[‘appname‘]}} 二級字典變量格式為:{{pillar[‘flow‘][‘maxconn‘]}} 判斷語句 對grains的os值進行判斷,根據不同的系統對apache的值進行不同的設定,這樣apache就相當於是可以隨機應變的值 例:{% if grains[‘os‘] == ‘CentOS‘ %} apache: httpd {% elif grains[‘os‘] == ‘Debian‘ %} apache: apache2 {% endif %} 循環語句 在state中使用pillar數據,值通過jinja來訪問pillar即可,多個值通過循環逐個獲取 {% for user, uid in pillar,get(‘users‘,{}).items() %} {{user}}: user.present: - uid:{{uid}} {% endfor %} states基礎 states是satlstack中的配置語言 安裝軟件包、管理配置文件都需要編寫一些states sls文件 states sls使用YAML語法 salt ‘web1‘ sys.list_state_modules 查看所有States的模塊 salt ‘web1‘ sys.list_state_functions sysctl 查看該模塊功能 salt ‘web1‘ sys.state_doc sysctl.present 查看該模塊的用法 file模塊 file.managed: 文件同步模塊 file.append: 文件追加模塊 file.directory: 創建文件模塊 例1: vim /etc/salt/master file_roots: base: - /srv/base dev: - /srv/dev prod: - /srv/prod cd /srv/ mkdir base dev prod 重啟服務:systemctl restart salt-master.service cd base/ vim top.sls base: #名稱和配置文件相對應 ‘*‘: #minion域名*代表所有 - dns #和下面文件相對應 vim dns.sls abc: #名稱 file.managed: 文件同步模塊 - name: /etc/resolv.conf 同步被參考文件的內容的路徑 - source: salt://files/dns.conf 被參考文件路徑 - user: root - group: root - mode: 644 - template: jinja - defaules: DNS: 192.168.4.100 mkdir /srv/base/files cd /srv/base/files touch dns.conf cat dns.conf nameserver {{ DNS }} 檢測: salt ‘*‘ state.highstate saltenv=base test=true 執行: salt ‘*‘ state.highstate saltenv=base test=false 例2: cd /srv/base/ vim top.sls base: #名稱和配置文件相對應 ‘L@web1,wen2‘: #minion域名列表 - tex #和下面文件相對應 vim tex.sls abc: #名稱 file.append: #文件追加模塊 - name: /etc/resolv.conf #追加到的文件路徑 - text: - DNS1:9.9.9.9 #(比上一級多兩個空格),追加的內容 檢測: salt ‘*‘ state.highstate saltenv=base test=true 執行: salt ‘*‘ state.highstate saltenv=base test=false 例3: cd /srv/base/ vim top.sls base: #名稱和配置文件相對應 ‘*‘: #minion域名*代表所有 - set #和下面文件相對應 vim ste.sls directory: #名稱 file.directory: 創建文件模塊 - name: /opt/rpm_pkgs 創建的文件名 - user: root - group: root - dri_mode: 755 文件目錄的權限 - file_mode: 644 文件的權限 檢測: salt ‘*‘ state.highstate saltenv=base test=true 執行: salt ‘*‘ state.highstate saltenv=base test=false cmd模塊 cmd模塊強制給minion執行命令 可以限制當某個條件滿足時才執行命令 也可以限制當某個條件不滿足時才執行命令 cmd.run: 命令模塊 unless: 當unless條件不滿足時,需要執行令 onlyif: 當onlyid條件滿足時,需要執行令 例: cd /srv/base/ vim top.sls base: #名稱和配置文件相對應 ‘*‘: #minion域名*代表所有 - est #和下面文件相對應 vim est.sls useradd zhangsan: #創建用戶 cmd.run: - unless: idd zhangsan #判斷用戶不存在 echo 123456 |passwd --stdin zhangsan: #給用戶改密碼 cmd.run: - onlyif: id zhangsan #判斷用戶存在 檢測: salt ‘*‘ state.highstate saltenv=base test=true 執行: salt ‘*‘ state.highstate saltenv=base test=false 系統初始化 可以在base環境下創建一個init目錄,將系統初始化配置的sls文件均存放在init目錄下,稱其為“初始化模塊” 1.配置DNS vim /srv/salt/base/init/dns.sls resolv_file: file.managed: - source: salt://init/files/resolv.conf - user: root - group: root - mode: 644 2.配置History記錄時間 vim /srv/salt/base/init/history.sls profile_file: #名稱 file.append: #追加模塊 - name: /etc/profile #追加的文件路徑 - text: - export HISTTIMEFORMAT="%F %T" #追加的內容 3.配置內核參數優化 saltstack提供了sysctl狀態模塊用來進行內核參數的配置 vim /srv/salt/base/init/sysctl.sls net.ipv4.ip_forward: #為值1開啟路由 sysctl.present: - value: 1 #值 4.創建用戶 vim /srv/salt/base/init/user.sls usreadd bob: cmd.run: - unless: id bob echo 123456 |passwd --stdin bob: cmd.run: - onlyif: id bob pkg模塊 pkg模塊可以實現軟件包管理 管理的軟件包包括紅帽RPM包和Ubuntu的deb包等 主要方法有: pkg.installed: 安裝軟件包 pkg.latest: 保持軟件包最新版本 pkg.remove: 卸載軟件包 pkg.purge: 下載軟件包,刪除配置文件 require條件:只有滿足條件才執行令 service模塊 軟件部署完畢後,需要確保服務處於運行狀態,並且能夠實現開機自啟。 service.running: 確保服務處於運行狀態 service.enabled: 開機自啟 service.disabled: 開機不自啟 service.dead: 確保服務處於未運行狀態 watch:服務如果能夠正常啟動,需要確保存在配置文件,設置如果配置文件存在,才啟動服務。 例:在minion上域名為web1,web2的主機上安裝httpd軟件包,並修改偵聽端口為8080. cd /srv/salt/prod mkdir files vim top.sls prod: #名稱和配置文件相對應 ‘L@web1,web2‘ #minion域名 - install #和下面文件相對應 - etc #和下面文件相對應 - service #和下面文件相對應 vim install.sls insta: #名稱 pkg.installed: #安裝軟件包模塊 - name: httpd #軟件包名 vim etc.sls etchttp: #名稱 file.managed: #同步模塊 - name: /etc/httpd/conf/httpd.conf #同步被參考文件的內容的路徑 - source: salt://files/httpd.conf #被參考文件路徑 - template: jinja #使用jinja模塊 - defaults: PORT: 8080 - require: #require條件 - pkg: insta #pkg模塊定義的函數名稱 cp /etc/httpd/conf/httpd.conf /srv/salt/prod/files/ vim /srv/salt/prod/files/httpd.conf ............ Listen {{ PORT }} #使用jinja變量 .......... vim service.sls servi: #名稱 service.running: #運行模塊 - name: httpd #運行的服務名 - enable: true - restart: true - watch: #watch條件 - file: etchttp #file模塊定義的函數名稱 檢測: salt ‘*‘ state.highstate saltenv=prod test=true 執行: salt ‘*‘ state.highstate saltenv=prod

saltstack管理集群