天天看點

利用saltstack 部署lnmp環境(yum版本)

利用saltstack 部署lnmp環境(yum版本)

#######################分隔線####################

一、簡介

  saltstack 是一個新基礎設施管理工具,可以看做是強化的Func+弱化puppet的組合,間接的反映出了saltstack的兩大功能:遠端執行指令與配置管理,

  saltstack是使用python開發的,非常簡單易用和輕量級的管理工具,由master和minion構成,通過ZeroMQ進行通信

二、安裝

  安裝時需要epel源的支援,請自行安裝與當系統比對的epel源

  *:安裝依賴包 

1

<code>yum </code><code>install</code> <code>python-jinja2 -y</code>

  1、安裝master端

<code>yum -y </code><code>install</code> <code>salt-master enablerepr=epel-testing</code>

  2、安裝minion端

<code>yum -y </code><code>install</code> <code>salt-minion enablerepr=epel-testing</code>

三、配置環境

  a、master

    1、修改本地綁定位址

<code>sed</code> <code>-ie </code><code>'s/^#.*interface:.*/\  interface:  192.168.2.65/g'</code> <code>/etc/salt/master</code>

     注:或是此處寫上主機名,并綁定/etc/hosts檔案

    2、自動接收所有minion的請求

<code>sed</code> <code>-ie </code><code>'s@^#\(auto_accept: \)False@\  \1true@g'</code> <code>/etc/salt/master</code>

  b、minion

   1、指向master

<code>sed</code> <code>-ie </code><code>'s@^#.*master:.*@\  master:  salt@g'</code> <code>/etc/salt/minion</code>

注:由于saltstack配置檔案所限,當啟用每一個配置參數時對格式有嚴格要求,書寫時請注意

四、環境測試

  1、分别在master/minion中啟動服務

2

3

<code>#service salt-master start</code>

<code>#service salt-minion start</code>

   說明:

     saltstack的master監聽于4505,minion監聽于4506;

     可以将master與minion部署同一台伺服器上(沒有什麼意義[哈哈~])。

 2、salt 測試

4

5

<code>[root@openapi php-fpm]</code><code># salt "*" test.ping</code>

<code>192.168.2.36-CentOS.backup.</code><code>test</code><code>.backend:</code>

<code>    </code><code>True</code>

<code>192.168.2.30-centos.public.</code><code>test</code><code>:</code>

說明:salt的其它指令可用salt --help很簡單,在此不多介紹

五、salt 常用的正規表達式(部分)

  a、E:正則比對

<a href="http://s3.51cto.com/wyfs02/M02/70/80/wKioL1W4_f7i-jLPAACz8jBS0LA203.jpg" target="_blank"></a>

可以在每一個句後面加一個 -l debug來顯示指令具體執行過程

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<code>[root@openapi self_userd]</code><code># salt -E '(backend81)' test.ping</code>

<code>backend81:</code>

<code>[root@openapi self_userd]</code><code># salt -E '(backend81)' test.ping -l debug</code>

<code>[DEBUG   ] Reading configuration from </code><code>/etc/salt/master</code>

<code>[DEBUG   ] Guessing ID. The </code><code>id</code> <code>can be explicitly </code><code>in</code> <code>set</code> <code>/etc/salt/minion</code>

<code>[INFO    ] Found minion </code><code>id</code> <code>from generate_minion_id(): openapi.</code><code>test</code><code>.dns.com.cn</code>

<code>[DEBUG   ] Missing configuration </code><code>file</code><code>: ~/.saltrc</code>

<code>[DEBUG   ] Configuration </code><code>file</code> <code>path: </code><code>/etc/salt/master</code>

<code>[DEBUG   ] MasterEvent PUB socket URI: ipc:</code><code>///var/run/salt/master/master_event_pub</code><code>.ipc</code>

<code>[DEBUG   ] MasterEvent PULL socket URI: ipc:</code><code>///var/run/salt/master/master_event_pull</code><code>.ipc</code>

<code>[DEBUG   ] LazyLoaded local_cache.get_load</code>

<code>[DEBUG   ] get_iter_returns </code><code>for</code> <code>jid 20150727212822728009 sent to </code><code>set</code><code>([</code><code>'backend81'</code><code>]) will timeout at 21:28:27.732956</code>

<code>[DEBUG   ] jid 20150727212822728009 </code><code>return</code> <code>from backend81</code>

<code>[DEBUG   ] jid 20150727212822728009 found all minions </code><code>set</code><code>([</code><code>'backend81'</code><code>])</code>

  b、-L :指令行裡面一般是以清單的形式來指定對象的。

  c、-G:這個參數很強大,會根據預設的grain的結果來過濾。(grains也可以自己定義)

<a href="http://s3.51cto.com/wyfs02/M02/70/83/wKiom1W4_X6xGjf0AACqkBNK2kM670.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M00/70/80/wKioL1W4_4Oiz6lcAACmVYdhGlY139.jpg" target="_blank"></a>

  d、-N:這個參數是基于分組的,前提是你得先分好組。(分組可以定義于主比對檔案/etc/salt/master中,也可以定義于/etc/salt/master.d/*.conf)

<a href="http://s3.51cto.com/wyfs02/M02/70/80/wKioL1W5ADKxFDpLAAHISTdTPI8672.jpg" target="_blank"></a>

然後可以這樣使用

<a href="http://s3.51cto.com/wyfs02/M01/70/83/wKiom1W4_mOzPyZWAABgST-EzN4712.jpg" target="_blank"></a>

  e、-C :表示tagger可是一個複合語句

<code>[root@openapi salt]</code><code># salt -C 'G@virtual:physical and E@backend81' test.ping </code>

 f、-b :一次操作多少台,也可以使使用百分比來操作(--batch-size)

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

<code>[root@openapi salt]</code><code># salt "*" -b 3 grains.item os</code>

<code>#salt "*" --batch-size 25%  grains.item os</code>

<code>36 Detected </code><code>for</code> <code>this batch run</code>

<code>backend81 Detected </code><code>for</code> <code>this batch run</code>

<code>backend84 Detected </code><code>for</code> <code>this batch run</code>

<code>zabbix.server.dns.com.cn Detected </code><code>for</code> <code>this batch run</code>

<code>backend83 Detected </code><code>for</code> <code>this batch run</code>

<code>webdata.backup Detected </code><code>for</code> <code>this batch run</code>

<code> </code> 

<code>Executing run on [</code><code>'zabbix.server.dns.com.cn'</code><code>, </code><code>'webdata.backup'</code><code>, </code><code>'backend84'</code><code>]</code>

<code>webdata.backup:</code>

<code>    </code><code>----------</code>

<code>    </code><code>os:</code>

<code>        </code><code>CentOS</code>

<code>backend84:</code>

<code>zabbix.server.dns.com.cn:</code>

<code>Executing run on [</code><code>'backend83'</code><code>, </code><code>'backend81'</code><code>, </code><code>'36'</code><code>]</code>

<code>backend83:</code>

<code>36:</code>

注:

   更多的子產品使用說明可以使用

<code>salt \* sys.doc |</code><code>grep</code> <code>&lt;子產品名稱&gt;</code>

  salt 的每一個子指令都可以用-d來檢視具體的用法

六、自定義grains

 1、grains的優先級

    grains可以保持在minion端、通過master端下發等多個方式來分發。但不同的方法有不同的優先級的:

      a. /etc/salt/grains

      b. /etc/salt/minion

      c./srv/salt/_grains/  master端_grains目錄下

   優先級順序依次為存在在minion端/etc/salt/minion配置檔案中的同名grains會覆寫/etc/salt/grains檔案中的值,而通過master端_grains目錄下grains檔案下發的值可以會覆寫minion端的所有同名值。比較拗口,總之記得,通過master下發的grains優先級是最高的可,/etc/salt/minion次之,/etc/salt/grains最低(core grains不大懂,就不讨論了,這個比/etc/salt/grains還低)

 2、自定義grains

  注:

    a、首先要在master端的主比對檔案中開啟file_roots

<code> </code><code>file_roots:</code>

<code>    </code><code>base:</code>

<code>      </code><code>- </code><code>/srv/salt</code>

    b、如果沒有以上目錄,建立即可(此處使用_grains目錄)

<code>[root@openapi _grains]</code><code># pwd</code>

<code>/srv/salt/_grains</code>

    c、自定義grains字典

<code>[root@openapi _grains]</code><code># cat ports.py </code>

<code>#!/usr/bin/env python </code>

<code>#coding:utf8</code>

<code>def</code> <code>open_moutil_port ():</code>

<code>    </code><code>grains</code><code>=</code><code>{}</code>

<code>    </code><code>grains[</code><code>'web_port'</code><code>]</code><code>=</code><code>'80'</code>

<code>    </code><code>grains[</code><code>'mysql_path'</code><code>]</code><code>=</code><code>'/data/mysql'</code>

<code>    </code><code>grains[</code><code>'mysqld_port'</code><code>]</code><code>=</code><code>'3307'</code>

<code>    </code><code>grains[</code><code>'max_open_file'</code><code>]</code><code>=</code><code>'65535'</code>

<code>    </code><code>return</code> <code>grains</code>

   d、同步grains并重新加載grains(grains是“靜态”的,是每一個minion接入到master自動送出的)

<code>[root@openapi _grains]</code><code># salt "*" saltutil.sync_all</code>

<code>    </code><code>beacons:</code>

<code>    </code><code>grains:</code>

<code>    </code><code>modules:</code>

<code>    </code><code>outputters:</code>

<code>    </code><code>renderers:</code>

<code>    </code><code>returners:</code>

<code>    </code><code>states:</code>

<code>    </code><code>utils:</code>

<code>[root@openapi _grains]</code><code># salt '*' sys.reload_modules</code>

    e、查詢自定義的grains

<code>[root@openapi _grains]</code><code># salt "*" grains.item web_port</code>

<code>    </code><code>web_port:</code>

<code>        </code><code>80</code>

七、LNMP環境

  1、目錄結構如下:

<code>[root@openapi salt]</code><code># tree</code>

<code>.</code>

<code>├── _grains</code>

<code>│   └── ports.py</code>

<code>├── lnmp.sls</code>

<code>├── mysql</code>

<code>│   ├── installed.sls</code>

<code>│   └── my.cnf</code>

<code>├── nginx</code>

<code>│   ├── default.conf</code>

<code>│   └── installed.sls</code>

<code>├── php-fpm</code>

<code>│   ├── index.php</code>

<code>└── </code><code>top</code><code>.sls</code>

  a、top檔案(此檔案必須存在,它定義了各minion的執行規劃)

<code>[root@openapi salt]</code><code># cat top.sls </code>

<code>base:</code>

<code>  </code><code>'192.168.2.30-centos.public.test'</code><code>: </code><code>#此處可以寫組、正則、或minion;比對目标</code>

<code>    </code><code>- nginx.installed </code><code>#這表示到那一個目錄下的那一個檔案 ,此部分表示在30安裝nginx,php-fpm</code>

<code>    </code><code>- php-fpm.installed </code>

<code>  </code><code>'192.168.2.36-CentOS.backup.test.backend'</code><code>:</code>

<code>    </code><code>- mysql.installed </code><code>#在2.36上安裝mysql-server</code>

  b、nginx目錄下的檔案 

<code>[root@openapi nginx]</code><code># ll</code>

<code>total 8</code>

<code>-rw-r--r-- 1 sysadmin sysadmin 1102 Jul 29 21:50 default.conf </code>

<code>#nginx 預設的配置檔案,隻改了root目錄為/var/www/html,其它地方與/etc/nginx/conf.d/default完全一樣</code>

<code>-rw-r--r-- 1 root     root      360 Jul 29 23:23 installed.sls </code>

<code>#操作檔案 </code>

<code>[root@openapi nginx]</code><code># cat installed.sls </code>

<code>nginx: </code><code>#id </code>

<code> </code><code>pkg.installed: </code><code>#使用pkg安裝包,installed表示要安裝完成,也可以指定版本來保證所有環境使用同一版本軟體包</code>

<code>  </code><code>- name: nginx </code><code>#包名,如果沒有将繼承id名稱</code>

<code> </code><code>service.running: </code><code>#服務狀态</code>

<code>  </code><code>- </code><code>enable</code><code>: True </code><code>#是否啟動</code>

<code>  </code><code>- reload: True </code><code>#重新載入</code>

<code>  </code><code>- </code><code>watch</code><code>:  </code><code>#監控檔案</code>

<code>     </code><code>- </code><code>file</code><code>: </code><code>/etc/nginx/conf</code><code>.d</code><code>/default</code><code>.conf </code><code>#如果此檔案發生變化将檔案重新裝載到服務中</code>

<code>  </code><code>- require: </code><code>#依賴</code>

<code>     </code><code>- pkg: nginx </code><code>#包名</code>

<code> </code><code>file</code><code>.managed: </code><code>#檔案操作</code>

<code>   </code><code>- name: </code><code>/etc/nginx/conf</code><code>.d</code><code>/default</code><code>.conf </code><code>#檔案名</code>

<code>   </code><code>- </code><code>source</code><code>: salt:</code><code>//nginx/default</code><code>.conf </code><code>#base下那一個檔案</code>

<code>   </code><code>- user: nginx </code><code>#使用者</code>

<code>   </code><code>- group: root </code><code>#組</code>

<code>   </code><code>- mode: 644   </code><code>#權限</code>

<code>   </code><code>- backup: minion </code><code>#将上一個版本的檔案備份。(如果有的話)</code>

<code>   </code><code>- require:  </code><code>#依賴</code>

<code>      </code><code>- pkg: nginx</code>

  c、mysql目錄下的檔案

<code>[root@openapi mysql]</code><code># ll</code>

<code>-rw-r--r-- 1 root     root     434 Jul 29 23:07 installed.sls </code><code>#操作檔案</code>

<code>-rw-r--r-- 1 sysadmin sysadmin 775 Jul 29 22:26 my.cnf </code><code>#預設的比對檔案</code>

<code>[root@openapi mysql]</code><code># cat installed.sls </code>

<code>mysql-server:</code>

<code> </code><code>pkg.installed:</code>

<code>  </code><code>- name: mysql-server</code>

<code> </code><code>service.running:</code>

<code>  </code><code>- name: mysqld</code>

<code>  </code><code>- </code><code>enable</code><code>: True</code>

<code>  </code><code>- reload: True</code>

<code>  </code><code>- </code><code>watch</code><code>:</code>

<code>     </code><code>- </code><code>file</code><code>: </code><code>/etc/my</code><code>.cnf</code>

<code>  </code><code>- require:</code>

<code>     </code><code>- pkg: mysql-server</code>

<code> </code><code>file</code><code>.managed:</code>

<code>  </code><code>- name: </code><code>/etc/my</code><code>.cnf</code>

<code>  </code><code>- </code><code>source</code><code>: salt:</code><code>//mysql/my</code><code>.cnf</code>

<code>  </code><code>- user: mysql</code>

<code>  </code><code>- group: mysql</code>

<code>  </code><code>- mode: 644</code>

<code>  </code><code>- backup: minion</code>

<code>mysql:</code>

<code>  </code><code>pkg.installed:</code>

<code>   </code><code>- name: mysql</code>

<code>   </code> 

<code>myslq-devel:</code>

<code>   </code><code>- name: mysql-devel</code>

  d、php-fpm目錄下的檔案 

<code>[root@openapi php-fpm]</code><code># ll</code>

<code>-rw-r--r-- 1 root root  22 Jul 29 22:35 index.php</code>

<code>-rw-r--r-- 1 root root 351 Jul 29 23:34 installed.sls</code>

<code>[root@openapi php-fpm]</code><code># cat index.php  #php測試頁面</code>

<code>&lt;?php</code>

<code>   </code><code>phpinfo()</code>

<code>?&gt;</code>

<code>[root@openapi php-fpm]</code><code># cat installed.sls </code>

<code>php-xcache:</code>

<code>   </code><code>- name: php-xcache</code>

<code>php-fpm:</code>

<code>   </code><code>- name: php-fpm</code>

<code>  </code><code>service.running:</code>

<code>   </code><code>- </code><code>enable</code><code>: Ture</code>

<code>   </code><code>- require:</code>

<code>      </code><code>- pkg: php-fpm</code>

<code>  </code><code>file</code><code>.managed:</code>

<code>    </code><code>- name: </code><code>/var/www/html/index</code><code>.php</code>

<code>    </code><code>- </code><code>source</code><code>: salt:</code><code>//php-fpm/index</code><code>.php</code>

<code>    </code><code>- user: nginx</code>

<code>    </code><code>- group: root</code>

<code>    </code><code>- mode: 644</code>

<code>    </code><code>- require:</code>

<code>       </code><code>- pkg: php-fpm</code>

注:在php-fpm中的installed.sls如果需要的子產品不是php-fpm依賴的必需定義到phf-fpm之前,如果先安裝完成php-fpm後安裝所需要的php子產品,還要重新reloadphp-fpm服務才能生效

  e、定義順序檔案

   lnmp環境一般要先行安裝資料庫--&gt;web服務--&gt;php-fpm是以要定義一下兩台不同服務執行執行順序。

<code>[root@openapi salt]</code><code># pwd</code>

<code>/srv/salt</code>

<code>[root@openapi salt]</code><code># cat lnmp.sls </code>

<code>db_setup: </code><code>#id  </code>

<code> </code><code>salt.state: </code><code>#狀态</code>

<code>  </code><code>- tgt: </code><code>'192.168.2.36-CentOS.backup.test.backend'</code> <code>#目标與base定義的一樣</code>

<code>  </code><code>- highstate: True </code>

<code>web_setup:</code>

<code> </code><code>salt.state:</code>

<code>  </code><code>- tgt: </code><code>'192.168.2.30-centos.public.test'</code>

<code>  </code><code>- highstate: True</code>

<code>     </code><code>- salt: db_setup</code>

  2、執行操作

<code>salt-run state.orchestrate lnmp</code>

 注: 也可以使用如下指令測試 

<code>salt-run state.orchestrate lnmp </code><code>test</code><code>=Ture</code>

剩下說等待操作完成了

  3、最絡執行結果

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

<code>[root@openapi nginx]</code><code># salt-run state.orchestrate lnmp</code>

<code>openapi.</code><code>test</code><code>.dns.com.cn_master:</code>

<code>----------</code>

<code>          </code><code>ID: db_setup</code>

<code>    </code><code>Function: salt.state</code>

<code>      </code><code>Result: True</code>

<code>     </code><code>Comment: States ran successfully. No changes made to 192.168.2.36-CentOS.backup.</code><code>test</code><code>.backend.</code>

<code>     </code><code>Started: 23:27:11.401701</code>

<code>    </code><code>Duration: 3533.27 ms</code>

<code>     </code><code>Changes:   </code>

<code>          </code><code>ID: web_setup</code>

<code>     </code><code>Comment: States ran successfully. Updating 192.168.2.30-centos.public.</code><code>test</code><code>.</code>

<code>     </code><code>Started: 23:27:14.936140</code>

<code>    </code><code>Duration: 46763.368 ms</code>

<code>              </code><code>192.168.2.30-centos.public.</code><code>test</code><code>:</code>

<code>              </code><code>----------</code>

<code>                        </code><code>ID: nginx</code>

<code>                  </code><code>Function: pkg.installed</code>

<code>                    </code><code>Result: True</code>

<code>                   </code><code>Comment: Package nginx is already installed.</code>

<code>                   </code><code>Started: 23:29:08.840872</code>

<code>                  </code><code>Duration: 971.023 ms</code>

<code>                   </code><code>Changes:   </code>

<code>                  </code><code>Function: </code><code>file</code><code>.managed</code>

<code>                      </code><code>Name: </code><code>/etc/nginx/conf</code><code>.d</code><code>/default</code><code>.conf</code>

<code>                   </code><code>Comment: File </code><code>/etc/nginx/conf</code><code>.d</code><code>/default</code><code>.conf is </code><code>in</code> <code>the correct state</code>

<code>                   </code><code>Started: 23:29:09.816842</code>

<code>                  </code><code>Duration: 5.82 ms</code>

<code>                  </code><code>Function: service.running</code>

<code>                   </code><code>Comment: Service nginx is already enabled, and is </code><code>in</code> <code>the desired state</code>

<code>                   </code><code>Started: 23:29:09.822994</code>

<code>                  </code><code>Duration: 273.52 ms</code>

<code>                        </code><code>ID: php-fpm</code>

<code>                   </code><code>Comment: The following packages were installed</code><code>/updated</code><code>: php-fpm</code>

<code>                   </code><code>Started: 23:29:10.097200</code>

<code>                  </code><code>Duration: 26085.157 ms</code>

<code>                            </code><code>----------</code>

<code>                            </code><code>php-fpm:</code>

<code>                                </code><code>----------</code>

<code>                                </code><code>new:</code>

<code>                                    </code><code>5.3.3-46.el6_6</code>

<code>                                </code><code>old:</code>

<code>                                    </code> 

<code>                   </code><code>Comment: Started Service php-fpm</code>

<code>                   </code><code>Started: 23:29:36.192137</code>

<code>                  </code><code>Duration: 301.652 ms</code>

<code>                                </code><code>True</code>

<code>                      </code><code>Name: </code><code>/var/www/html/index</code><code>.php</code>

<code>                   </code><code>Comment: File </code><code>/var/www/html/index</code><code>.php updated</code>

<code>                   </code><code>Started: 23:29:36.499508</code>

<code>                  </code><code>Duration: 23.542 ms</code>

<code>                            </code><code>diff</code><code>:</code>

<code>                                </code><code>New </code><code>file</code>

<code>                            </code><code>mode:</code>

<code>                                </code><code>0644</code>

<code>                            </code><code>user:</code>

<code>                                </code><code>nginx</code>

<code>                        </code><code>ID: php-xcache</code>

<code>                   </code><code>Comment: The following packages were installed</code><code>/updated</code><code>: php-xcache</code>

<code>                   </code><code>Started: 23:29:36.527960</code>

<code>                  </code><code>Duration: 16844.534 ms</code>

<code>                            </code><code>php-xcache:</code>

<code>                                    </code><code>3.0.4-1.el6</code>

<code>              </code> 

<code>              </code><code>Summary</code>

<code>              </code><code>------------</code>

<code>              </code><code>Succeeded: 7 (changed=4)</code>

<code>              </code><code>Failed:    0</code>

<code>              </code><code>Total states run:     7</code>

<code>Summary</code>

<code>------------</code>

<code>Succeeded: 2 (changed=1)</code>

<code>Failed:    0</code>

<code>Total states run:     2</code>

溫馨提示:在解除安裝軟體包時,千萬不要用yum、yum、yum.

    a、檢視服務狀态

<code>[root@openapi salt]</code><code># salt "192.168.2.36-CentOS.backup.test.backend" service.status mysqld</code>

<code>    </code><code>Ture</code>

<code>[root@openapi salt]</code><code># salt "192.168.2.30-centos.public.test" service.status nginx</code>

<code>[root@openapi salt]</code><code># salt "192.168.2.30-centos.public.test" service.status php-fpm</code>

    b、測試php

ps:

   其它了服務也是同理,是重要的是注意操作檔案的格式及服務執行的先後順序。

   下次更新來個源碼的及pillar的使用!回家,碎覺~

本文轉自 jinlinger 51CTO部落格,原文連結:http://blog.51cto.com/essun/1679860,如需轉載請自行聯系原作者

繼續閱讀