1. 程式人生 > >ansible playbook

ansible playbook

err 直接 交互式 ebs 變量名 yaml 每一個 key pat

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