1. 程式人生 > >Ansible常用模組基本操作

Ansible常用模組基本操作

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執行命令。如果一個命令可以通過模組yumcopy模組實現時,那麼建議不要使用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日,於內蒙古呼和浩特