淺顯易懂安裝並學習3.0 Ansible Playbooks

概覽

Ansible的核心是Playbooks(可翻譯爲劇本),劇本是用YAML語法書寫的,來描述對被管理機器須要進行的一系列操做。劇本至關於作菜手冊,上面按順序記錄了,如何把被管理機器一步步打形成指定的樣子。php

YAML語法至關簡單,即便讀者以前從未聽過YAML也毫無關係,YAML書寫起來比JSON格式更簡單html

接下來咱們以運維朋友幾乎都很是熟悉的,安裝nginx,來演示playbooks的基礎用法node

示例 - 安裝nginx

咱們分別使用3種方法:純手動、shell腳本、playbooks,來部署nginx,讓讀者有直觀的認識nginx

機器須要開啓EPEL源,參考 https://blog.csdn.net/xys2015/article/details/109378741git

1 純手動shell

yum install --quiet -y nginx
cat << 'EOF' > /etc/nginx/conf.d/xtest1.conf
server {
    listen       7001;
    server_name  localhost;
    location / {
        root   /opt/xtest1;
        index  index.html;
    }
}
EOF
mkdir -p /opt/xtest1
echo "xtest-7001" > /opt/xtest1/index.html
systemctl start nginx
systemctl enable nginx
curl localhost:7001

2 shell腳本併發

上面手動執行的命令,直接能夠當成腳本用負載均衡

3 playbooks運維

# cat nginx_playbook.yml
---
- hosts: all
  tasks: 
    - name: Install Nginx
      shell: yum install --quiet -y nginx
    - name: Copy configuration files
      shell: cp xtest1.conf /etc/nginx/conf.d/xtest1.conf
    - name: Start Nginx and configure it to run at boot
      shell: systemctl start nginx && systemctl enable nginx

若是你們如今執行這份playbook,即命令curl

ansible-playbook nginx_playbook.yml

是會報錯的,會提示cannot stat ‘xtest1.conf’: No such file or directory,這是在咱們預料以內的,緣由是上面的playbook直接使用的shell命令,就至關於咱們把上面的每一行命令單獨拿出來,登陸到目標機器去執行同樣,所以無對應的配置文件,而在實際工做中,nginx的配置文件都是被咱們放到管理節點上的,下面咱們使用Ansible自帶的模塊,改寫上面的playbook

# cat nginx_playbook.yml
---
- hosts: 192.168.31.100
  tasks: 
    - name: Install Nginx
      yum: 
        name: nginx
        state: present 
    - name: Copy configuration files
      copy:
        src: xtest1.conf
        dest: /etc/nginx/conf.d/xtest1.conf
        owner: root
        group: root
        mode: 0644
    - name: Make sure Nginx is started now and at boot
      service: name=nginx state=started enabled=yes

目前咱們無需關注Ansible資源的目錄合理規劃問題,任意建立一個目錄,把上面的文件放進去,而後在該目錄放一個配置文件,配置文件的內容參見上文,以下截圖

在這裏插入圖片描述

若是要執行上面的playbook,移動到playbook所在的目錄,而後運行ansible-playbook nginx_playbook.yml,不過別急執行,咱們仔細解釋下這份playbook

--- 
固定寫法,一個標記,相似php代碼開頭都有<?php同樣,在k8s裏若是一個yml文件裏定義多個資源也是用---分割

- hosts: 192.168.31.100
表示管理的機器,一樣這個IP必須已經存放到主機清單裏,all表示全部機器,這塊的規則跟使用ad-hoc命令一致

yum、service模塊這裏很是簡單,即使無任何Ansible經驗也能讀懂,很少解釋

copy模塊這裏,表示的是把本機(管理機器)當前目錄(相對於執行的命令)下的xtest1.conf,拷貝到目標機器的 /etc/nginx/conf.d/xtest1.conf

執行一下,看看效果

在這裏插入圖片描述

能夠看到反覆執行,目標機器不會再改變,擁有冪等性

基礎語法規則

# cat nginx_playbook.yml
---
- hosts: 192.168.31.100
  tasks: 
    - name: Install Nginx
      yum: 
        name: nginx
        state: present 
    - name: Copy configuration files
      copy:
        src: xtest1.conf
        dest: /etc/nginx/conf.d/xtest1.conf
        owner: root
        group: root
        mode: 0644
    - name: Make sure Nginx is started now and at boot
      service: name=nginx state=started enabled=yes
  • 須要以 --- 3個減號開始,且需頂行首寫
  • 使用#號註釋(能夠在開頭註釋寫上playbook的功能)
  • 縮進必須是統一的,不能將空格和Tab混用,建議統一使用2個空格做爲縮進
  • key / value 能夠寫在一行,也可寫在多行,區分大小寫
  • playbook的執行是有順序的,從上到下

真要比較起來,寫在多行有個好處是,方便git追蹤對比區別

經常使用核心參數

--inventory=PATH (-i PATH)  手動指定主機清單文件,默認是 /etc/ansible/hosts
-v    輸出詳細信息
-vvv  輸出更詳細信息
-vvvv 調試(debug)模式
--forks=NUM  指定併發執行數,默認是5
--check (-C) 不實際執行,運行檢查模式
--syntax-check  語法檢查
--limit ${ip}  限制執行只在單個或多個IP內(逗號分割)
--list-hosts  顯示本次執行操控的IP

下面例舉兩個實際工做場景:初始化一批機器,和初始化單臺機器,看一下上面的參數咱們如何使用,準備的環境以下

[root@192-168-31-106 ~/install_nginx]# ls
nginx_playbook.yml  xtest1.conf
[root@192-168-31-106 ~/install_nginx]# cat nginx_playbook.yml 
---
- hosts: all
  tasks: 
    - name: Install Nginx
      yum: 
        name: nginx
        state: present 
    - name: Copy configuration files
      copy:
        src: xtest1.conf
        dest: /etc/nginx/conf.d/xtest1.conf
        owner: root
        group: root
        mode: 0644
    - name: Make sure Nginx is started now and at boot
      service: name=nginx state=started enabled=yes

[root@192-168-31-106 ~/install_nginx]# cat xtest1.conf 
server {
    listen       7001;
    server_name  localhost;
    location / {
        root   /opt/xtest1;
        index  index.html;
    }
}

場景1: 初始化一批nginx機器做爲七層負載均衡

#查看操控了哪些機器
ansible-playbook nginx_playbook.yml --list-hosts
#檢查語法
ansible-playbook nginx_playbook.yml --syntax-check
#模擬執行 (這個模擬執行並非萬能模擬)
ansible-playbook nginx_playbook.yml --check
#實際執行
ansible-playbook nginx_playbook.yml

在這裏插入圖片描述

以下圖,模擬執行沒有報錯,而實際執行確報錯了,緣由是192.168.31.106這臺機器上已經把80端口占用,再啓動一個nginx也監聽再80端口上,有衝突因此報錯,所以模擬執行這個功能,並非萬能的,只能大體去模擬,從這裏咱們也能夠看到一臺機器執行報錯,並不影響其它機器的正常運行

在這裏插入圖片描述

場景2 量大,以前的七層機器頂不住,新增一臺七層機器(192.168.31.102)

#查看操控了哪些機器
ansible-playbook nginx_playbook.yml --list-hosts
#檢查語法
ansible-playbook nginx_playbook.yml --syntax-check
#限制某臺機器模擬執行
ansible-playbook nginx_playbook.yml --check --limit 192.168.31.102
#若是要限制多臺,則以逗號分割
ansible-playbook nginx_playbook.yml --check --limit 192.168.31.102,192.168.31.100
#能夠配合--list-hosts,再次確認
ansible-playbook nginx_playbook.yml --check --limit 192.168.31.102,192.168.31.100 --list-hosts
#實際執行
ansible-playbook nginx_playbook.yml --limit 192.168.31.102

在這裏插入圖片描述

順便給你們看眼,-v參數輸出的效果

在這裏插入圖片描述

Playbook 與 Shell 腳本差別對比

  1. Ansible 執行時會留下清晰到痕跡,告訴咱們Ansible都幹了什麼
  2. 若是設計合理,Ansible能提供至關程度都冪等性支持 (至少可以校驗該playbook是否實現了冪等)
  3. 提供了相似 --check 參數,在之際執行前,進行模擬執行,不會對目標機器實際做出改變
  4. 大型Shell腳本含義維護,一旦出問題難以debug,而設計良好的Ansible Playbook幾乎無此問題

ansible-doc 查看幫助

#1 查看系統裏所有模塊
ansible-doc --list > /tmp/tmp.txt

#2 搜索某個模塊的用法
ansible-doc --list > /tmp/tmp.txt; grep copy /tmp/tmp.txt
ansible-doc copy

這個不少時候比查看官方文檔方便些,畢竟不用聯網,更重要的是版本確定一致

debug模塊

這個模塊用來測試Ansible一些經常使用的功能很是方便

[root@192-168-31-106 ~/install_nginx]# cat debug_playbook.yml 
---
- hosts: all
  tasks:
    - name: debug test 1
      debug:
        msg: 主機名 {{ ansible_hostname }}
    - name: debug test 2
      debug:
        msg: 操做系統 {{ ansible_distribution }} 版本 {{ ansible_distribution_major_version }}
[root@192-168-31-106 ~/install_nginx]# ansible-playbook debug_playbook.yml

在這裏插入圖片描述

上面用的變量都是Ansible系統內置的變量,雙花括號,兩邊留一個空格,中間寫變量名稱,這是固定用法,其它可使用的變量能夠經過下面的命令查詢

ansible 192.168.31.100 -m setup

使用非root用戶執行

# cat none-root-user.yml
- hosts: test
  tasks:
    - name: debug info 4
      become: yes
      become_user: www
      shell: whoami > /tmp/tmp2.txt

標籤和指定操做系統

---
cat tags_playbook.yml
- name: copy node-ps single binary to remote machine /etc/dAppCluster
  copy: src=node-ps dest=/etc/dAppCluster/node-ps mode=0744
  tags:
  - INSTALL_OR_UPDATE
  when: 
  - ansible_distribution == "CentOS"
  - ansible_distribution_major_version == "6" or ansible_distribution_major_version == "7"

- name: copy node-ps manager scripts CENTOS7
  copy: src=node-ps.service dest=/usr/lib/systemd/system/node-ps.service
  tags:
  - UPDATE
  when: 
  - ansible_distribution == "CentOS"
  - ansible_distribution_major_version == "7"

#不指定tag,則所有執行
ansible-playbook  tags_playbook.yml --limit 192.168.31.100
#指定具體的tag,則只執行該tag下面的任務
ansible-playbook  tags_playbook.yml --tags UPDATE --limit 192.168.31.100

加上特定的標籤,能夠區分不一樣場景執行的任務,如安裝是一種標籤,升級是一種標籤,也能夠用來作測試

Ansible提示顏色信息說明

  • 翔黃色:對遠程節點進行相應修改
  • 帽子綠:對遠程節點不進行相應修改,或者只是對遠程節點信息進行查看
  • 深紅色:操做執行命令有異常
  • 淺紫色:表示對命令執行發出警告信息(可能存在的問題,給你一下建議)

參考連接

https://docs.ansible.com/ansible/latest/cli/ansible-doc.html
相關文章
相關標籤/搜索