ansible之ad-hoc commands

前言

  • 什麼是ad-hoc命令?
    如果我們敲入一些命令去比較快的完成一些事情,而不需要將這些執行的命令特別保存下來, 這樣的命令就叫做 ad-hoc 命令。

Ansible提供兩種方式去完成任務,一是 ad-hoc 命令,一是寫 Ansible playbook.前者可以解決一些簡單的任務, 後者解決較複雜的任務。

這其實是一個概念性的名字,是相對於寫 Ansible playbook 來說的.類似於在命令行敲入shell命令和 寫shell scripts兩者之間的關係

  • 那我們會在什麼情境下去使用ad-hoc 命令呢
    比如說因爲聖誕節要來了,想要把所有實驗室的電源關閉,我們只需要執行一行命令 就可以達成這個任務,而不需要寫 playbook 來做這個任務。

至於說做配置管理或部署這種事,還是要藉助 playbook 來完成,即使用 ‘/usr/bin/ansible-playbook’ 這個命令。

在下面的例子中,我們將演示如何使用 /usr/bin/ansible 運行 ad hoc 任務。

舉栗子

這裏我們要使用 Ansible 的命令行工具來重啓 Atlanta 組中所有的 web 服務器,每次重啓10個。

  • 我們先設置 SSH-agent,將私鑰納入其管理:
$ ssh-agent bash
$ ssh-add ~/.ssh/id_rsa

如果不想使用 ssh-agent, 想通過密碼驗證的方式使用 SSH,可以在執行ansible命令時使用 –ask-pass (-k)選項, 但這裏建議使用 ssh-agent,避免密碼明文。

  • 開始執行命令
$ ansible atlanta -a "/sbin/reboot" -f 10

這個命令中,atlanta是一個組,這個組裏面有很多服務器,”/sbin/reboot”命令會在atlanta組下 的所有機器上執行.這裏ssh-agent會fork出10個子進程(bash),以並行的方式執行reboot命令.如前所說“每次重啓10個” 即是以這種方式實現。

這個選項也可以在 Ansible的配置文件 中設置, 在配置文件中指定的話,就不用在命令行中寫出了.這個選項的默認值是 5,是比較小的.如果同時操作的主機數比較多的話, 可以調整到一個更大的值,只要不超出你係統的承受範圍就沒問題.如果主機數大於設置的併發進程數,Ansible會自行協調, 花得時間會更長一點.

  • 在執行 /usr/bin/ansible 時,默認是以當前用戶的身份去執行這個命令.如果想以指定的用戶執行 /usr/bin/ansible, 請添加 “-u username”選項,如下:
$ ansible atlanta -a "/usr/bin/foo" -u username
  • 使用特權升級方法:
$ ansible atlanta -a "/usr/bin/foo" -u username --become [--ask-become-pass]

如果沒有使用passwordless模式,使用--ask-become-pass (-K),以交互模式輸入密碼來提升權限。然鵝,使用passwordless模式會讓運維更自動化,但不是必須要求的。

  • 切換root以外的方法也可以如下:
$ ansible atlanta -a "/usr/bin/foo" -u username --become-user otheruser [--ask-become-pass]

推薦使用有一定權限而不至於被某些規則束縛的賬號來使用ansible

一些信息

ansible默認的模塊時command,上面的reboot命令就不用指出模塊,如果需要其他模塊,加上-m參數。

command 模塊不支持 shell 變量,也不支持管道等 shell 相關的東西.如果你想使用 shell相關的這些東西, 請使用’shell’ 模塊。

  • 使用shell的例子:
$ ansible raleigh -m shell -a 'echo $TERM'

使用 Ansible ad hoc 命令行接口時(與使用 Playbooks 的情況相反),尤其注意 shell 引號的規則. 比如在上面的例子中,如果使用雙引號”echo $TERM”,會求出TERM變量在當前系統的值,而我們實際希望的是把這個命令傳遞 到其它機器執行。

file transfer

  • 這是 /usr/bin/ansible 的另一種用法.Ansible 能夠以並行的方式同時 SCP 大量的文件到多臺機器. 命令如下:
$ ansible atlanta -m copy -a "src=/etc/hosts dest=/etc/hosts"
  • 使用 file 模塊可以做到修改文件的屬主和權限,(在這裏可替換爲 copy 模塊,是等效的):
$ ansible webservers -m file -a "dest=/srv/foo/a.txt mode=600"
$ ansible webservers -m file -a "dest=/srv/foo/b.txt mode=600 owner=mdehaan group=mdehaan"
  • 使用 file 模塊也可以創建目錄,與執行 mkdir -p 效果類似:
$ ansible webservers -m file -a "dest=/temp/text/dic mode=755 owner=mdehaan group=mdehaan state=directory"
  • 刪除目錄(遞歸的刪除)和刪除文件:
$ ansible webservers -m file -a "dest=/path/to/c state=absent"

file模塊的state有以下幾種:absent(刪除),directory(目錄),link(軟連接),hard(硬鏈接),file(暫時不知道有什麼用),touch(同bash的touch)。

Managing Packages

ansible可以對包進行管理,yum,apt。以下是yum管理:

  • 確認一個軟件包已經安裝,但不去升級它:
$ ansible webservers -m yum -a "name=acme state=present"
  • 確認一個軟件包的安裝版本:
$ ansible webservers -m yum -a "name=acme-1.5 state=present"
  • 確認一個軟件包還沒有安裝:
$ ansible webservers -m yum -a "name=acme state=absent"

yum 的state有以下幾種:absent(未安裝),present(已安裝的),installed(安裝),removed(刪除),latest(更新)

Users and Groups

  • 使用 ‘user’ 模塊可以方便的創建賬戶,刪除賬戶,或是管理現有的賬戶:
$ ansible all -m user -a "name=foo password=<crypted password here>"

$ ansible all -m user -a "name=foo state=absent"

Managing Services

  • 確認某個服務在所有的webservers上都已經啓動:
$ ansible webservers -m service -a "name=httpd state=started"
  • 或是在所有的webservers上重啓某個服務
$ ansible webservers -m service -a "name=httpd state=restarted"
  • 確認某個服務已經停止:
$ ansible webservers -m service -a "name=httpd state=stopped"

Time Limited Background Operations

  • 需要長時間運行的命令可以放到後臺去,在命令開始運行後我們也可以檢查運行的狀態.如果運行命令後,不想獲取返回的信息, 可執行如下命令:
$ ansible all -B 3600 -P 0 -a "/usr/bin/long_running_operation --do-stuff"
  • 如果你確定要在命令運行後檢查運行的狀態,可以使用 async_status 模塊.前面執行後臺命令後會返回一個 job id, 將這個 id 傳給 async_status 模塊:
$ ansible web1.example.com -m async_status -a "jid=488359678239.2844"
  • 獲取狀態的命令如下:
$ ansible all -B 1800 -P 60 -a "/usr/bin/long_running_operation --do-stuff"

其中 -B 1800 表示最多運行30分鐘, -P 60 表示每隔60秒獲取一次狀態信息.

Polling 獲取狀態信息的操作會在後臺工作任務啓動之後開始.若你希望所有的工作任務快速啓動, –forks 這個選項的值 要設置得足夠大,這是前面講過的併發進程的個數.在運行指定的時間(由-B選項所指定)後,遠程節點上的任務進程便會被終止.

一般你只能在把需要長時間運行的命令或是軟件升級這樣的任務放到後臺去執行.對於 copy 模塊來說,即使按照前面的示例想放到 後臺執行文件傳輸,實際上並不會如你所願.

發佈了49 篇原創文章 · 獲贊 12 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章