知乎居然開始限制文章字數了,大家可以轉到[Linux][運維]SaltStack安裝Apache/Mysql/PHP部署Wordpress - CSDN博客查看完整文章,這裡有部分輸出被刪減了。

salt介紹

SaltStack是一個伺服器基礎架構集中化管理平台,具備配置管理、遠程執行、監控等功能,基於Python語言實現,結合輕量級消息隊列(ZeroMQ)與Python第三方模塊(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)構建。

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

master監聽4505和4506埠,4505對應的是ZMQ的PUB system,用來發送消息,4506對應的是REP system是來接受消息的。

命令執行步驟

具體步驟如下

  • Salt stack的Master與Minion之間通過ZeroMq進行消息傳遞,使用了ZeroMq的發布-訂閱模式,連接方式包括tcp,ipc
  • salt命令,將cmd.run ls命令從salt.client.LocalClient.cmd_cli發布到master,獲取一個Jodid,根據jobid獲取命令執行結果。
  • master接收到命令後,將要執行的命令發送給客戶端minion。
  • minion從消息匯流排上接收到要處理的命令,交給minion._handle_aes處理
  • minion._handle_aes發起一個本地線程調用cmdmod執行ls命令。線程執行完ls後,調用minion._return_pub方法,將執行結果通過消息匯流排返回給master
  • master接收到客戶端返回的結果,調用master._handle_aes方法,將結果寫的文件中
  • salt.client.LocalClient.cmd_cli通過輪詢獲取Job執行結果,將結果輸出到終端。

saltstack安裝

測試環境

  • CentOS6.5
  • master:172.20.22.46 (主機名:hadoop1) # 之前配置Spark改的名字
  • slave:172.20.22.159 (主機名:hadoop2)

分為以下幾步

關閉selinux

/etc/selinux/config,把SELINUX=enforcing改為SELINUX=disabled

master安裝salt-minion, salt-master

Google

slave安裝salt-minion

Google

配置salt-master

參考

#指定master,冒號後有一個空格master: 192.168.2.22user: root#-------以下為可選--------------# salt運行的用戶,影響到salt的執行許可權user: root#s alt的運行線程,開的線程越多一般處理的速度越快,但一般不要超過CPU的個數worker_threads: 10# master的管理埠publish_port : 4505# master跟minion的通訊埠,用於文件服務,認證,接受返回結果等ret_port : 4506# 如果這個master運行的salt-syndic連接到了一個更高層級的master,那麼這個參數需要配置成連接到的這個高層級master的監聽埠syndic_master_port : 4506# 指定pid文件位置pidfile: /var/run/salt-master.pid# saltstack 可以控制的文件系統的開始位置root_dir: /# 日誌文件地址log_file: /var/log/salt_master.log# 分組設置nodegroups: group_all: *# salt state執行時候的根目錄file_roots: base: - /srv/salt/# 設置pillar 的根目錄pillar_roots: base: - /srv/pillar

本文主要改動

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

配置salt-minion

參考

#指定master,冒號後有一個空格master: 192.168.2.22id: minion-01user: root#-------以下為可選--------------# minion的識別ID,可以是IP,域名,或是可以通過DNS解析的字元串id: 192.168.0.100# salt運行的用戶許可權user: root# master的識別ID,可以是IP,域名,或是可以通過DNS解析的字元串master : 192.168.0.100# master通訊埠master_port: 4506# 備份模式,minion是本地備份,當進行文件管理時的文件備份模式backup_mode: minion# 執行salt-call時候的輸出方式output: nested # minion等待master接受認證的時間acceptance_wait_time: 10# 失敗重連次數,0表示無限次,非零會不斷嘗試到設置值後停止嘗試acceptance_wait_time_max: 0# 重新認證延遲時間,可以避免因為master的key改變導致minion需要重新認證的syn風暴random_reauth_delay: 60# 日誌文件位置log_file: /var/logs/salt_minion.log# 文件路徑基本位置file_roots: base: - /etc/salt/minion/file# pillar基本位置pillar_roots: base: - /data/salt/minion/pillar

本文主要改動

master : 172.20.22.46grains: roles: - nginx env: - test myname: - yzd

啟動/重啟salt

sudo service salt-master start/restart

sudo service salt-minion start/restart

master認證minion的key

Google

檢查安裝是否完成

[root@hadoop1 Desktop]# salt-run manage.statusdown:up: - hadoop1 - hadoop2[root@hadoop1 Desktop]# salt * grains.item os mynamehadoop1: ---------- myname: os: CentOShadoop2: ---------- myname: # 自定義的grains - yzd os: CentOS

其它

關於grains/pillar/state等可以查閱文檔

部署WordPress

環境要求

摘自官網

We recommend servers running version 7.2 or greater of PHP and MySQL version 5.6 OR MariaDB version 10.0 or greater. We also recommend either Apache or Nginx as the most robust options for running WordPress, but neither is required.

最後的完整文件樹

[root@hadoop1 base]# tree.├── mysql│ ├── conf.sls│ ├── files│ │ ├── conf.sh│ │ ├── my.cnf│ │ ├── mysql-5.5.60.tar.gz│ │ ├── mysql-5.6.40.tar.gz│ │ ├── mysqld│ │ └── mysqllns.sh│ ├── init.sls│ └── install.sls├── top.sls├── web│ ├── apache.sls│ ├── ap.sls│ └── files│ ├── apache-conf.d│ │ ├── mod_dnssd.conf│ │ ├── php.conf│ │ ├── README│ │ └── welcome.conf│ ├── httpd.conf│ └── php.ini└── wordpress ├── files │ ├── wordpress-latest.tar.gz │ └── wordpress-yang.tar.gz └── wp-install.sls7 directories, 21 files

安裝Apache和Php

流程

  • 安裝apache和php依賴
  • 將主機的apache和php配置文件覆蓋從機文件
  • 運行apache服務

web/ap.sls:

lamp-install: pkg.installed: - pkgs: - httpd - php - php-pdo - php-mysql - php-gdapache-config: file.managed: - name: /etc/httpd/conf/httpd.conf #服務實際使用的文件路徑 - source: salt://web/files/httpd.conf #salt的源文件用於分發到minion上面 路徑是base目錄下面的web 這裡也支持http和ftp方式 - user: root - group: root - mode: 644 - require: - pkg: lamp-installphp-config: file.managed: - name: /etc/php.ini - source: salt://web/files/php.ini - user: root - group: root - mode: 644#使用watch在apache配置文件發送變化時,重新載入apache配置lamp-service: service.running: - name: httpd - enable: True - reload: True #如果不加reload 默認會重啟服務 - watch: #增加 - file: apache-config #監控上面的apache-config ID 所以說 一個ID在一個狀態只能出現一次apache-conf: file.recurse: - name: /etc/httpd/conf.d - source: salt://web/files/apache-conf.d

運行結果:

[root@hadoop1 base]# salt hadoop2 state.sls web.aphadoop2:---------- ID: lamp-install Function: pkg.installed Result: True Comment: 4 targeted packages were installed/updated. The following packages were already installed: httpd Started: 09:14:41.225378 Duration: 64220.577 ms Changes: ---------- libXpm: ---------- new: 3.5.10-2.el6 old: php: ---------- new: 5.3.3-49.el6 old: php-cli: ---------- new: 5.3.3-49.el6 old: php-common: ---------- new: 5.3.3-49.el6 old: php-gd: ---------- new: 5.3.3-49.el6 old: php-mysql: ---------- new: 5.3.3-49.el6 old: php-pdo: ---------- new: 5.3.3-49.el6 old:---------- ID: apache-config Function: file.managed Name: /etc/httpd/conf/httpd.conf Result: True Comment: File /etc/httpd/conf/httpd.conf is in the correct state Started: 09:15:45.451376 Duration: 14.631 ms Changes: ---------- ID: php-config Function: file.managed Name: /etc/php.ini Result: True Comment: File /etc/php.ini is in the correct state Started: 09:15:45.466131 Duration: 4.601 ms Changes: ---------- ID: lamp-service Function: service.running Name: httpd Result: True Comment: Service httpd has been enabled, and is running Started: 09:15:45.477085 Duration: 477.583 ms Changes: ---------- httpd: True---------- ID: apache-conf Function: file.recurse Name: /etc/httpd/conf.d Result: True Comment: Recursively updated /etc/httpd/conf.d Started: 09:15:45.954926 Duration: 149.052 ms Changes: ---------- /etc/httpd/conf.d/welcome.conf: ---------- diff: --- +++ @@ -9,3 +9,4 @@ ErrorDocument 403 /error/noindex.html </LocationMatch>Summary------------Succeeded: 5 (changed=3)Failed: 0------------Total states run: 5

安裝Mysql5.6

注意:CentOS6 yum自帶的Mysql版本是5.1,達不到wordpress的最低版本要求。這裡我們使用源碼安裝mysql5.6。步驟比較多,坑也很多。

流程

  • 傳輸mysql源碼包至從機
  • 解壓源碼包
  • 安裝編譯所需依賴
  • 源碼安裝mysql
  • 將主機my.cnf覆蓋從機文件
  • 運行conf.sh,使用scripts/mysql_install_db建立資料庫
  • 運行mysqllns.sh創建所需要的軟連接
  • 將主機mysqld覆蓋從機文件
  • 運行mysqld

init.sls

include: - mysql.install - mysql.conf

install.sls

#install source mysqlmysql_source: file.managed: - name: /home/mysql-5.6.40.tar.gz - unless: test -e /home/mysql-5.6.40.tar.gz - source: salt://mysql/files/mysql-5.6.40.tar.gz#tar source mysqlextract_mysql: cmd.run: - cwd: /home - names: - tar xf mysql-5.6.40.tar.gz - unless: test -d /home/mysql-5.6.40 - require: - file: mysql_source#useradd for mysqlmysql_user: user.present: - name: mysql - uid: 1024 - createhome: False - gid_from_name: True - shell: /sbin/nologin#mysql pkg.installmysql_pkg: pkg.installed: - pkgs: - gcc - gcc-c++ - autoconf - automake - openssl - openssl-devel - zlib - zlib-devel - ncurses-devel - libtool-ltdl-devel - cmake#mysql source installmysql_commpile: cmd.run: - cwd: /home/mysql-5.6.40 - names: - chown root:root /home/mysql-5.6.40 -R - cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATTON=utf8_cuicode_ci -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_EMBEDDED_SERVER=1 -DENABLED_LOCAL_INFILE=1 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_DEBUG=0 - make - make install - require: - cmd: extract_mysql - pkg: mysql_pkg - unless: test -d /usr/local/mysql

conf.sls

include: - mysql.install# mysql for configmysql_cnf: file.managed: - name: /etc/my.cnf - user: root - mode: 755 - source: salt://mysql/files/my.cnf# mysql initsalt://mysql/files/conf.sh: cmd.script: - env: - BATCH: yes - require: - cmd: mysql_commpile - pkg: mysql_pkg # mysql lnksalt://mysql/files/mysqllns.sh: cmd.script: - env: - BATCH: yes - require: - cmd: mysql_commpile - pkg: mysql_pkg# mysql servermysql_service: file.managed: - name: /etc/init.d/mysqld - user: root - mode: 755 - source: salt://mysql/files/mysqld cmd.run: - names: - /sbin/chkconfig --add mysqld - /sbin/chkconfig --level 35 mysqld on - unless: /sbin/chkconfig --list mysqld service.running: - name: mysqld - enable: True - reload: True

conf.sh:

#!/bin/bash/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/

mysqllns.sh

#!/bin/bashln -sv /usr/local/mysql/bin/mysql /usr/bin ln -sv /usr/local/mysql/bin/mysqladmin /usr/bin/ln -sv /usr/local/mysql/bin/mysqldump /usr/bin/#mysql competence/bin/chown -R mysql.mysql /usr/local/mysql/ && /bin/chown -R mysql.mysql /usr/local/mysql/data/#for wordpressmkdir /var/lib/mysqlln -sv /usr/local/mysql/data/mysql.sock /var/lib/mysql/

mysqld

#!/bin/sh# chkconfig: 2345 10 50# description: mysqldbasedir=/usr/local/mysql/datadir=/usr/local/mysql/data/

注意:

需要添加下面兩行來保證chkconfig設置成功

#!/bin/sh# chkconfig: 2345 10 50

運行結果

由於首次運行編譯返回日誌過長,為了美觀的結果,運行了兩次,所以軟連接腳本顯示失敗(文件已存在)

[root@hadoop1 base]# salt hadoop2 state.sls mysql.inithadoop2:---------- ID: mysql_source Function: file.managed Name: /home/mysql-5.6.40.tar.gz Result: True Comment: unless execution succeeded Started: 10:09:23.030270 Duration: 888.041 ms Changes: ---------- ID: extract_mysql Function: cmd.run Name: tar xf mysql-5.6.40.tar.gz Result: True Comment: unless execution succeeded Started: 10:09:23.919593 Duration: 7.14 ms Changes: ---------- ID: mysql_user Function: user.present Name: mysql Result: True Comment: User mysql is present and up to date Started: 10:09:23.927631 Duration: 2.501 ms Changes: ---------- ID: mysql_pkg Function: pkg.installed Result: True Comment: All specified packages are already installed. Started: 10:09:23.931484 Duration: 2006.185 ms Changes: ---------- ID: mysql_commpile Function: cmd.run Name: cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATTON=utf8_cuicode_ci -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_EMBEDDED_SERVER=1 -DENABLED_LOCAL_INFILE=1 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_DEBUG=0 Result: True Comment: unless execution succeeded Started: 10:09:25.939461 Duration: 8.829 ms Changes: ---------- ID: mysql_commpile Function: cmd.run Name: make Result: True Comment: unless execution succeeded Started: 10:09:25.948913 Duration: 5.983 ms Changes: ---------- ID: mysql_commpile Function: cmd.run Name: make install Result: True Comment: unless execution succeeded Started: 10:09:25.955397 Duration: 6.567 ms Changes: ---------- ID: mysql_cnf Function: file.managed Name: /etc/my.cnf Result: True Comment: File /etc/my.cnf is in the correct state Started: 10:09:25.962408 Duration: 4.894 ms Changes: ---------- ID: salt://mysql/files/conf.sh Function: cmd.script Result: True Comment: Command salt://mysql/files/conf.sh run Started: 10:09:25.967900 Duration: 200740.417 ms Changes: ---------- pid: 28643 retcode: 0 stderr: 2018-07-24 10:09:26 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2018-07-24 10:09:26 0 [Note] Ignoring --secure-file-priv value as server is running with --bootstrap. 2018-07-24 10:09:26 0 [Note] /usr/local/mysql//bin/mysqld (mysqld 5.6.40) starting as process 28647 ... 2018-07-24 10:11:06 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2018-07-24 10:11:06 0 [Note] Ignoring --secure-file-priv value as server is running with --bootstrap. 2018-07-24 10:11:06 0 [Note] /usr/local/mysql//bin/mysqld (mysqld 5.6.40) starting as process 28744 ... stdout: 省略---------- ID: salt://mysql/files/mysqllns.sh Function: cmd.script Result: False Comment: Command salt://mysql/files/mysqllns.sh run Started: 10:12:46.710451 Duration: 262.12 ms Changes: ---------- pid: 28810 retcode: 1 stderr: ln: creating symbolic link `/usr/bin/mysql: File exists ln: creating symbolic link `/usr/bin/mysqladmin: File exists ln: creating symbolic link `/usr/bin/mysqldump: File exists mkdir: cannot create directory `/var/lib/mysql: File exists ln: creating symbolic link `/var/lib/mysql/mysql.sock: File exists stdout:---------- ID: mysql_service Function: file.managed Name: /etc/init.d/mysqld Result: True Comment: File /etc/init.d/mysqld is in the correct state Started: 10:12:46.972872 Duration: 4.936 ms Changes: ---------- ID: mysql_service Function: cmd.run Name: /sbin/chkconfig --add mysqld Result: True Comment: unless execution succeeded Started: 10:12:46.977924 Duration: 10.248 ms Changes: ---------- ID: mysql_service Function: cmd.run Name: /sbin/chkconfig --level 35 mysqld on Result: True Comment: unless execution succeeded Started: 10:12:46.988419 Duration: 6.787 ms Changes: ---------- ID: mysql_service Function: service.running Name: mysql Result: True Comment: Service mysql has been enabled, and is in the desired state Started: 10:12:46.995438 Duration: 236.708 ms Changes: ---------- mysql: TrueSummary-------------Succeeded: 13 (changed=3)Failed: 1-------------Total states run: 14

安裝wordpress

流程

  • 將wordpress解壓至/var/www/html
  • 修改wp-config.php並發送至從機
  • 在資料庫新建名為wordpress資料庫

wp-install.sls

# copy tar.gzwordpress_source: file.managed: - name: /home/wordpress-yang.tar.gz - unless: test -e /home/wordpress-yang.tar.gz - source: salt://wordpress/files/wordpress-yang.tar.gz#tar sourceextract_wordpress: cmd.run: - cwd: /home - names: - tar xf wordpress-yang.tar.gz - chown root:root /home/wordpress -R - unless: test -d /home/wordpress - require: - file: wordpress_source# move to wwwmove_wordpress: cmd.run: - cwd: /home - names: - cp -rf wordpress/* /var/www/html/ - mysql -uroot -e "create database IF NOT EXISTS wordpress" - require: - cmd: extract_wordpress

總結

成功通過master的saltstack為slave安裝lamp環境,並將openstack部署成功。

遇到的問題整理

無法運行state.sls

報錯the function "state.highstate" is running as PID xxxx

kill掉slave的進程

php admin不顯示網頁

重啟apache

sudo service httpd restart

MySQL啟動報:[ERROR] The server quit without updating PID file

blog.csdn.net/ydyang112

cmd.run的順序控制

jianshu.com/p/624b9cf51

查看順序

salt hadoop2 state.show_sls wordpress.wp-installorder越小越早執行,-1是最後

Cant connect to local MySQL server through socket /tmp/mysql.sock (2)

aiezu.com/article/mysql

service mysqld does not support chkconfig

cnblogs.com/niocai/arch

unless命令

blog.51cto.com/73223304

unless:用於檢查的命令,僅當unless選項指向的命令返回false時才執行name指向的命令

若minion端不存在/tmp/nginx-1.4.5.tar.gz這個文件,才會執行這個file模塊

參考

jianshu.com/p/624b9cf51

blog.csdn.net/chengyuqilinuxidc.com/Linux/2017cnblogs.com/xiewenming/
推薦閱讀:
查看原文 >>
相关文章