saltstack配置管理 Saltstack狀態模塊 遠程執行模塊的執行是過程式,而狀態是對minion的一種描述和定義,管理人員不需要關係部署任務如何完成的,只需要描述minion的狀態描述。它的和興是寫sls(Salt State file)文件,sls文件預設格式為YAML格式,並預設使用j ...
saltstack配置管理
Saltstack狀態模塊
遠程執行模塊的執行是過程式,而狀態是對minion
的一種描述和定義,管理人員不需要關係部署任務如何完成的,只需要描述minion
的狀態描述。
它的和興是寫sls(Salt State file)
文件,sls
文件預設格式為YAML
格式,並預設使用jinja
模板,jinja
是根據django
的模板語言發展而來的語言,簡單並強大,支持for if
等迴圈語句。salt state
主要用來描述系統,服務,配置文件的狀態,常常被稱為配置管理。
mysql-install: #ID聲明,必須唯一 pkg.installed: #state狀態聲明 - pkgs: #選項聲明 - mariadb: #選項列表 - mariadb-server 說明: 一個ID只能出現一次 一個ID下相同模塊只能使用一次 一個ID下不可以使用多個不同模塊
模塊幫助手冊
#列出所有狀態模塊 [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軟體模塊
pkg.installed
軟體安裝
php-install: pkg.installed: - pkgs: - php - php-mysql: ">=5.4.16" #指定安裝版本 - php-pdo - php-cli
指定安裝最新版本的軟體
php-install: pkg.latest: - pkgs: - php - php-mysql - php-pdo - php-cli
file文件模塊
file.managed
下發文件,確保文件存在
[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
建立目錄
[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
下發整個目錄
[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
建立軟鏈接
[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
service服務模塊
[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
LAMP架構案例
說明:該案例在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
States狀態依賴
通過上面的lamp
可以看出已經可以使用state
模塊來定義minion
的狀態了,但是如果一個主機涉及多個狀態,並且狀態之間相互關聯,在執行順序上有先後之分,那麼必須引用requisites
來進行控制
關係說明:
1、require
我依賴某個狀態,我依賴誰
2、require_in
我被某個狀態依賴,誰依賴我
3、watch
我關註某個狀態,當狀態發生改變,進行restart
或者reload
操作
4、watch_in
我被某個狀態關註
5、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引用
Jinja模板使用
配置文件一般靈活多變,比如配置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
常用變數
1、字元串類型
{% set var = 'test' %} #定義變數 {{ var }} #調用變數
2、列表類型
{% set list = ['one', 'two', 'three'] %} {{ list[1] }} #獲取變數的第一個值
3、字典類型
{% 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 %}