ansible七種武器和json
• 第一種武器
– ansible 命令,用於執行臨時性的工作,也是我們之前主要學習的功能,必須掌握
• 第二種武器
– ansible-doc 是 Ansible模塊文檔說明,針對每個模塊都有詳細的用法說明及應用案例介紹,功能和Linux系統man命令類似,必須掌握ansible七種武器
• 第三種武器
– ansible-console 是 Ansible 為用戶提供的一款交互式工具,用戶可以在 ansible-console 虛擬出來的終端上像 Shell 一樣使用 Ansible 內置的各種命令,這為習慣於使用 Shell 交互方式的用戶提供了良好的使用體驗。
• 第四種武器
– ansible-galaxy 從 github 上下載管理 Roles 的一款工具,與 python 的 pip 類似。ansible七種武器
• 第五種武器
– ansible-playbook 是日常應用中使用頻率最高的命令,其工作機制是:通過讀取預先編寫好的 playbook 文件實現批量管理。要實現的功能與命令 ansible 一樣,可以理解為按一定條件組成的 ansible 任務集,必須掌握
• 第六種武器
– ansible-vault 主要用於配置文件加密,如編寫的Playbook 配置文件中包含敏感信息,不希望其他人隨意查看, ansible-vault 可加密/解密這個配置文件ansible七種武器
• 第七種武器
– ansible-pull
– Ansible 有兩種工作模式 pull/push ,默認使用 push模式工作,pull 模式和通常使用的 push 模式工作機理剛好相反
– 適用場景:有數量巨大的機器需要配置,即使使用高並發線程依舊要花費很多時間;
– 通常在配置大批量機器的場景下會使用,靈活性稍有欠缺,但效率幾乎可以無限提升,對運維人員的技術水平和前瞻性規划有較高要求。
json簡介
json 是什么?
– json 是 JavaScript 對象表示法,它是一種基於文本,獨立於語言的輕量級數據交換格式。
– JSON中的分隔符限於單引號 ' 、小括號 ()、中括號[ ]、大括號 { } 、冒號 : 和逗號 ,
• json 特性
– JSON 是純文本
– JSON 具有"自我描述性"(人類可讀)
– JSON 具有層級結構(值中存在值)
– JSON 可通過 JavaScript 進行解析json簡介
• json 語法規則
– 數據在名稱/值對中
– 數據由逗號分隔
– 大括號保存對象
– 中括號保存數組
• json 數據的書寫格式是:名稱/值對。
– 名稱/值對包括字段名稱(在雙引號中),后面寫一個冒號,然后是值,例如:"漂亮姐" : "龐麗靜"
• json 語法規則之數組
{ "講師":
["牛犇", "丁丁", "靜靜","李欣"]
}
• 復合復雜類型
{ "講師":
[ {"牛犇":"小逗逼", "負責階段":"1"},
{"丁丁":"老逗逼", "負責階段":"2"},
{"靜靜":"漂亮姐", "負責階段":"3"},
{"李欣":"老司機", "負責階段":"4"}
]
}
yaml簡介
• yaml 是什么 -- //不可table鍵
– 是一個可讀性高,用來表達數據序列的格式。
– YAML:YAML Ain't Markup Language
– YAML參考了其他多種語言,包括:C語言、Python、Perl,並從XML、電子郵件的數據格式(RFC 2822)中獲得靈感。Clark Evans在2001年首次發表了這種語言[1],另外Ingy döt Net與Oren Ben-Kiki也是這語言的共同設計者[2]。目前已經有數種編程語言或腳本
語言支持(或者說解析)這種語言。
• yaml 基礎語法
– YAML的結構通過空格來展示
– 數組使用"- "來表示
– 鍵值對使用": "來表示
– YAML使用一個固定的縮進風格表示數據層級結構關系
– 一般每個縮進級別由兩個以上空格組成
– # 表示注釋
• 注意:***************************************
– 不要使用tab,縮進是初學者容易出錯的地方之一
– 同一層級縮進必須對齊
YAML的鍵值表示方法
– 采用冒號分隔
– : 后面必須有一個空格
– YAML鍵值對例子
"龐麗靜": "漂亮姐"
– 或
"龐麗靜":
"漂亮姐"
– 復雜YAML的鍵值對嵌套
"講師":
"龐麗靜": "漂亮姐"
– 或
"講師":
"龐麗靜":
"漂亮姐"
– 數組
["牛犇", "丁丁", "靜靜", "李欣"]
• YAML 數組表示方法
– 使用一個短橫杠加一個空格
– YAML 數組例子
- "牛犇"
- "丁丁"
- "靜靜"
- "李欣"
– 哈希數組復合表達式
"講師":
- "牛犇"
- "丁丁"
- "靜靜"
- "李欣"yaml簡介
– 高級復合表達式
"講師":
-
"牛犇": "小逗比"
"階段": 1
-
"丁丁": "老逗比"
"階段": 2
-
"靜靜": "漂亮姐"
"階段": 3
-
"李欣": "老司機"
"階段": 4
• yaml高級語法
– | 與 > 表示對應的值為多行字符, > 與 | 的區別是會把 \n 轉換為空格
– ! 可以設置類型,!! 可以強制類型轉換
– 為了維持文件的簡潔,並避免數據輸入的錯誤,YAML提供了結點參考(*)和散列合並(<<)參考到其他結點標簽的錨點標記(&)。參考會將樹狀結構加入錨點標記的內容,並可以在所有數據結構中運作,合並只有散列表可以使用,可以將鍵值自錨點標記復制到指定的散列表中
jinja2模版簡介
• jinja2 是什么
– Jinja2是基於python的模板引擎,包含 變量 和 表達式兩部分,這兩者在模板求值的時候會被替換為值。模板中還有標簽,控制模板的邏輯。
• 為什么要學習 jinja2 模版
– 要使用 ansible 就要深入學習 playbook 配置及模板。playbook 的模板使用 python 的 jinja2 模塊來處理的jinja2模版簡介
• jinja2 模版基本語法
– 模板的表達式都是包含在分隔符 "{{ }}" 內的;
– 控制語句都是包含在分隔符 "{% %}" 內的;
– 另外,模板也支持注釋,都是包含在分隔符 "{# #}"內,支持塊注釋。
– 調用變量
{{varname}}
– 計算
{{2+3}}
– 判斷
{{1 in [1,2,3]}}
• jinja2 模版控制語句
{% if name == '小逗逼' %}
講故事,吹牛B
{% elif name == '老逗逼' %}
黑絲(82年的)
{% elif name == '漂亮姐' %}
約會
{% else %}
沉迷學習,無法自拔
{% endif %}
• jinja2 模版控制語句
{% if name == ... ... %}
... ...
{% elif name == '漂亮姐' %}
{% for method in [約會, 逛街, 吃飯, 看電影, 去賓館] %}
{{do method}}
{% endfor %}
... ...
{% endif %}
• jinja2 過濾器
– 變量可以通過 過濾器 修改。過濾器與變量用管道符號( | )分割,並且也 可以用圓括號傳遞可選參數。多個過濾器可以鏈式調用,前一個過濾器的輸出會被作為 后一個過濾器的輸入。
– 例如:
– 把一個列表用逗號連接起來: {{ list|join(', ') }}
– 過濾器這里不一一列舉,需要的可以查詢在線文檔
http://docs.jinkan.org/docs/jinja2/templates.html
#builtin-filters
playbook是什么
• playbook 是什么?
– playbook 是 ansible 用於配置,部署,和管理托管主機劇本。通過 playbook 的詳細描述,執行其中的一系列 tasks,可以讓遠端主機達到預期的狀態。
– 也可以這么理解,playbook 字面意思,即劇本,現實中由演員按照劇本表演,在 Ansible 中由計算機進行表演,由計算機安裝,部署應用,提供對外服務,以及組織計算機處理各種各樣的事情playbook是什么
• 為什么要使用playbook
– 執行一些簡單的任務,使用ad-hoc命令可以方便的解決問題,但是有時一個設施過於復雜,需要大量的操作時候,執行的 ad-hoc 命令是不適合的,這時最好使用playbook,就像執行 shell 命令與寫 shell 腳本一樣,也可以理解為批處理任務
– 使用 playbook 你可以方便的重用編寫的代碼,可以移植到不同的機器上面,像函數一樣,最大化的利用代碼在使用 Ansible 的過程中,你也會發現,你所處理的大部分操作都是編寫 playbookplaybook語法基礎
• playbook 語法格式
– playbook由 YAML 語言編寫,遵循 YAML 標准
– 在同一行中,#之后的內容表示注釋
– 同一個列表中的元素應該保持相同的縮進
– playbook 由一個或多個 play 組成
– play 中 hosts,variables,roles,tasks 等對象的表示方法都是鍵值中間以 ": " 分隔表示
– YAML 還有一個小的怪癖. 所有的 YAML 文件開始行都應該是 ---. 這是 YAML 格式的一部分, 表明一個文件的開始
• playbook語法基礎
• playbook 構成
– Target: 定義將要執行 playbook 的遠程主機組
– Variable: 定義 playbook 運行時需要使用的變量
– Tasks: 定義將要在遠程主機上執行的任務列表
– Handler: 定義 task 執行完成以后需要調用的任務playbook語法基礎
• Playbook執行結果
• 使用 ansible-playbook 運行playbook文件,得到輸出內容為 JSON 格式。並且由不同顏色組成,便於識別。
一般而言
• 綠色代表執行成功
• ***代表系統代表系統狀態發生改變
• 紅色代表執行失敗playbook語法基礎
• 第一個playbook
---
- hosts: all
remote_user: root
tasks:
- ping:
# 第一行,表示開始
ansible-playbook myping.yml -f 5
– -f 並發進程數量,默認是 5
– hosts 行的內容是一個或多個組或主機的 patterns,以逗號為分隔符
– remote_user 就是賬戶名
• playbook語法基礎續 ... ...
– tasks
– 每一個 play 包含了一個 task 列表(任務列表).
– 一個 task 在其所對應的所有主機上(通過 hostpattern 匹配的所有主機)執行完畢之后,下一個 task才會執行.
– 有一點需要明白的是(很重要),在一個 play 之中,所有 hosts 會獲取相同的任務指令,這是 play 的一個目的所在,也就是將一組選出的 hosts 映射到 task,執行相同的操作playbook語法基礎
• playbook 執行命令
– 給所有主機添加用戶 plj,設置默認密碼 123456
– 要求第一次登錄修改密碼
---
- hosts: all
remote_user: root
tasks:
- name: create user plj
user: group=wheel uid=1000 name=plj
- shell: echo 123456 | passwd --stdin plj
- shell: chage -d 0 plj
[root@localhost 07.03]# ansible-playbook uesr2.yml
案例2
---
- hosts: web1
remote_user: root
vars:
uname: li4
tasks:
- shell: userdel -r zhang3
ignore_errors: True
- user:
name: "{{uname}}"
password: "{{ '123456' | password_hash('sha512') }}"
groups: users
[root@localhost ansible]# ansible-playbook uesr1.yml
案例3
---
- hosts: web
remote_user: root
tasks:
- name: install the latest version of Apache
yum:
name: httpd
state: installed
- lineinfile:
path: /etc/httpd/conf/httpd.conf
regexp: '^Listen '
line: 'Listen 8080'
- lineinfile:
path: /etc/httpd/conf/httpd.conf
regexp: '#ServerName '
line: 'ServerName localhost'
- shell: echo "hello world" >index.html
args:
chdir: /var/www/html
notify:
- restart httpd
handlers:
- name: restart httpd
service: name=httpd state=restarted
[root@localhost 07.03]# ansible-playbook httpd.yml