官术网_书友最值得收藏!

  • Ansible權(quán)威指南
  • 李松濤 魏巍 甘捷
  • 189字
  • 2019-01-04 06:58:46

第2章
Ansible基礎(chǔ)元素介紹

第1章介紹了Ansible的功能作用、通信發(fā)展史、基礎(chǔ)的安裝部署及處理Ansible安裝問題所需的Python多環(huán)境管理工具Pyenv和Virutalenv。在前期基本工作準(zhǔn)備妥當(dāng)?shù)幕A(chǔ)上,本章進(jìn)一步深入學(xué)習(xí)Ansible的基礎(chǔ)元素,會(huì)相繼接觸Ansible目錄結(jié)構(gòu)簡(jiǎn)介、Ansible系列命令、Ansible Inventory配置規(guī)范、Ansible模式匹配規(guī)則等,其中部分內(nèi)容,諸如Inventory、Ansible-playbook等在后續(xù)涉及章節(jié)會(huì)更深入介紹。本章主要是為大家呈現(xiàn)Ansible及系列命令的基礎(chǔ)入門介紹,所介紹的內(nèi)容相互之間沒有緊密關(guān)系,可選擇性地閱讀感興趣章節(jié)。

2.1 Ansible目錄結(jié)構(gòu)介紹

Ansible是開源工具,整個(gè)開發(fā)過程或二次開發(fā)均遵循GPL協(xié)議,所以所有源碼均可見。作為一款日常工作所需的核心軟件,我們有必要知道其目錄分布及各目錄功能。通過如下命令我們可以獲取Ansible所有文件存放目錄:

    # rpm -ql ansible

該命令輸出內(nèi)容較多,大致分為如下幾類:

?配置文件目錄/etc/ansible/

?執(zhí)行文件目錄/usr/bin/

?Lib庫依賴目錄/usr/lib/pythonX.X/site-packages/ansible/

?Help文檔目錄/usr/share/doc/ansible-X.X.X/

?Man文檔目錄/usr/share/man/man1/

整體的目錄概要可參考如圖2-1所示的Ansible目錄樹結(jié)構(gòu)。

圖2-1 Ansible目錄樹結(jié)構(gòu)

其中,如下目錄運(yùn)維常要配置,需熟練掌握。

1)配置文件目錄/etc/ansible/,主要功能為:Inventory主機(jī)信息配置、Ansible工具功能配置等。所有Ansible的配置均存放在該目錄下,運(yùn)維日常的所有配置類操作也均基于此目錄進(jìn)行。

2)執(zhí)行文件目錄/usr/bin/,主要功能為:Ansible系列命令默認(rèn)存放目錄。Ansible所有的可執(zhí)行文件均存放在該目錄下。

在/usr/lib/pythonXXX/site-packages/下,該目錄是系統(tǒng)當(dāng)前默認(rèn)的Python路徑,因?yàn)锳nsible是基于Python編寫的,所以Ansible的所有l(wèi)ib庫文件和模塊文件也均存放于該目錄下。希望了解Ansible源碼的話可至該目錄下查看其工作原理,當(dāng)然也可至GitHubGitHub:GitHub是一個(gè)通過Git進(jìn)行版本控制的軟件源代碼托管服務(wù),由GitHub公司(曾稱Logical Awesome)的開發(fā)者Chris Wanstrath、PJ Hyett和Tom Preston-Werner使用Ruby on Rails編寫而成。 上下載歷史或最新AnsibleAnsible GitHub地址:https://github.com/ansible/ansible。 版本。

2.2 Ansible配置文件解析

Inventory用于定義Ansible的主機(jī)列表配置,Ansible的自身配置文件只有一個(gè),即ansible.cfg, Ansible安裝好后它默認(rèn)存放于/etc/ansible/目錄下。ansible.cfg配置文件可以存在于多個(gè)地方,Ansible讀取配置文件的順序依次是當(dāng)前命令執(zhí)行目錄→用戶家目錄下的.a(chǎn)nsible.cfg→/etc/ansible.cfg,先找到哪個(gè)就使用哪個(gè)的配置。其ansible.cfg配置的所有內(nèi)容均可在命令行通過參數(shù)的形式傳遞或定義在Playbooks中。

配置文件ansible.cfg約有350行語句,大多數(shù)為注釋行默認(rèn)配置項(xiàng)。該文件遵循INI格式,分為如下幾類配置。

(1)[defaults]

該類配置下定義常規(guī)的連接類配置,如inventory、library、remote_tmp、local_tmp、forks、poll_interval、sudo_user、ask_sudo_pass、ask_pass、transport、remote_port等。

    [defaults]
    # inventory = /etc/ansible/hosts         # 定義Inventory
    # library = /usr/share/my_modules/       # 自定義lib庫存放目錄
    # remote_tmp = $HOME/.ansible/tmp        # 臨時(shí)文件遠(yuǎn)程主機(jī)存放目錄
    # local_tmp = $HOME/.ansible/tmp         # 臨時(shí)文件本地存放目錄
    # forks = 5                                  # 默認(rèn)開啟的并發(fā)數(shù)
    # poll_interval = 15                        # 默認(rèn)輪詢時(shí)間間隔
    # sudo_user  = root                         # 默認(rèn)sudo用戶
    # ask_sudo_pass = True                     # 是否需要sudo密碼
    # ask_pass  = True                          # 是否需要密碼
    # roles_path = /etc/ansible/roles        # 默認(rèn)下載的Roles存放的目錄
    # host_key_checking = False               # 首次連接是否需要檢查key認(rèn)證,建議設(shè)為False
    # timeout = 10                               # 默認(rèn)超時(shí)時(shí)間
    # timeout = 10                               # 如沒有指定用戶,默認(rèn)使用的遠(yuǎn)程連接用戶
    # log_path = /var/log/ansible.log        # 執(zhí)行日志存放目錄
    # module_name = command                    # 默認(rèn)執(zhí)行的模塊
    # action_plugins = /usr/share/ansible/plugins/action # action插件的存放目錄
    # callback_plugins = /usr/share/ansible/plugins/callback # callback插件的存放目錄
    # connection_plugins = /usr/share/ansible/plugins/connection  # connection插件的
                                                                      # 存放目錄
    # lookup_plugins = /usr/share/ansible/plugins/lookup   # lookup插件的存放目錄
    # vars_plugins = /usr/share/ansible/plugins/vars        # vars插件的存放目錄
    # filter_plugins = /usr/share/ansible/plugins/filter   # filter插件的存放目錄
    # test_plugins = /usr/share/ansible/plugins/test        # test插件的存放目錄
    # strategy_plugins = /usr/share/ansible/plugins/strategy# strategy插件的存放目錄
    # fact_caching = memory                                     # getfact緩存的主機(jī)信息存放方式
    # retry_files_enabled = False
    # retry_files_save_path = ~/.ansible-retry               # 錯(cuò)誤重啟文件存放目錄
    …

上述是日常可能用到的配置,這些多數(shù)保持默認(rèn)即可。

(2)[privilege_escalation]

出于安全角度考慮,部分公司不希望直接以root的高級(jí)管理員權(quán)限直接部署應(yīng)用,往往會(huì)開放普通用戶權(quán)限并給予sudo的權(quán)限,該部分配置主要針對(duì)sudo用戶提權(quán)的配置。

    [privilege_escalation]
    # become=True              # 是否sudo
    # become_method=sudo      # sudo方式
    # become_user=root        # sudo后變?yōu)閞oot用戶
    # become_ask_pass=False   # sudo后是否驗(yàn)證密碼

(3)[paramiko_connection]

定義paramiko_connection配置,該部分功能不常用,了解即可。

    [paramiko_connection]     # 該配置不常用到
    # record_host_keys=False # 不記錄新主機(jī)的key以提升效率
    # pty=False                 # 禁用sudo功能

(4)[ssh_connection]

Ansible默認(rèn)使用SSH協(xié)議連接對(duì)端主機(jī),該部署是主要是SSH連接的一些配置,但配置項(xiàng)較少,多數(shù)默認(rèn)即可。

    [ssh_connection]
    # pipelining = False      # 管道加速功能,需配合requiretty使用方可生效

(5)[accelerate]

Ansible連接加速相關(guān)配置。因?yàn)橛胁糠质褂谜卟粷M意Ansible的執(zhí)行速度,所以Ansible在連接和執(zhí)行速度方面也在不斷地進(jìn)行優(yōu)化,該配置項(xiàng)在提升Ansibile連接速度時(shí)會(huì)涉及,多數(shù)保持默認(rèn)即可。

    [accelerate]
    # accelerate_port = 5099                   # 加速連接端口
    # accelerate_timeout = 30                  # 命令執(zhí)行超時(shí)時(shí)間,單位秒
    # accelerate_connect_timeout = 5.0       # 連接超時(shí)時(shí)間,單位秒
    # accelerate_daemon_timeout = 30         # 上一個(gè)活動(dòng)連接的時(shí)間,單位分鐘
    # accelerate_multi_key = yes

(6)[selinux]

關(guān)于selinux的相關(guān)配置幾乎不會(huì)涉及,保持默認(rèn)配置即可。

    [selinux]
    # libvirt_lxc_noseclabel = yes
    # libvirt_lxc_noseclabel = yes

(7)[colors]

Ansible對(duì)于輸出結(jié)果的顏色也進(jìn)行了詳盡的定義且可配置,該選項(xiàng)對(duì)日常功能應(yīng)用影響不大,幾乎不用修改,保持默認(rèn)即可。

    [colors]
    # highlight = white
    # verbose = blue
    # warn = bright purple
    # error = red
    # debug = dark gray
    # deprecate = purple
    # skip = cyan
    # unreachable = red
    # ok = green
    # changed = yellow
    # diff_add = green
    # diff_remove = red
    # diff_lines = cyan

上面盡可能全地介紹了運(yùn)維工作中可能需要修改的配置選項(xiàng),除了在關(guān)閉首次連接提示(host_key_checking = False)或提速調(diào)整([accelerate]區(qū)域塊配置調(diào)整)時(shí)可能會(huì)稍做調(diào)整,其中絕大多數(shù)選項(xiàng)默認(rèn)即可,Ansible安裝好后無需任何改動(dòng)即可使用。

2.3 Ansible命令用法詳解

Ansible命令行執(zhí)行方式有Ad-Hoc、Ansible-playbook兩種方式,Web化執(zhí)行方式其官方提供了付費(fèi)產(chǎn)品Tower(10臺(tái)以內(nèi)免費(fèi)),個(gè)人的話可以基于其提供的API開發(fā)類似的Web化產(chǎn)品。關(guān)于命令行執(zhí)行的兩種方式Ad-Hoc和Ansible-playbooks、什么是Ad-Hoc及Ad-Hoc與Ansible-playbook的區(qū)別我們?cè)诘?章有詳細(xì)介紹,這里不再贅述。需簡(jiǎn)要說明的是兩者沒有本質(zhì)上的區(qū)別,Ad-Hoc主要用于臨時(shí)命令的執(zhí)行,Ansibel-playbook可以理解為Ad-Hoc的集合,通過一定的規(guī)則編排在一起。兩者的操作也極其簡(jiǎn)便,且提供了如with_items、failed_when、changed_when、until、ignore_errors等豐富的邏輯條件和Dry-run的Check Mode。但在Chceck Mode下并不真正執(zhí)行命令,即將執(zhí)行的操作不會(huì)對(duì)端服務(wù)器產(chǎn)生任何影響,只模擬命令的執(zhí)行過程是否能正常執(zhí)行。

通過第1章的學(xué)習(xí)我們知道,Ansible的通信默認(rèn)基于SSH,因此我們需要對(duì)主機(jī)先進(jìn)行認(rèn)證。Ansible認(rèn)證方式有密碼認(rèn)證和公私鑰認(rèn)證兩種方式,其實(shí)完全等同于SSH的認(rèn)證,所以這里關(guān)于這兩種認(rèn)證方式不做過多介紹。Ansible默認(rèn)使用(筆者也建議各位使用)公私鑰認(rèn)證方式,究其原因無非是出于安全的考慮,密碼不用明文存放。以本機(jī)為例,執(zhí)行如下命令即可添加本機(jī)認(rèn)證信息。

    // 隨機(jī)生成公私鑰對(duì),ssh-keygen是Linux下認(rèn)證密鑰生成、管理和轉(zhuǎn)換工具,詳細(xì)用法可參考其man文檔
    ssh-keygen  -N "" -b 4096 -t rsa -C "stanley@magedu.com" -f/root/.ssh/stanley.rsa
    // 為本機(jī)添加密鑰認(rèn)證
    ssh-copy-id -i /root/.ssh/stanley.rsa root@localhost

輸入的時(shí)候會(huì)有如下提示:

    Are you sure you want to continue connecting (yes/no)?

輸入全小寫的英文字母yes即可。

而后會(huì)有類似如下提示輸入對(duì)應(yīng)root用戶的密碼信息:

    root@localhost's password:

輸入正確的密碼信息后結(jié)果認(rèn)證,隨后在當(dāng)前命令行輸入如下命令嘗試免密碼登錄:

    ssh -i /root/.ssh/stanley.rsa root@localhost

如不提示輸入密碼即可直接登錄則表示密鑰驗(yàn)證成功。當(dāng)然,這里只是為大家簡(jiǎn)要演示密鑰認(rèn)證的過程,實(shí)際應(yīng)用中為方便起見,一般會(huì)使用非root用戶生成默認(rèn)文件名為id_rsa、id_rsa.pub的密鑰對(duì),在使用時(shí)通過sudo的方式獲取權(quán)限。

Ansible的命令使用格式如下:

    ansible <host-pattern> [options]

<host-pattern>是Inventory中定義的主機(jī)或主機(jī)組,可以為ip、hostname、Inventory中的group組名、具有“.”或“*”或“:”等特殊字符的匹配型字符串,<>表示該選項(xiàng)是必須項(xiàng),不可忽略。

[options]是Ansible的參數(shù)選項(xiàng),[ ]表示該選項(xiàng)中的參數(shù)任選其一。

Ansible命令可用選項(xiàng)非常多,這里列舉如下會(huì)用到的選項(xiàng),詳細(xì)選項(xiàng)可參考man或第3章。

?-m NAME, --module-name=NAME:指定執(zhí)行使用的模塊。

?-u USERNAME, --user=USERNAME:指定遠(yuǎn)程主機(jī)以USERNAME運(yùn)行命令。

?-s, --sudo:相當(dāng)于Linux系統(tǒng)下的sudo命令。

?-U SUDO_USERNAME, --sudo-user=SUDO_USERNAME:使用sudo,相當(dāng)于Linux下的sudo命令。

具體示例如下:

    // 以bruce用戶執(zhí)行ping存活檢測(cè)
    ansible all -m ping -u bruce
    //以bruce sudo至root執(zhí)行ping存活檢測(cè)
    ansible all -m ping -u bruce --sudo
    //以bruce sudo至batman用戶執(zhí)行ping存活檢測(cè)
    ansible all -m ping -u bruce --sudo --sudo-user batman

但在新版本中Ansible的sudo命令廢棄,改為--become或-b,如上命令需改為如下:

    //以bruce sudo至root執(zhí)行ping存活檢測(cè)
    ansible all -m ping -u bruce -b
    //以bruce sudo至batman用戶執(zhí)行ping存活檢測(cè)
    ansible all -m ping -u bruce -b --become-user batman

Ansible-playbook的命令用法和Ansible略有不同,雖然參數(shù)選項(xiàng)與Ansible有很多相同的地方,但也新增了針對(duì)Ansible-playbook特有的參數(shù)。

Ansible-playbook的命令使用格式如下:

    ansible-playbook playbook.yml

ansible-playbook命令后跟事先編輯好的playbook.yml文件即可。本節(jié)只簡(jiǎn)單介紹其用法,在第4、5、6章有大量?jī)?nèi)容介紹其寫法、高級(jí)用法及優(yōu)化方向。Ansible-playbook新增的功能參數(shù)如下:

?--ask-vault-pass:加密playbook文件時(shí)提示輸入密碼。

?-D, --diff:當(dāng)更新的文件數(shù)及內(nèi)容較少時(shí),該選項(xiàng)可顯示這些文件不同的地方,該選項(xiàng)結(jié)合-C用會(huì)有較好的效果。

?-e EXTRA_VARS, --extra-vars=EXTRA_VARS:在Playbook中引入外部變量。

?--flush-cache:將fact清除到的遠(yuǎn)程主機(jī)緩存。

?--force-handlers:強(qiáng)制運(yùn)行handlers的任務(wù),即使在任務(wù)失敗的情況下。

?-i INVENTORY:指定要讀取的Inventory文件。

?--list-tags:列出所有可用的tags。

?--list-tasks:列出所有即將被執(zhí)行的任務(wù)。

?--skip-tags=SKIP_TAGS:跳過指定的tags任務(wù)。

?--start-at-task=START_AT_TASK:從第幾條任務(wù)開始執(zhí)行。

?--step:逐步執(zhí)行Playbook定義的任務(wù),并經(jīng)人工確認(rèn)后繼續(xù)執(zhí)行下一步任務(wù)。

?--syntax-check:檢查Playbook中的語法書寫。

?-t TAGS, --tags=TAGS:指定執(zhí)行該tags的任務(wù)。

在日常工作中,大家經(jīng)常會(huì)遇到批量添加認(rèn)證的問題,而逐條添加認(rèn)證方式,如機(jī)械地對(duì)每臺(tái)主機(jī)都一條條添加認(rèn)證,那是一件非常麻煩的事,也違反了我們期望的自動(dòng)化方式。具體的批量添加認(rèn)證方式請(qǐng)參考第9章。如前面所介紹,Ansible不僅有ansible、ansible-playbook命令,還有ansible-galaxy、ansible-pull、ansible-doc、ansible-vault、ansible-console(2.0版本新增)命令,掌握Ansible的基礎(chǔ)用法后,我們將更深一步學(xué)習(xí)Ansible系列命令。

2.4 Ansible系列命令用法詳解與使用場(chǎng)景介紹

如何獲取Ansible的系列命令呢?在終端鍵入ansible后連續(xù)按兩次Tab鍵,會(huì)補(bǔ)全所有以ansible字母開頭的命令,這些命令均是Ansible系列命令。本節(jié)我們來逐一介紹Ansible的系列命令使用。

?ansible

?ansible-galaxy

?ansible-pull

?ansible-doc

?ansible-playbook

?ansible-vault

?ansible-console

2.4.1 ansible

命令ansible是日常工作中使用率非常高的命令之一,man中是如此定義其功能的:run a command somewhere else,可見其靈活性。ansible命令主要在如下場(chǎng)景使用:

?非固化需求

?臨時(shí)一次性操作

?二次開發(fā)接口調(diào)用

那么什么是非固化需求和臨時(shí)一次性操作呢?簡(jiǎn)單來講,比如工作中我臨時(shí)想查看web1服務(wù)器組是否存活,或我想臨時(shí)復(fù)制本地的/etc/fstab到web服務(wù)器組的/tmp目錄下做測(cè)試,類如這些沒有規(guī)律的、臨時(shí)需要做的任務(wù),我們稱之為非固化需求、臨時(shí)一次性操作。具體的命令使用如下:

    // 檢查服務(wù)器存活
    ansible web1 -m ping
    // 復(fù)制本地文件到遠(yuǎn)程
    ansible  web1  -m  copy  -a  "src=/etc/fstab  dest=/tmp/fstab  owner=root  group=root
    mode=644 backup=yes"

Ansible的返回結(jié)果都非常友好,一般會(huì)用3種顏色來表示執(zhí)行結(jié)果:紅色、綠色、橘黃色。其中紅色表示執(zhí)行過程有異常,一般會(huì)中止剩余所有的任務(wù),如圖2-2所示的Ansible執(zhí)行結(jié)果錯(cuò)誤的結(jié)果返回;綠色和橘黃色表示執(zhí)行過程沒有異常,所有任務(wù)均正常執(zhí)行,但橘黃色表示命令執(zhí)行結(jié)束后目標(biāo)有狀態(tài)的變化。如圖2-3所示,Ansible執(zhí)行結(jié)果正確的結(jié)果返回中的圓圈1為橘黃色顯示;而綠色表示命令執(zhí)行結(jié)束后目標(biāo)沒有狀態(tài)變化,如圖2-3中的圓圈2顯示。

圖2-2 Ansible執(zhí)行結(jié)果錯(cuò)誤的結(jié)果返回

圖2-3 Ansible執(zhí)行結(jié)果正確的結(jié)果返回

不僅ansible命令的執(zhí)行結(jié)果如此設(shè)置,Ansible系列命令均如此設(shè)置,所以判斷Ansible系列命令的執(zhí)行結(jié)果是否正常是一件非常容易的事情,只要看顏色即可。

2.4.2 ansible-galaxy

這里的galaxy和三星手機(jī)沒有任何關(guān)系。ansible-galaxy的功能可以簡(jiǎn)單地理解為GitHub或PIP的功能,通過ansible-galaxy命令,我們可以根據(jù)下載量和關(guān)注量等信息,查找和安裝優(yōu)秀的Roles。Roles是Ansible非常重要的一項(xiàng)功能,關(guān)于Roles的詳細(xì)功能會(huì)在第6章介紹。在ansible-galaxy上,我們可以上傳和下載Roles,這里也是優(yōu)秀Roles的聚集地,下載地址為https://galaxy.ansible.com

ansible-galaxy命令使用格式如下:

    ansible-galaxy [init|info|install|list|remove] [--help] [options] ...

ansible-galaxy命令分三大部分:

(1)[init|info|install|list|remove]

init:初始化本地的Roles配置,以備上傳Roles至galaxy。

?info:列表指定Role的詳細(xì)信息。

?install:下載并安裝galaxy指定的Roles到本地。

?list:列出本地已下載的Roles。

?remove:刪除本地已下載的Roles。

Ansible 2.0版本中,針對(duì)ansible-galaxy增加了login、import、delete、setup等功能,但這些功能需基于login在galaxy認(rèn)證成功后方可執(zhí)行,主要為了方便對(duì)galaxy上已有的Roles的配置工作。

(2)help用法顯示[--help]

針對(duì)第一部分的init、info等功能,其后跟--help可單獨(dú)顯示該項(xiàng)用法。例如:

    ansible-galaxy init --help

執(zhí)行后會(huì)返回ansible-galaxy init選項(xiàng)的用法說明。

    Usage: ansible-galaxy init [options] role_name
    Options:
        -f, --force              Force overwriting an existing role
        -h, --help               show this help message and exit
        -c, --ignore-certs     Ignore SSL certificate validation errors.
        -p INIT_PATH, --init-path=INIT_PATH
                                The path in which the skeleton role will be created.
                                The default is the current working directory.
        --offline                 Don't query the galaxy API when creating roles
        -s API_SERVER, --server=API_SERVER
                                The API server destination
        -v, --verbose            verbose mode (-vvv for more, -vvvv to enable
                                connection debugging)
        --version                 show program's version number and exit

其他選項(xiàng)與help用法一樣。

(3)參數(shù)項(xiàng)[options]

該部分結(jié)合第一部分的參數(shù)完成ansible-galaxy完整的功能用法,如:

ansible-galaxy init [options] role_name即ansible-galaxy init后跟[-f|-h|-c|-p|--off line|-s SERVER|-v|--version]參數(shù),后跟role-name成為一條完整的命令。

具體可參考如下:

    // 下載用戶hectcastro的Nginx這個(gè)Role到本地并忽略錯(cuò)誤(默認(rèn)存放在/etc/ansible/roles/)
    ansible-galaxy --ignore-errors install azavea.git

因?yàn)閍nsible-galaxy是對(duì)https://galaxy.ansible.com網(wǎng)站的上傳、下載、配置類工作,如有類似如下報(bào)錯(cuò),請(qǐng)確保該網(wǎng)站可正常訪問。

    the API server (galaxy.ansible.com) is not responding, please try again later.

2.4.3 ansible-pull

該指令的使用涉及Ansible的另一種工作模式:pull模式(Ansible默認(rèn)使用push模式)。這和通常使用的push模式工作機(jī)理剛好相反,其適用于以下場(chǎng)景:①你有數(shù)量巨大的機(jī)器需要配置,即使使用高并發(fā)線程依舊要花費(fèi)很多時(shí)間;②你要在剛啟動(dòng)的、沒有網(wǎng)絡(luò)連接的主機(jī)上運(yùn)行Anisble。

ansible-pull命令使用格式如下:

    ansible-pull [options] [playbook.yml]

通過ansible-pull結(jié)合Git和crontab一并實(shí)現(xiàn),其原理如下:通過crontab定期拉取指定的Git版本到本地,并以指定模式自動(dòng)運(yùn)行預(yù)先制訂好的指令。

具體示例參考如下:

    */20 * * * * root /usr/local/bin/ansible-pull -o -C 2.1.0 -d /srv/www/king-gw/
    -i /etc/ansible/hosts -U git:// git.kingifa.com/king-gw-ansiblepull >> /var/log/
    ansible-pull.log 2>&1

ansible-pull通常在配置大批量機(jī)器的場(chǎng)景下會(huì)使用,靈活性稍有欠缺,但效率幾乎可以無限提升,對(duì)運(yùn)維人員的技術(shù)水平和前瞻性規(guī)劃有較高要求。

2.4.4 ansible-doc

ansible-doc是Ansible模塊文檔說明,針對(duì)每個(gè)模塊都有詳細(xì)的用法說明及應(yīng)用案例介紹,功能和Linux系統(tǒng)man命令類似。該命令使用方式如下:

    ansible-doc [options] [module...]

ansible-doc命令后跟[options]參數(shù)或[模塊名],顯示模塊用法說明,具體示例如下:

    // 列出支持的模塊
    ansible-doc -l
    // 模塊功能說明
    ansible-doc ping

2.4.5 ansible-playbook

ansible-playbook是日常應(yīng)用中使用頻率最高的命令,其工作機(jī)制是:通過讀取預(yù)先編寫好的playbook文件實(shí)現(xiàn)批量管理。要實(shí)現(xiàn)的功能與命令ansible一樣,可以理解為按一定條件組成的ansible任務(wù)集。

ansible-playbook命令后跟YML格式的playbook文件,執(zhí)行事先編排好的任務(wù)集,命令使用方式如下:

    ansible-playbook playbook.yml

具體示例如下:

    // 執(zhí)行g(shù)w.yml這個(gè)playbook中定義的所有任務(wù)集
    ansible-playbook gw.yml

Playbook具有編寫簡(jiǎn)單、可定制性高、靈活方便,以及可固化日常所有操作的特點(diǎn),運(yùn)維人員應(yīng)熟練掌握。

2.4.6 ansible-vault

ansible-vault主要用于配置文件加密,如編寫的Playbook配置文件中包含敏感信息,不希望其他人隨意查看,ansible-vault可加密/解密這個(gè)配置文件,具體使用方式如下:

    Usage: ansible-vault [create|decrypt|edit|encrypt|rekey|view] [--help] [options]
    file_name

具體示例如下。

設(shè)定如下密碼,加密a.yml文件。

    ansible-vault    encrypt a.yml

會(huì)有以下輸入加密密碼提示:

    Vault password:
    Confirm Vault password:
    Encryption successful

這時(shí),再打開a.yml文件后會(huì)發(fā)現(xiàn)該文件亂碼,只有通過如下命令解密后方可正常查看。

    ansible-vault decrypt a.yml

輸入預(yù)設(shè)的密碼后方可解密。

    Vault password:
    Decryption successful

此時(shí)a.yml文件可正常查看。

到此,我們對(duì)Ansible的用法及系列命令已經(jīng)有了概念性的了解和掌握,接下來我們進(jìn)一步了解Ansible Inventory文件的配置管理。

2.4.7 ansible-console

ansible-console是Ansible為用戶提供的一款交互式工具,用戶可以在ansible-console虛擬出來的終端上像Shell一樣使用Ansible內(nèi)置的各種命令,這為習(xí)慣于使用Shell交互方式的用戶提供了良好的使用體驗(yàn)。ansible-console主要是針對(duì)1.X版本中ansible-shell工具而研發(fā)的,目前官網(wǎng)還沒有對(duì)ansible-console進(jìn)行詳細(xì)的用法說明,最新版本的Ansible軟件包也沒有對(duì)應(yīng)的man文檔說明。經(jīng)筆者實(shí)測(cè),ansible-console命令的使用格式如下。

在終端鍵入ansible-console命令后,會(huì)進(jìn)入如圖2-4所示的類似Shell一樣的交互式終端環(huán)境。

圖2-4 ansible-console命令用法1

圖2-4中的“root@all (4)[f:5]$”是提示符,該提示符表示“當(dāng)前的使用用戶@當(dāng)前所在的Inventory中定義的組,默認(rèn)是all分組(Inventory中all組所有主機(jī)的數(shù)量)[forks:線程數(shù)]$”。

使用cd命令可切換至指定Hosts或分組,同時(shí)提示符的相應(yīng)信息也會(huì)隨之變動(dòng),如圖2-5所示。

圖2-5 ansible-console命令用法2

如圖2-5中的Ansible-console命令用法2所示,cd至webs分組后,原來的root@all (4) [f:5]$也相應(yīng)地變更為root@webs (3)[f:5],表示當(dāng)前分組為webs分組,該分組所擁有的主機(jī)總數(shù)為3臺(tái)。執(zhí)行forks 2后,提示符再次變更為root@webs (3)[f:2]$,表示設(shè)置并發(fā)的線程數(shù)為2。

所有的操作與Shell類似,而且支持Tab鍵補(bǔ)全,如啟動(dòng)httpd服務(wù)時(shí),鍵入service后連續(xù)按兩次Tab鍵后會(huì)自動(dòng)補(bǔ)全剩余的命令選項(xiàng)。ansible-console命令用法3如圖2-6所示。

圖2-6 ansible-console命令用法3

如需啟動(dòng)httpd服務(wù),使用命令service name=httpd state=started,命令用法與Ad-Hoc一致,只是格式上的使用習(xí)慣不同而已。如想獲取service模塊更詳細(xì)的用法,輸入help service命令即可。ansible-console命令用法4如圖2-7所示。

圖2-7 ansible-console命令用法4

使用完畢如希望退出,按快捷鍵Ctrl+D或Ctrl+C即可退出當(dāng)前的虛擬終端。

ansible-console命令在實(shí)際工作中用于Ad-Hoc和Ansible-playbooks之間的場(chǎng)景,常用于集中一批臨時(shí)操作或命令,使用Ad-Hoc要鍵入很多次但整體操作的復(fù)雜度又不至于使用Playbooks時(shí),這時(shí)ansible-console是最佳選擇。

2.5 Ansible Inventory配置及詳解

Inventory是Ansible管理主機(jī)信息的配置文件,相當(dāng)于系統(tǒng)HOSTS文件的功能,默認(rèn)存放在/etc/ansible/hosts。為方便批量管理主機(jī),便捷使用其中的主機(jī)分組,Ansible通過Inventory來定義其主機(jī)和組,在使用時(shí)通過-i或--inventory-file指定讀取,與Ansible命令結(jié)合使用時(shí)組合如下:

    ansible -i /etc/ansible/hosts webs -m ping

如果只有一個(gè)Inventory時(shí)可不用指定路徑,默認(rèn)讀取/etc/ansible/hosts。Inventory可以同時(shí)存在多個(gè),而且支持動(dòng)態(tài)生成,如AWS EC2、Cobbler等均支持,本節(jié)我們來學(xué)習(xí)Inventory的使用規(guī)則。

2.5.1 定義主機(jī)和組

Inventory配置文件遵循INI文件風(fēng)格,中括號(hào)中的字符為組名。其支持將同一個(gè)主機(jī)同時(shí)歸并到多個(gè)不同的組中,分組的功能為IT人員維護(hù)主機(jī)列表提供了非常大的便利。此外,若目標(biāo)主機(jī)使用了非默認(rèn)的SSH端口,還可以在主機(jī)名稱之后使用冒號(hào)加端口號(hào)來標(biāo)明,以行為單位分隔配置,詳細(xì)信息可參考以下代碼中的注釋。

    #“# ”開頭的行表示該行為注釋行,即當(dāng)時(shí)行的配置不生效
    # Inventory可以直接為IP地址
    192.168.37.149
    # Inventory同樣支持Hostname的方式,后跟冒號(hào)加數(shù)字表示端口號(hào),默認(rèn)22號(hào)端口
    ntp.magedu.com:2222
    nfs.magedu.com
    #  中括號(hào)內(nèi)的內(nèi)容表示一個(gè)分組的開始,緊隨其后的主機(jī)均屬于該組成員,空行后的主機(jī)亦屬于該組,即
    web2.magedu.com這臺(tái)主機(jī)也屬于[websevers]組
    [websevers]
    web1.magedu.com
    web[10:20].magedu.com # [10:20]表示10~20之間的所有數(shù)字(包括10和20),即表示web10.
    magedu.com、web11.magedu.com……web20.magedu.com的所有主機(jī)
    web2.magedu.com[dbservers]
    db-a.magedu.com
    db-[b:f].magedu.com  #  [b:f]表示b到f之間的所有數(shù)字(包括b和f),即表示db-b.magedu.
    com、db-e.magedu.com……db-f.magedu.com的所有主機(jī)

2.5.2 定義主機(jī)變量

在日常工作中,通常會(huì)遇到非標(biāo)準(zhǔn)化的需求配置,如考慮到安全性問題,業(yè)務(wù)人員通常將企業(yè)內(nèi)部的Web服務(wù)80端口修改為其他端口號(hào),而該功能可以直接通過修改Inventory配置來實(shí)現(xiàn),在定義主機(jī)時(shí)為其添加主機(jī)變量,以便在Playbook中使用針對(duì)某一主機(jī)的個(gè)性化要求。

    [webservers]
    web1.magedu.com http_port=808 maxRequestsPerChild=801 # 自定義http_port的端口號(hào)為
    808,配置maxRequestsPerChild為801

Ansible其實(shí)支持多種方式修改或自定義變量,Inventory是其中的一種修改方式,在第6章中我們會(huì)詳細(xì)介紹。不管哪種修改方式,大家一定要有自己的修改規(guī)范,以便于區(qū)別管理已有配置。

2.5.3 定義組變量

Ansible支持定義組變量,主要針對(duì)大量機(jī)器的變量定義需求,賦予指定組內(nèi)所有主機(jī)在Playbook中可用的變量,等同于逐一給該組下的所有主機(jī)賦予同一變量。定義組變量的參考案例如下:

    [groupservers]
    web1.magedu.com
    web2.magedu.com
    [groupservers:vars]
    ntp_server=ntp.magedu.com  # 定義groupservers組中所有主機(jī)ntp_server值為ntp.magedu.
    com
    nfs_server=nfs.magedu.com # 定義groupservers組中所有主機(jī)nfs_server值為nfs.magedu.
    com

2.5.4 定義組嵌套及組變量

Inventory中,組還可以包含其他的組(嵌套),并且也可以向組中的主機(jī)指定變量。不過,這些變量只能在Ansible-playbook中使用,而Ansible不支持。組與組之間可以相互調(diào)用,并且可以向組中的主機(jī)指定變量。

參考示例如下:

    [apache]
    httpd1.magedu.com
    httpd2.magedu.com
    [nginx]
    ngx1.magedu.com
    ngx2.magedu.com
    [webservers:children]
    apache
    nginx
    [webservers:vars]
    ntp_server=ntp.magedu.com

Ansible以簡(jiǎn)單為其核心理念,上述實(shí)現(xiàn)在業(yè)務(wù)日常使用中并不常見,大家了解其用法即可。

2.5.5 多重變量定義

變量除了可以在Inventory中一并定義,也可以獨(dú)立于Inventory文件之外單獨(dú)存儲(chǔ)到Y(jié)AML格式的配置文件中,這些文件通常以.yml、.yaml、.json為后綴或者無后綴。變量通常從如下4個(gè)位置檢索:

?Inventory配置文件(默認(rèn)/etc/ansible/hosts)

?Playbook中vars定義的區(qū)域

?Roles中vars目錄下的文件

?Roles同級(jí)目錄group_vars和hosts_vars目錄下的文件

假如foosball主機(jī)同屬于raleigh和webservers組,那么其變量在如下文件中設(shè)置均有效:

    /etc/ansible/group_vars/raleigh  #  can  optionally  end  in  '.yml',  '.yaml',  or
    '.json'
    /etc/ansible/group_vars/webservers
    /etc/ansible/host_vars/foosball

對(duì)于變量的讀取,Ansible遵循如上優(yōu)先級(jí)順序,因此大家設(shè)置變量時(shí)盡量沿用同一種方式,以方便維護(hù)人員管理。

2.5.6 其他Inventory參數(shù)列表

除了支持如上的功能外,Ansible基于SSH連接Inventory中指定的遠(yuǎn)程主機(jī)時(shí),還內(nèi)置了很多其他參數(shù),用于指定其交互方式,如下列舉了部分重要參數(shù):

    ansible_ssh_host:指定連接主機(jī)ansible_ssh_port,指定SSH連接端口,默認(rèn)22
    ansible_ssh_user:指定SSH連接用戶ansible_ssh_pass,指定SSH連接密碼ansible_sudo_
    pass:指定SSH連接時(shí)sudo密碼
    ansible_ssh_private_key_file:指定特有私鑰文件
    …

其他內(nèi)置參數(shù)還有數(shù)十個(gè),這些參數(shù)均可以直接寫在命令行或Playbook文件中,以覆蓋配置文件中的定義。更多參數(shù)請(qǐng)參考官網(wǎng)內(nèi)置變量參考網(wǎng)址:https://docs.ansible.com/ansible/intro_inventory.html# list-of-behavioral-inventory-parameters。

2.6 Ansible與正則

正則表達(dá)式(Patterns)是各類高級(jí)語言的必定支持的方法之一,Ansible也不例外。其Patterns功能等同于正則表達(dá)式,語法使用也和正則類同,這大大便利了運(yùn)維的使用。其對(duì)于Ansible的靈活性有著極大貢獻(xiàn),該功能同樣支持Ansible-playbook。其用法也非常簡(jiǎn)單。

    ansible <pattern_goes_here> -m <module_name> -a <arguments>

該功能主要針對(duì)Inventory的主機(jī)列表使用,我們通過一些案例可以更好地了解其功能及用法。在如下示例中主要針對(duì)webservers進(jìn)行正則匹配:

    // 重啟webservers組所有主機(jī)的httpd服務(wù)
    ansible webservers -m service -a "name=httpd state=restarted"

(1)All(全量)匹配

匹配所有主機(jī),all或*號(hào)功能相同。如檢測(cè)所有主機(jī)存活情況。

    // all和*功能相同,但*號(hào)需引起來
    ansible all -m ping
    ansible "*" -m ping

檢查192.168.1.0/24網(wǎng)段所有主機(jī)存活狀況。

    ansible 192.168.1.* -m ping

(2)邏輯或(or)匹配

如我們希望同時(shí)對(duì)多臺(tái)主機(jī)或多個(gè)組同時(shí)執(zhí)行,相互之間用“:”(冒號(hào))分隔即可。

    web1:web2

使用方式如下:

    ansible "web1:web2" -m ping

(3)邏輯非(! )匹配

邏輯非用感嘆號(hào)(! )表示,主要針對(duì)多重條件的匹配規(guī)則,使用方式如下:

    // 所有在webservers組但不在phoenix組的主機(jī)
    webservers:! phoenix

(4)邏輯與(&)匹配

和邏輯非一樣,邏輯與也主要針對(duì)多重條件的匹配規(guī)則,只是邏輯上的判斷不同。邏輯與使用&表示,請(qǐng)看如下示例:

    // webservers組和staging組中同時(shí)存在的主機(jī)
    webservers:&staging

(5)多條件組合

Ansible同樣支持多條件的復(fù)雜組合,該情況企業(yè)應(yīng)用不多,這里做簡(jiǎn)單舉例說明。

    //webservers和dbservers兩個(gè)組中的所有主機(jī)在staging組中存在且在 phoenix組中不存在的主機(jī)
    webservers:dbservers:&staging:! phoenix

(6)模糊匹配

*通配符在Ansible表示0個(gè)或多個(gè)任意字符,主要應(yīng)用于一些模糊規(guī)則匹配,在平時(shí)的使用中應(yīng)用頻率非常高,請(qǐng)參考如下示例:

    // 所有以.magedu.com結(jié)尾的主機(jī)均符合
    *.magedu.com
    // one開頭.com結(jié)尾的所有主機(jī)和dbservers組中的所有主機(jī)
    one*.com:dbservers

(7)域切割

Ansible底層基于Python,因此也支持域切割。Python字符串域切割的示例如下:

    str = '12345678'
    print str[0:1]

通過[0:1]即可獲取數(shù)值1。該功能在Ansible中也支持,以如下Inventory內(nèi)容為例:

    [webservers]
    cobweb
    webbing
    weber

通過截取數(shù)組下標(biāo)可以獲得對(duì)應(yīng)變量值。

    webservers[0]      # == cobweb
    webservers[-1]     # == weber
    webservers[0:1]    # == webservers[0], webservers[1]
                      # == cobweb, webbing
    webservers[1:]     # == webbing, weber

(8)正則匹配

Ansible同樣完整支持正則匹配功能,“~”開始表示正則匹配。

    ~(web|db).*\.example\.com

檢測(cè)beta.example.com、web.example.com、green.example.com、beta.example.org、web. example.org、green.example.org的存活,使用如下匹配模式:

    ansible "~(beta|web|green)\.example\.(com|org)" -m ping

檢測(cè)Inventory中所有以192.168開頭的服務(wù)器存活信息:

    ansible ~192\.168\.[0-9]\{\2}.[0-9]\{2, } -m ping

關(guān)于Ansible的正則功能到此結(jié)束,相信大家在瀏覽的過程中對(duì)其靈活程度也會(huì)有所感觸,在對(duì)Ansible的實(shí)際應(yīng)用過程中也會(huì)不斷地加深對(duì)其理解。

2.7 本章小結(jié)

本章著重為大家介紹了Ansible目錄結(jié)構(gòu)功能及Ansible命令使用方式。在對(duì)Ansible的使用有概念性的了解后,又介紹Ansible系列命令的功能作用,通過簡(jiǎn)單的案例加深對(duì)各命令功能的理解。Inventory是Ansible的核心功能點(diǎn)之一,本章用了約一半內(nèi)容講解了Inventory的入門、書寫規(guī)范、使用技巧及其與正則的結(jié)合使用。正則作為運(yùn)維必備技能與Ansible的結(jié)合也使得Ansible愈顯靈活,功能也愈顯強(qiáng)大,請(qǐng)務(wù)必熟練掌握。下章我們將為大家介紹Ansible Ad-Hoc命令集的進(jìn)階使用。

主站蜘蛛池模板: 渭源县| 赞皇县| 大田县| 海淀区| 慈利县| 遵义市| 石林| 青龙| 图木舒克市| 太和县| 池州市| 杭锦后旗| 开化县| 海林市| 兴和县| 阿图什市| 孝感市| 安吉县| 咸阳市| 建德市| 剑川县| 南丰县| 托克逊县| 子洲县| 信宜市| 阿尔山市| 固安县| 花莲县| 兴宁市| 清水河县| 凤翔县| 聂拉木县| 湖北省| 陵水| 农安县| 嘉祥县| 九台市| 邛崃市| 巴青县| 手机| 葵青区|