天天看點

大型架構及配置技術ansible(一)之ansible基礎,ad-hoc,批量配置管理,ansible七種武器,JSON簡介,YAML簡介

一、ansible基礎

6台虛拟機(2cpu,1.5G以上記憶體,10G以上硬碟,1塊網卡)

    主機名      IP位址             角色

    ansible40   192.168.4.40/24    管理主機

    web41       192.168.4.41/24    托管主機

    web42       192.168.4.42/24    托管主機

    db43        192.168.4.43/24    托管主機

    db44        192.168.4.44/24    托管主機

    cache45     192.168.4.45/24    托管主機

1)ansible簡介

1.什麼是ansible

    ansible是2013年推出的一款IT自動化和DevOps軟體,2015年被RedHat收購,是基于python研發,糅合很多老運維工具的優點,實作了批量作業系統配置,批量程式部署,批量運作指令等功能

    ansible可以實作:

        自動化部署APP

        自動化管理配置項

        自動化持續傳遞

        自動化(AWS)雲服務管理

2.為什麼選擇ansible

        選擇一款配置管理軟體,無外乎從以下幾點來權衡利弊

            活躍度(社群)

            學習成本

            使用成本

            編碼語言

            性能

            使用是否廣泛

        ansible優點:

            隻需要SSH和Python即可使用

            無用戶端

            ansible功能強大,子產品豐富

            上手容易,門檻低

            基于Python開發,做二次開發更容易

            使用公司比較多,社群活躍

3.ansible特性

    子產品化設計,調用特定的子產品完成特定任務

    基于Python語言實作

        paramiko

        PyYAML(半結構化語言)

        Jinja2

    其子產品支援JSON等标準輸出格式,可以采用任何變成語言重寫

    部署簡單

    主從模式工作

    支援自定義子產品

    支援playbook

    易于使用

    支援多層部署

    支援異構IT環境

4.工作流程

2)ansible安裝

1.軟體依賴關系

    對管理主機

        要求Python 2.6或2.7

    ansible使用以下子產品,都需要安裝

        paramiko 

        PyHAML

        Jinja2 

        httplib2

        six

    對于被托管主機

        ansible預設通過SSH協定管理機器

        被管理主機要開啟ssh服務,允許ansible主機登入

        在托管節點上也需要安裝Python2.5或以上的版本

        如果托管節點上開啟了SELinux,需要安裝libselinux-python

2.安裝ansible

[[email protected] ~]# vim /etc/hosts

192.168.4.40 ansible40

192.168.4.41 web41

192.168.4.42 web42

192.168.4.43 db43

192.168.4.44 db44

192.168.4.45 cache45

    安裝及驗證

        在ansible托管主機上配置yum配置檔案

        安裝 yum install ansible 

        驗證ansible --version

[[email protected] ~]# cd ansible/

[[email protected] ansible]# yum -y install *.rpm

[[email protected] ~]# ansible --version

二、ad-hoc

1.主機定義與分組

    安裝ansible之後可以做一些簡單的任務

    ansible配置檔案查找順序

        首先檢測ANSIBLE_CONFIG變量定義的配置檔案

        其次檢查目前目錄下的./ansible.cfg檔案

        再次檢查目前使用者家目錄下的~/ansible.cfg檔案

        最後檢查/etc/ansible/ansible.cfg檔案

    /etc/ansible/ansible.cfg是ansible的預設配置檔案路徑

    ansible.cfg配置檔案:

        inventory定義托管主機位址配置檔案路徑名

        inventory指定的配置檔案,寫入遠端主機的位址

    格式:

        #表示注釋

            [組名稱]

            主機名稱或ip位址,其他參數

    ansible.cfg配置檔案:        

        ssh主機key驗證配置參數

        host_key_checking = False

        如果為False,不需要輸入yes

        如果為True,等待輸入yes

    分組定義,範圍定義樣例

        [web]

        web1

        web2

        [db]

        db[1:2]

        [other]

        cache  

[[email protected] ~]# vim /etc/ansible/ansible.cfg    

 14 inventory      = /etc/ansible/hosts

 61 host_key_checking = False

[[email protected] ~]# vim /etc/ansible/hosts    

 44 [web]

 45 web41

 46 web42

 47 

 48 [db]

 49 db43

 50 db44

 51 

 52 [other]

 53 cache45

2.ansible指令基礎

    ansible主機集合 -m 子產品名稱 -a 子產品參數

        主機集合 主機名或分組名,多個使用逗号分隔

        -m 子產品名稱,預設command子產品

        -a or --args 子產品參數

        -i inventory檔案路徑,或可執行腳本

        -k 使用互動式登入密碼

        -e 定義變量

        -v 顯示詳細資訊

    列出要執行的主機

        ansible all --list-hosts

[[email protected] ~]# ansible all --list-hosts

  hosts (5):

    web41

    web42

    cache45

    db43

    db44

[[email protected] ~]# ansible web,db43 --list-hosts

  hosts (3):

    web41

    web42

    db43

    批量檢測主機

        ansible all -m ping -k

[[email protected] ~]# ansible web -m ping -k

SSH password: 

3.部署證書檔案

    ansible是通過SSH在遠端執行指令的

    ssh遠端執行指令必須通過認證才行

    密碼寫入配置檔案安全性很差

    使用key認證

    給所有主機部署公鑰

        沒有密鑰指令執行會出錯

        ansible web -a 'uptime'

[[email protected] ~]# cd /root/.ssh/

[[email protected] .ssh]# ssh-keygen -t rsa -b 2048 -N '' -f key

[[email protected] .ssh]# ssh-copy-id -i key.pub cache45  ==>>拷貝給所有主機

[[email protected] .ssh]# ssh web41 -i key          ==>>指定私鑰

4.inventory擴充參數

    ansible_ssh_port

    ssh端口:如果不是預設的端口号,通過此變量設定

    ansible_ssh_user

    預設的ssh使用者名

    ansible_ssh_pass

    ssh密碼(這種方式不安全,建議采用--ask-pass或SSH密鑰)

    ansible_ssh_private_key_file

    ssh使用的私鑰檔案,适用于有多個密鑰,

    vars變量定義,用于組名後面

        例如:[all:vars]

              ansible_ssh_private_key_file="/root/.ssh/key"

    children子組定義,用于引用其他組名稱

        例如:[app:children]

              web

              db

[[email protected] ~]# cat -n /etc/ansible/hosts 

    44    [web]

    45    web41

    46    web42

    47    

    48    [db]

    49    db43

    50    db44 ansible_ssh_port=22            ==>>給單個主機定義變量

    51    

    52    [other]

    53    cache45

    54    

    55    [all:vars]

    56    ansible_ssh_private_key_file="/root/.ssh/key"   ==>>給所有主機定義變量

    57    

    58    [app:children]

    59    web

    60    db

    自定義配置檔案

        建立檔案夾myansible

        建立配置檔案ansible.cfg 

[[email protected] ~]# mkdir /myansible

[[email protected] myansible]# touch ansible.cfg

[[email protected] myansible]# vim ansible.cfg 

  1 [defaults]

  2 inventory = myhosts

  3 host_key_checking = False

[[email protected] myansible]# vim myhosts

     1    [app1]

     2    web41

     3    db43

     4    

     5    [app2]

     6    web42

     7    db44

     8    cache45

5.動态主機

    無限可能

        ansible Inventory包含靜态和動态的Inventory,靜态Inventory指在檔案/etc/ansible/hosts中指定的主機群組,動态Inventory指通過外部腳本擷取主機清單,按照其要求格式傳回給ansible指令

    Json

        JSON(JavaScript Object Notation,Javascript對象表示法),一種基于文本獨立于語言的輕量級資料交換格式

三、批量配置管理

1.ansible-doc和ping子產品

    ansible-doc

        子產品的手冊相當與shell的man,很重要

        ansible-doc -l   列出所有子產品

        ansible-doc modulename  檢視幫助

    ping子產品

        測試網絡連通性,ping子產品沒有參數

[[email protected] ~]# ansible-doc -l        

[[email protected] ~]# ansible-doc lineinfile

[[email protected] ~]# ansible all -m ping      ==>>測試ssh的連通性

2.command子產品

    預設子產品,遠端執行指令

    用法;

    ansible host-pattern -m command -a '[args]'

[[email protected] ~]# ansible all -m command -a 'uptime'       ==>>檢視所有機器負載

[[email protected] ~]# ansible all -m command -a 'date +%F_%T'  ==>>檢視日期和時間

    注意事項:

        該子產品通過-a跟上要執行的指令可以直接執行,若指令裡有如下字元則執行不成功,<,>,|,&。

        command子產品不能解析系統變量

        該子產品不啟動shell直接在ssh程序中執行,所有使用到shell的指令執行都會失敗

3.shell子產品

    shell子產品用法基本和command一樣,差別是shell子產品是通過/bin/sh進行執行指令,可以執行任意指令

    不能執行互動式的指令,如vim,top

[[email protected] ~]# ansible all -m shell -a 'uptime'   ==>>檢視所有機器負載

    變量解析

        ansible執行指令是二次解析

        第一次在本機解析,第二次在執行機器解析

        需要二次解析的變量要轉義(\)

    檔案在哪裡

        檔案在使用者家目錄

        ansible是使用ssh多次連接配接執行

        連接配接退出之後之前的狀态就全部失效了

        解決辦法:使用chdir代替cd指令

[[email protected] ~]# ansible cache45 -m shell -a 'chdir=/tmp touch testfile'

[[email protected] ~]# ansible cache45 -m shell -a 'touch /tmp/testfile1'

[[email protected] ~]# ansible web41,db44 -m shell -a 'useradd nb'

[[email protected] ~]# ansible web41,db44 -m shell -a 'echo 123456 |passwd --stdin nb'

4.scripts子產品

    在本地寫腳本,然後使用scprit子產品批量執行

    注意:該腳本包含但不限于shell腳本,隻要指定Sha-bang解釋器的腳本都可運作

[[email protected] ~]# vim userwk.sh

#!/bin/bash

id nb

if [ $? != 0 ];then

  useradd wk

  echo 123456 | passwd --stdin wk

fi

[[email protected] ~]# ansible web -m script -a 'userwk.sh'

5.yum子產品

    使用yum包管理器來管理軟體包

    name:要進行操作的軟體包名字

    state:動作(installed,removed)

    install === installed

    remove === removed

[[email protected] ~]# ansible db -m yum -a 'name="mariadb-server" state=installed'  ==>>給所有db主機安裝mariadb

[[email protected] ~]# ansible cache45 -m yum -a 'name="lrzsz" state=removed'   ==>>cache45主機删除lrzsz

6.service子產品

    name:必選項,服務名稱

    enabled:是否開機啟動 yes|no

    sleep:執行restarted ,會在stop和start之間沉睡幾秒鐘

    state:對目前服務執行啟動,停止,重新開機,重新加載等操作(started,stopped,restarted,reloaded)

[[email protected] ~]# ansible cache45 -m service -a 'name="sshd" enabled="yes" state="started"'

7.copy子產品

    複制檔案到遠端主機

    src:複制本地檔案到遠端主機,絕對路徑和相對路徑都可以,路徑為目錄時會遞歸複制。若路徑以“/”解為,隻複制目錄裡的内容,若不以“/”結尾,則複制包含目錄在内的整個内容,類似rsync

    dest:必選項,遠端主機的絕對路徑,如果源檔案是一個目錄,那該路徑必須是目錄

    backup:覆寫前先備份原檔案,備份檔案包含時間資訊。有兩個選項:yes|no

    force::若目标主機包含該檔案,但内容不同,如果設定為yes,則強制覆寫,設為no,則隻有當目标主機的目标位置不存在該檔案時财富值,預設為yes

[[email protected] ~]# ansible all -m copy -a 'src=/etc/resolv.conf dest=/etc/resolv.conf'  ==>>複制檔案

[ro[email protected] ~]# ansible all -m copy -a 'src=/root/ dest=/root/'

8.lineinfile子產品

    類似sed的一種行編輯替換子產品

    path  目标檔案

    regexp 正規表達式,要修改的行

    line 最終修改的結果

[[email protected] ~]# ansible db -m lineinfile -a 'path="/etc/my.cnf" regexp="^binlog-format" line="binlog-format = row"'

9.replace子產品

    類似sed的一種行編輯替換子產品

    path  目标檔案

    regexp 正規表達式

    replace 最終修改的結果

[[email protected] ~]# ansible db -m replace -a 'path="/etc/my.cnf" regexp="row" replace="mixed"'

10.setup子產品

    主要用于擷取主機資訊,playbooks裡經常會用的另一個參數gather_facts與該子產品相關,setup子產品常用filter參數

    filter過濾所需資訊

[[email protected] ~]# ansible cache45 -m setup -a 'filter=ansible_distribution'

四、ansible七種武器

1.第一種武器

    ansible指令,用于執行臨時性的工作,必須掌握

2.第二種武器

    ansible-doc是ansible子產品的文檔說明,針對每個子產品都有詳細的說明及應用案例介紹,功能和Linux系統man指令類似,必須掌握 

3.第三種武器

    ansible-console是ansible為使用者提供的互動式工具,使用者可以在ansible-console虛拟出來的終端上像shell一樣使用ansible内置的各種指令,這位習慣使用shell互動方式的使用者提供了良好的使用體驗

4.第四種武器

    ansible-galaxy從github上下載下傳管理Roles的一款工具,與python的pip類似

5.第五種武器

    ansible-playbook是日常應用中使用頻率最高的指令,工作機制:通過讀取先編寫好的playbook檔案實作批量管理,可以了解為按一定條件組成的ansible任務及,必須掌握 

6.第六種武器

    ansible-vault主要用于配置檔案加密,如編寫好的playbook檔案中包含敏感資訊,不想他人随意檢視,可用它加密/解密這個檔案

7.第七種武器

    ansible-pull

    ansible有兩種工作模式pull/push,預設使用push模式工作,pull和push工作模式機制正好相反

    适用場景:有大批量機器需要配置,即便使用高并發線程依舊要花費很多時間

    通常在配置大批量機器的場景下使用,靈活性稍有欠缺,但效率幾乎可以無限提升,對運維人員的技術水準和前瞻性規劃有較高要求

五、JSON簡介

1.JSON是什麼

    JSON是JavaScript對象表示法,它是一種基于文本獨立于語言的輕量級資料交換格式

    JSON中的分割符号限于,單引号',小括号(),中括号[],大括号{},冒号:,逗号,。

2.JSON特性

    JSON是純文字

    JSON具有“自我描述性”(人類可讀)

    JSON具有層級結構(值中存在值)

    JSON可通過JavaScript進行解析

3.JSON文法規則

    資料在名稱/值對中

    資料由逗号分隔

    大括号儲存對象

    中括号儲存數組

4.JSON資料的書寫格式是:名稱/值對 

    名稱/值對包括字段名稱(在雙引号中),後面寫一個冒号,然後是值,例如:"詩仙":"李白"

5.JSON文法規則之數組

    {"詩人":

        ["李白","杜甫","白居易","李賀"]

    }

    複合複雜類型

    {"詩人":

      [{"李白":"詩仙","年代":"唐"},

       {"杜甫":"詩聖","年代":"唐"},

       {"李賀":"詩鬼","年代":"唐"}

      ]

    }

六、YAML簡介

1.YAML是什麼

    是一個可讀性高,用來表達資料序列的格式

    YAML(YAML Ain't Markup Language)

    YAML參考了多種語言,如:C語言,Python,Perl等,并從XML,電子郵件的資料格式中獲得靈感,Clark Evans在2001年首次發表了這種語言,目前已有數種程式設計語言或腳本語言支援這種語言

2.YAML文法簡介

    YAML的結構通過空格來展示

    數組使用-表示

    鍵值對使用:表示 

    YAML使用一個固定的縮進風格表示資料層級結構關系

    一般每個縮進級别由兩個以上空格組成

    #表示注釋

    注意事項:

    不要使用tab,縮進是初學者容易出錯的地方之一

    同一層級縮進必須對齊

3.YAML的鍵值表示方法

    采用冒号分隔

    :後面必須有一個空格

    例如:

        "詩仙": "李白"

        或 

        "李白":

          "詩仙"

    複雜YAML的鍵值對嵌套

    例如:

        "詩人":

          "李白": "詩仙"

        或 

        "詩人":

          "李白":

            "詩仙"

4.YAML數組表示方法

    使用一個端橫杠加一個空格

    例如:

    - "李白"

    - "杜甫"

    - "李賀"

    哈希數組複合表達式

    "詩人":

      - "李白"

      - "杜甫"

      - "李賀"

5.進階複合表達式

    例如:

    "詩人":

      - 

        "李白": "詩仙"

        "年代": "唐"

      - 

        "杜甫": "詩聖"

        "年代": "唐"

      - 

        "李賀": "詩鬼"

        "年代": "唐"

繼續閱讀