遠程執行模塊的執行是過程式,而狀態是對minion
的一種描述和定義,管理人員不須要關係部署任務如何完成的,只須要描述minion
的狀態描述。
它的和興是寫sls(Salt State file)
文件,sls
文件默認格式爲YAML
格式,並默認使用jinja
模板,jinja
是根據django
的模板語言發展而來的語言,簡單並強大,支持for if
等循環語句。salt state
主要用來描述系統,服務,配置文件的狀態,經常被稱爲配置管理。php
mysql-install: #ID聲明,必須惟一 pkg.installed: #state狀態聲明 - pkgs: #選項聲明 - mariadb: #選項列表 - mariadb-server 說明: 一個ID只能出現一次 一個ID下相同模塊只能使用一次 一個ID下不可使用多個不一樣模塊
模塊幫助手冊html
#列出全部狀態模塊 [root@salt-master ~]# salt '*' sys.list_modules #查看指定模塊的全部方法 [root@salt-master ~]# salt '*' sys.list_state_functions pkg #查看指定模塊的使用方法 [root@salt-master ~]# salt '*' sys.state_doc pkg #查看指定模塊的指定方法的用法 [root@salt-master ~]# salt '*' sys.state_doc pkg.installed
pkg模塊官檔node
pkg.installed
軟件安裝mysql
php-install: pkg.installed: - pkgs: - php - php-mysql: ">=5.4.16" #指定安裝版本 - php-pdo - php-cli
指定安裝最新版本的軟件nginx
php-install: pkg.latest: - pkgs: - php - php-mysql - php-pdo - php-cli
file模塊官檔web
file.managed
下發文件,確保文件存在sql
[root@salt-master ~]# mkdir /srv/salt/base/files [root@salt-master ~]# cp /etc/httpd/conf/httpd.conf /srv/salt/base/files/ [root@salt-master ~]# cat /srv/salt/base/apache_conf.sls apache-config: file.managed: - name: /etc/httpd/conf/httpd.conf - source: salt://files/httpd.conf - user: root - group: root - mode: 644 說明: - name: 表示存放目的地址 - source: 表示這個文件來自哪裏(說明這個文件得提早準備) 或者這樣寫,直接已目的地址命令ID,這樣ID也表示目的地址 [root@salt-master ~]# cat /srv/salt/base/apache_conf.sls /etc/httpd/conf/httpd.conf: file.managed: - source: salt://files/httpd.conf - user: root - group: root - mode: 644
小示例: [root@salt-master ~]# cat /srv/salt/base/test.sls /tmp/passwd_back: file.managed: - source: salt://files/passwd - user: root - group: root - mode: 644 [root@salt-master ~]# cp /etc/passwd /srv/salt/base/files/ [root@salt-master ~]# salt '*' state.sls test [root@salt-master ~]# salt '*' cmd.run "ls -l /tmp/passwd_back" salt-minion03: -rw-r--r-- 1 root root 2098 May 15 16:21 /tmp/passwd_back salt-minion02: -rw-r--r-- 1 root root 2098 May 15 16:21 /tmp/passwd_back salt-minion01: -rw-r--r-- 1 root root 2098 May 15 16:21 /tmp/passwd_back
file.directory
創建目錄apache
[root@salt-master ~]# cat /srv/salt/base/directory.sls /tmp/saltdir: file.directory: - user: root - group: root - mode: 755 - makedirs: True #若是上一級目錄不存在自動建立;相似(mkdir -p) [root@salt-master ~]# salt '*' state.sls directory [root@salt-master ~]# salt '*' cmd.run "ls -d /tmp/saltdir" salt-minion03: /tmp/saltdir salt-minion02: /tmp/saltdir salt-minion01: /tmp/saltdir
file.recurse
下發整個目錄django
[root@salt-master ~]# cat /srv/salt/base/httpd_conf_dir.sls httpd_conf_dir: file.recurse: - name: /etc/httpd/conf.d - source: salt://files/conf.d - file_mode: 600 #文件權限 - dir_mode: 755 #目錄權限 - include_empty: True #同步空目錄 - clean: True #使用後minion與master保持一致 [root@salt-master ~]# rsync -avh /etc/httpd/conf.d /srv/salt/base/files/
file.symlink
創建軟連接vim
[root@salt-master ~]# cat /srv/salt/base/target_link.sls /etc/grub.cfg: file.symlink: - target: /etc/grub2.cfg [root@salt-master ~]# salt '*' state.sls target_link [root@salt-master ~]# salt '*' cmd.run "ls -l /etc/grub.cfg" salt-minion03: lrwxrwxrwx 1 root root 14 May 15 16:42 /etc/grub.cfg -> /etc/grub2.cfg salt-minion01: lrwxrwxrwx 1 root root 14 May 15 16:42 /etc/grub.cfg -> /etc/grub2.cfg salt-minion02: lrwxrwxrwx 1 root root 14 May 15 16:42 /etc/grub.cfg -> /etc/grub2.cfg
[root@salt-master ~]# cat /srv/salt/base/service_httpd.sls httpd: service.running: - name: httpd #服務名稱 - enable: True #開機自啓動 - reload: True #容許重載配置文件,不寫則是restart 或者這樣寫 [root@salt-master ~]# cat /srv/salt/base/service_httpd.sls httpd: #即表示ID,又表示服務名 service.running: - enable: True - reload: True
當咱們想要不一樣的主機應用不一樣的配置,那麼可使用高級狀態管理 top file
來進行管理。能夠經過正則,grain
模塊,或分組名,來進行匹配,再下一級是要執行的state
文件
能夠將咱們的配置需求轉換爲YAML
並在Top file
文件中表示:
Top file
示例
base: '*': #經過正則去匹配全部minion - app.nginx webserver: #定義的分組名稱 - match: nodegroup - app.cron 'os:centos': #經過grains模塊匹配 - match: grains - nginx
Top file
高級狀態的執行
[root@salt-master ~]# salt '*' state.highstate
說明:該案例在prod
環境配置
1)環境準備,定義file_roots
環境
[root@salt-master ~]# vim /etc/salt/master file_roots: base: - /srv/salt/base dev: - /srv/salt/dev prod: - /srv/salt/prod
2)建立對應環境目錄
[root@salt-master ~]# mkdir -p /srv/salt/{base,dev,prod} [root@salt-master ~]# mkdir /srv/salt/prod/{httpd,php,mysql,files}
3)配置文件準備及測試文件準備
[root@salt-master ~]# cp /etc/my.cnf /srv/salt/prod/files/ [root@salt-master ~]# cp /etc/httpd/conf/httpd.conf /srv/salt/prod/files/ [root@salt-master ~]# cp /etc/php.ini /srv/salt/prod/files/ [root@salt-master ~]# echo "<h1>LAMP html</h1>" >>/srv/salt/prod/files/index.html [root@salt-master ~]# echo "<?php phpinfo(); ?>" >> /srv/salt/prod/files/index.php
4)編寫state sls
狀態文件
#httpd [root@salt-master ~]# cat /srv/salt/prod/httpd/init.sls apache-install: pkg.installed: - pkgs: - httpd - httpd-tools apache-config: file.managed: - name: /etc/httpd/conf/httpd.conf - source: salt://files/httpd.conf - user: root - group: root - mode: 644 apache-service: service.running: - name: httpd - enable: True #php [root@salt-master ~]# cat /srv/salt/prod/php/init.sls php-install: pkg.installed: - pkgs: - php - php-mysql - php-pdo - php-cli php-config: file.managed: - name: /etc/php.ini - source: salt://files/php.ini - user: root - group: root - mode: 644 #mysql [root@salt-master ~]# cat /srv/salt/prod/mysql/init.sls mariadb-install: pkg.installed: - pkgs: - mariadb-server - mariadb mariadb-config: file.managed: - name: /etc/my.cnf - source: salt://files/my.cnf - user: root - group: root - mode: 644 mariadb-service: service.running: - name: mariadb - enable: True #測試文件 [root@salt-master ~]# cat /srv/salt/prod/testfile.sls /var/www/html/index.html: file.managed: - source: salt://files/index.html /var/www/html/index.php: file.managed: - source: salt://files/index.php
6)topfile
文件編寫
[root@salt-master ~]# cat /srv/salt/base/top.sls prod: 'salt-minion*': - httpd.init - php.init - mysql.init - testfile
7)部署LAMP
總體state
文件查看
[root@salt-master ~]# tree /srv/salt/
/srv/salt/
├── base
│ └── top.sls
├── dev
└── prod
├── files
│ ├── httpd.conf
│ ├── index.html
│ ├── index.php
│ ├── my.cnf
│ └── php.ini
├── httpd
│ └── init.sls
├── mysql
│ └── init.sls
├── php
│ └── init.sls
└── testfile.sls
8)執行topfile
[root@salt-master ~]# salt '*' state.highstate
經過上面的lamp
能夠看出已經可使用state
模塊來定義minion
的狀態了,可是若是一個主機涉及多個狀態,而且狀態之間相互關聯,在執行順序上有前後之分,那麼必須引用requisites
來進行控制
關係說明:
一、require
我依賴某個狀態,我依賴誰
二、require_in
我被某個狀態依賴,誰依賴我
三、watch
我關注某個狀態,當狀態發生改變,進行restart
或者reload
操做
四、watch_in
我被某個狀態關注
五、include
我引用誰
1)修改上面lamp
狀態間依賴關係
#httpd [root@salt-master ~]# cat /srv/salt/prod/httpd/init.sls apache-install: pkg.installed: - pkgs: - httpd - httpd-tools apache-config: file.managed: - name: /etc/httpd/conf/httpd.conf - source: salt://files/httpd.conf - user: root - group: root - mode: 644 - require: - pkg: apache-install #表示上面apache-install執行成功,才能執行apache-config apache-service: service.running: - name: httpd - enable: True - require: - file: apache-config - watch: - file: apache-config #php [root@salt-master ~]# cat /srv/salt/prod/php/init.sls php-install: pkg.installed: - pkgs: - php - php-mysql - php-pdo - php-cli - reqiure_in: - file: php-config php-config: file.managed: - name: /etc/php.ini - source: salt://files/php.ini - user: root - group: root - mode: 644 #mysql [root@salt-master ~]# cat /srv/salt/prod/mysql/init.sls mariadb-install: pkg.installed: - pkgs: - mariadb-server - mariadb mariadb-config: file.managed: - name: /etc/my.cnf - source: salt://files/my.cnf - user: root - group: root - mode: 644 - require: - pkg: mariadb-install mariadb-service: service.running: - name: mariadb - enable: True - reload: True - require: - file: mariadb-config - watch: - file: mariadb-config
2)修改引用關係後include
[root@salt-master ~]# tree /srv/salt/ /srv/salt/ ├── base │ └── top.sls ├── dev └── prod ├── files │ ├── httpd.conf │ ├── index.html │ ├── index.php │ ├── my.cnf │ └── php.ini ├── httpd │ └── init.sls ├── lamp.sls ├── mysql │ └── init.sls ├── php │ └── init.sls └── testfile.sls [root@salt-master ~]# cat /srv/salt/prod/lamp.sls include: - httpd.init - php.init - mysql.init - testfile [root@salt-master ~]# cat /srv/salt/base/top.sls prod: 'salt-minion*': - lamp
3)編寫SLS
技巧
1、按照狀態分類,若是單獨使用,清晰明瞭 2、按照服務分類,能夠被其它SLS引用
配置文件通常靈活多變,好比配置apache
的IP
地址或者端口PORT
等,則能夠動態傳值。
Jinja2
模板包含變量和表達式,變量用 {{ … }} 包圍,表達式用 {% … %} 包圍。變量使用示例:
[root@salt-master ~]# cat /srv/salt/base/var.sls {% set var= 'hello world!' %} test_var: cmd.run: - name: echo "測試變量 {{ var }}" [root@salt-master ~]# salt 'salt-minion01' state.sls var salt-minion01: ---------- ID: test_var Function: cmd.run Name: echo "測試變量 hello world!" Result: True Comment: Command "echo "測試變量 hello world!"" run Started: 14:50:58.302424 Duration: 12.358 ms Changes: ---------- pid: 22510 retcode: 0 stderr: stdout: 測試變量 hello world! Summary for salt-minion01 ------------ Succeeded: 1 (changed=1) Failed: 0 ------------ Total states run: 1 Total run time: 12.358 ms
jinja2
經常使用變量
一、字符串類型
{% set var = 'test' %} #定義變量 {{ var }} #調用變量
二、列表類型
{% set list = ['one', 'two', 'three'] %} {{ list[1] }} #獲取變量的第一個值
三、字典類型
{% set dict = {'key1':'value1', 'key2':'value2'} %} {{ dict['key1'] }} #獲取'key1'的值
示例1:Saltstack
使用jinja
模塊配置apache
監聽端口
#1.告訴file狀態模塊,須要使用jinja - template: jinja #2.列出參數列表 - defaults: PORT: 8000 #3.配置文件引用jinja模板 {{ PORT }} # 配置示例 apache-config: file.managed: - name: /etc/httpd/conf/httpd.conf - source: salt://files/httpd.conf - user: root - group: root - mode: 644 - template: jinja - defaults: PORT: 8000 # 修改httpd.conf配置文件引用變量 Listen {{ PORT }}
示例2:使用grinas
方式進行賦值
#配置示例 apache-config: file.managed: - name: /etc/httpd/conf/httpd.conf - source: salt://files/httpd.conf - user: root - group: root - mode: 644 - template: jinja - defaults: PORT: 8000 IPADDR: {{ grains['fqdn_ip4'][0] }} # 修改httpd.conf配置文件引用變量 Listen {{ IPADDR }}:{{ PORT }}
示例3:經過jinja+grains
根據系統不一樣安裝apache
[root@salt-master ~]# cat /srv/salt/base/httpd.sls #根據grains獲取的值判別系統後安裝軟件 httpd-install: pkg.installed: {% if grains['os'] == 'CentOS' %} - name: httpd {% elif grains['OS'] == 'Debin' %} - name: apache2 {% endif %}