ansible playbook
playbook實戰
1.
下面有一個安裝apache的shell腳本,大家來感受一下:
#!/bin/bash
# 安裝Apache
yum install --quiet -y httpd httpd-devel
# 復制配置文件
cp /path/to/config/httpd.conf /etc/httpd/conf/httpd.conf
cp /path/to/httpd-vhosts.conf /etc/httpd/conf/httpd-vhosts.conf
# 啟動Apache,並設置開機啟動
service httpd start
chkconfig httpd on
將其轉換為一個完整的playbook後:
--- - hosts: all tasks: - name: "安裝Apache" command: yum install --quiet -y httpd httpd-devel - name: "復制配置文件" command: cp /tmp/httpd.conf /etc/httpd/conf/httpd.conf command: cp /tmp/httpd-vhosts.conf /etc/httpd/conf/httpd-vhosts.conf - name: "啟動Apache,並設置開機啟動" command: service httpd start command: chkconfig httpd on
將以上內容放在一個名為playbook.yml的文件中,直接調用ansible-playbook命令,即可運行,運行結果和腳本運行結果一致:
# ansible-playbook ./playbook.yml
在上述playbook中,我們使用了“command”模塊來運行了標準的shell命令。我們還給了每一出play一個“name”,因此當我們運行playbook時,每一個play都會有非常易讀的的信息輸出:
上面的playbook已經可以很好的運行shell腳本了,但是Ansible還有很多其他內置模塊,可以大幅提升處理復雜配置的能力。
--- - hosts: all sudo: yes tasks: - name: 安裝Apache yum: name={{ item }} state=present with_items: - httpd - httpd-devel - name: 復制配置文件 copy: src: "{{ item.src }}" dest: "{{ item.dest }}" owner: root group: root mode: 0644 with_items: - { src: "/tmp/httpd.conf", dest: "/etc/httpd/conf/httpd.conf" } - { src: "/tmp/httpd-vhosts.conf", dest: "/etc/httpd/conf/httpd-vhosts.conf" } - name: 檢查Apache運行狀態,並設置開機啟動 service: name=httpd state=started enabled=yes
2 Playbook案例逐行剖析
- 1 第一行,“---”,這個是YAML語法中註釋的用法,就像shell腳本中的“#”號一樣
- 2 第二行,“- hosts: all”,告訴ansible具體要在哪些主機上運行我的劇本(playbook),在本例中是all,即所有主機
- 3 第三行,“sudo: yes”,告訴ansible通過sudo來運行相應命令,這樣所有命令將會以root身份執行
- 4 第四行,“tasks:”,指定一系列將要運行的任務
-
-
- 每一個任務(play)以“- name: 安裝Apache”開頭。“- name:”字段並不是一個模塊,不會執行任務實質性的操作,它只是給“task” 一個易於識別和名稱。即便把name字段對應的行完全刪除,也不會有任何問題。
- 本例中我們使用yum模塊來安裝Apache,替代了“yum -y install httpd httpd-devel”
- 在每一個play當中,都可以利用 with_items 來定義變量,並通過“{{ 變量名 }}”的形式來直接使用使用yum模塊的state=present選項來確保軟件被安裝,或者使用state=absent來確保軟件被刪除
- 第二個任務(play)同樣是“- name”字符開頭
- 我們使用copy模塊來將“src”定義的源文件(必須是ansible所在服務器上的本地文件 )復制到“dest”定義的目的地址(此地址為遠程主機的上地址)去,在傳遞文件的同時,還定義了文件的屬主,屬組和權限
- 這個play中,我們用數組的形式給變量賦值,使用{var1: value, var2: value} 的格式來賦值,變量的個數可以任意多,不同變量間以逗號分隔,使用{{item.var1 }}的形式來調用變量,本例中為:{{ item.src }}
- 第三個任務(play)使用了同樣的結構,調用了service模塊,以保證服務的正常開啟
-
-
3 Playbook與Shell腳本差異對比
當我們把shell腳本轉換為playbook運行的時候,ansible會留下清晰的執行痕跡,明確告訴我們在每一臺主機上的每一步都做了什麽。
更厲害的是,當我們重復執行一個playbook時,當ansible發現系統的現有狀態符合playbook所定義的狀態時,anbile將自動跳過該操作。
比如下圖,我們再次執行playbook: temp.yml,當ansible發現playbook中的play都已被完成,它將直接返回ok狀態碼,速度非常之快。
如果是shell腳本,肯定會硬著頭皮,把所用操作再做一遍。 -
在正式運行playbook之前,可以使用--check 或 -C 選項來檢測playbook都會改變哪些內容,顯示的結果跟真正執行時一模一樣,但不會真的對被管理的服務器產生影響
3. Ansible-playbook命令詳解
-
3.1 限定執行範圍
--limit
如果我們運行上面的例子,會發現所有被ansible管理的主機都會被操作。
我們可以通過修改“- hosts:”字段來指定哪些主機將會應用playbook的操作,指定一臺主機:www.magedu.com
指定多臺主機:www.magedu.com,www.osstep.com
指定一組主機:dbserver當然,也可以直接通過ansible-playbook命令來指定主機:
# ansible-playbook playbook.yml --limit webservers
-
如果想知道在執行playbook時,哪些主機將會受影響,則使用--list-hosts選項:
# ansible-playbook playbook.yml --list-hosts
-
4. Ansible-playbook: 用戶與權限設置
--remote-user
Playbook中,如果在與hosts同組的字段中沒有定義user,那麽Ansible將會使用你在inventory文件中定義的用戶,如裏inventory文件中也沒定義用戶,Ansible將默認使用當前系統用戶身份來通過SSH連接遠程主機,在運程程主機中運行play內容。
我們也可以直接在ansible-playbook中使用 --remote-user選項來指定用戶:
# ansible-playbook playbook.yml --remote-user=tom
--ask-sudo-pass
在某些情況下,我們需要傳遞sudo密碼到遠程主機,來保證sudo命令的正常運行。這時,可以使用--ask-sudo-pass (-K)選項來交互式的輸入密碼。
-
--sudo
-
使用--sudo選項,可以強制所有play都使用sudo用戶,同時使用--sudo-user選項指定切換到具體哪個用戶,如果不指定,則默認以root身份運行。
比如,當前用戶Tom想以Jerry的身份運行playbook,命令如下:
$ ansible-playbook playbook.yml --sudo --sudo-user=jerry --ask-sudo-pass
執行過程中,會要求用戶輸入Jerry的密碼。 - Ansible-playbook: 其它選項
Ansible-playbook命令還有一些其他選項:--inventory=PATH (-i PATH):指定inventory文件,默認文件是/etc/ansible/hosts
--verbose(-v):顯示詳細輸出,也可以使用-vvvv顯示精確到每分鐘的輸出
--extra-vars=VARS(-e VARS):定義在playbook使用的變量,格式為:"key=value,key=value"
--forks=NUM ( -f NUM):指定並發執行的任務數,默認為5,根據服務器性能,調大這個值可提高ansible執行效率
--connection=TYPE ( -c TYPE):指定連接遠程主機的方式,默認為ssh,設為local時,剛只在本地執行playbook,建議不做修改
--check:檢測模式,playbook中定義的所有任務將在每臺遠程主機上進行檢測,但並不直正執行 -
問題1:ansible-playbook 如何收集多臺服務器的信息,做統一的匯總report?
-
回問題1: ansible有一個模塊叫setup, 直接在命令行運行:ansible all -m setup即可獲取所有主機的各種信息,當然該模塊也可在playbook中使用
-
ansible playbook