Ansible的核心是Playbooks(可翻譯爲劇本),劇本是用YAML語法書寫的,來描述對被管理機器須要進行的一系列操做。劇本至關於作菜手冊,上面按順序記錄了,如何把被管理機器一步步打形成指定的樣子。php
YAML語法至關簡單,即便讀者以前從未聽過YAML也毫無關係,YAML書寫起來比JSON格式更簡單html
接下來咱們以運維朋友幾乎都很是熟悉的,安裝nginx,來演示playbooks的基礎用法node
咱們分別使用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
真要比較起來,寫在多行有個好處是,方便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
參數輸出的效果
--check
參數,在之際執行前,進行模擬執行,不會對目標機器實際做出改變#1 查看系統裏所有模塊 ansible-doc --list > /tmp/tmp.txt #2 搜索某個模塊的用法 ansible-doc --list > /tmp/tmp.txt; grep copy /tmp/tmp.txt ansible-doc copy
這個不少時候比查看官方文檔方便些,畢竟不用聯網,更重要的是版本確定一致
這個模塊用來測試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
# 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
加上特定的標籤,能夠區分不一樣場景執行的任務,如安裝是一種標籤,升級是一種標籤,也能夠用來作測試
https://docs.ansible.com/ansible/latest/cli/ansible-doc.html