Ansible是一個系列文章,我會盡量以通俗易懂、詼諧幽默的總結方式給大家呈現這些枯燥的知識點,讓學習變的有趣一些。
前言
對於任何一個框架,一個應用,爲了更便於推廣,便於使用,便於商業化,都會順便提供很多常用的模塊,這樣讓大家也很容易使用起來。Ansible也是一樣的,所以這些常用的模塊,就好比基本功,基本招式一樣,我們需要掌握這些基本功,掌握這些基本招式。這篇文章,就對這些常用的模塊進行一個比較全面的總結。
ping模塊
ping
是測試遠程節點的SSH連接是否就緒的常用模塊,但是它並不像Linux命令那樣簡單地ping一下遠程節點,而是先檢查能否通過SSH登陸遠程節點,再檢查其Python版本能否滿足要求,如果都滿足則會返回pong,表示成功。使用方式如下:
ansible web -m ping
ping
無須任何參數。上述命令輸出結果如下所示:
192.168.1.2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.1.4 | SUCCESS => {
"changed": false,
"ping": "pong"
}
debug模塊
打印輸出信息,類似Linux上的echo命令。在後續的學習過程中,我們會經常用這個命令來調試我們寫的playbook。
對於debug
模塊有兩種用法。下面就對這兩種用法都進行詳細的總結。
通過參數msg定義打印的字符串
msg中可以嵌入變量,比如我先定義了以下的一個playbook。--- - hosts: web vars: name: jellythink tasks: - name: display debug: msg="I am {{name}}"
通過參數var定義需要打印的變量
變量可以是系統變量,也可以是動態的執行結果,通過關鍵字register
注入變量中。對於變量,我們可以這樣玩:
---
- hosts: web
vars:
name: jellythink
tasks:
- name: display
debug:
var: name
對於注入變量,可以這樣玩:
---
- hosts: web
tasks:
- name: register var
shell: hostname
register: result
- name: display
debug:
var: result
copy模塊
從當前的機器上覆制靜態文件到遠程節點上,並且設置合理的文件權限。copy
模塊在複製文件的時候,會先比較一下文件的checksum,如果相同則不會複製,返回狀態爲OK;如果不同纔會複製,返回狀態爲changed。
一般情況的使用,就是這樣的:
---
- hosts: server1
tasks:
- name: copyDemo
copy:
src: /home/jelly/nameList.txt
dest: /home/test1/nameList.txt
在實際的工作中,一般會在進行文件分發時,需要備份原文件,這個時候就需要我們加上backup
選項:
---
- hosts: server1
tasks:
- name: copyDemo
copy:
src: /home/jelly/nameList.txt
dest: /home/test1/nameList.txt
backup: yes
加上backup: yes
後,在目標主機上,就會對原來的文件進行備份,比如這樣子的備份文件:
nameList.txt.8648.2019-09-28@06:27:18~
template模塊
如果只是複製靜態文件,使用copy
模塊就可以了;但是如果在複製的同時需要根據實際情況修改部分內容,那麼就需要用到template
模塊了。
比如我們在分發配置文件時,每個配置文件需要根據遠程主機的一些屬性不同而配置不同的值,對於需要替換的部分,我們就可以使用template
模塊來進行替換。template
模塊使用的是Python中的Jinja2模板引擎,這裏我們不需要過多的去關注這個模板引擎,只需要知道變量的表示法是{{}}
就可以了。比如這裏就有一個http.conf.j2的模板文件,文件內容如下:
Listen {{ansible_default_ipv4.address}}
Port {{http_port}}
其中{{ansible_default_ipv4.address}}
就是需要根據不同的主機,動態變化的。接下來,我們就可以這樣使用template
模塊來完成變量的替換。
---
- hosts: server1
vars:
http_port: 8080
tasks:
- name: Write Config File
template:
src: http.conf.j2
dest: /home/test1/http.conf
在目的主機上,文件內容如下:
Listen 192.168.1.3
Port 8080
和copy
模塊一樣,template
模塊也可以進行權限設置和文件備份等功能。
file模塊
file
模塊可以用來設置遠程主機上的文件、軟鏈接和文件夾的權限,也可以用來創建和刪除它們。
我們可以使用mode
參數進行權限修改,可以直接賦值數字權限(必須以0開頭)。
---
- hosts: server1
tasks:
- name: Modify Mode
file:
path: /home/test1/http.conf
mode: 0777
我們還可以根據state
參數的不同,實現不同的行爲,比如創建軟鏈接:
---
- hosts: server1
tasks:
- name: Create Soft Link
file:
src: /home/test1/http.conf
dest: /home/test1/conf
state: link
也可以設置state: touch
創建一個新文件,比如這樣:
---
- hosts: server1
tasks:
- name: Create a new file
file:
path: /home/test1/touchfile
state: touch
mode: 0700
還可以設置state: directory
新建一個文件夾,比如這樣:
---
- hosts: server1
tasks:
- name: Create directory
file:
path: /home/test1/testDir
state: directory
mode: 0755
user模塊
user
模塊可以對用戶進行管理,實現增、刪、改Linux遠程節點的用戶賬戶。比如增加用戶:
---
- hosts: server1
tasks:
- name: Add user
user:
name: test3
刪除用戶:
---
- hosts: server1
tasks:
- name: Add user
user:
name: test3
state: absent
remove: yes
但是在使用這個user
模塊時,需要注意權限問題。
shell模塊
在遠程節點上通過/bin/sh
執行命令。如果一個命令可以通過模塊yum
、copy
模塊實現時,那麼建議不要使用shell
或者command
這樣通用的命令模塊。因爲通用的命令模塊不會根據具體操作的特點進行狀態判斷,所以當沒有必要再重新執行的時候,它還是會重新執行一遍。
支持
<
、>
、|
、;
和&
--- - hosts: server1 tasks: - name: Test shell shell: echo "test1" > ~/testDir/test1 && echo "test2" > ~/testDir/test2
調用腳本
--- - hosts: server1 tasks: - shell: ~/test.sh >> somelog.txt
在執行命令之前,我們可以改變工作目錄,並且僅在文件somelog.txt不存在時執行命令,除此之外,還可以指定用bash運行命令:
--- - hosts: server1 tasks: - shell: ~/test.sh >> somelog.txt args: chdir: ~/testDir creates: somelog.txt executable: /bin/bash
command模塊
在遠程節點上執行命令。和shell
模塊類似,但不支持<
、>
、|
、;
和&
等操作,其它的大抵都是相似的。
總結
Ansible提供了非常多的常用模塊,我們可以使用ansible-doc -l
命令查看這些模塊。這篇文章只是總結了幾個用的頻率更高一點的,對於這裏總結的常用模塊,我們需要做到“手到擒來”,熟練到上手就能寫的地步,大家需要在理解的基礎上,多上手寫,多練習。在今後的工作中多用這些常用的模塊來提升自己的工作效率。
夜,又靜了!
2019年9月29日,於內蒙古呼和浩特。