devops工具-Ansible基礎

1、Ansible介紹

簡介

    Ansible使用Python語言開發,是一個配置管理型工具,與之相似的工具還有Puppet、SaltStack、chef等,默認經過SSH協議進行遠程命令執行或下發配置,無需部署任何客戶端代理軟件,可同時支持多臺主機進行管理,Ansible是基於模塊工做的,自己沒有批量部署的能力,真正具備批量部署的是Ansible所運行的模塊,可以實現批量運行命令、部署程序、配置系統等功能。目前已經Ansible已經被紅帽官方收購,並基於實現了企業級產品,如tower。
    Ansible上手快,簡單易學,深受廣大運維人員青睞,是devops工程師必備技能之一。
 

特色

  • 部署簡單,只需在主控端部署Ansible環境,被控端無需作任何操做;
  • 默認使用SSH協議對設備進行管理;
  • 豐富的模塊支持,可實現平常絕大部分操做;
  • 配置簡單、功能強大、擴展性強;
  • 支持API及自定義插件或模塊,可經過Python輕鬆擴展;
  • 經過Playbooks來定製強大的配置、狀態管理;
  • 輕量級,無需在客戶端安裝agent,更新時,只需在操做機上進行一次更新便可;

架構 

1. Ansible:核心應用程序
2. Host inventory: 主機清單,用來定義Ansible管理的主機,默認是在Ansible配置文件中定義被管理主機,同時也支持自定義動態主機清單。
3. Comecton pugins:遠程主機鏈接插件,負責和被管理主機實現通訊。除支持使用SSH鏈接被管理主機外,Ansible還支持其餘的鏈接方式,因此須要有鏈接插件將各個主機用鏈接插件鏈接到Ansible。
4. Core modules:Ansible核心模塊,如yum、file、shell等,它是實際用於完成管理主機的模塊,不通的模塊功能不一樣。
5. Custom meodle:自定義模塊。用於完成模塊功能的補充,可藉助相關插件完成記錄日誌、發送郵件等功能。
6. Playbooks :劇本,基於yaml, jinja2 語法,用來集中定義Ansible任務的配置文件,即將多個任務定義在一個劇本中由Ansible自動執行,能夠由控制主機針對多臺被管理主機同時運行多個任務。

任務執行

一般ansible 任務執行分爲兩種模式:ad-hoc和playbook
  • ad-hoc模式(點對點模式):使用單個模塊,支持批量執行單條命令,可完成簡單類型的配置管理任務。
  • playbook模式(劇本模式):Ansible主要管理方式,也是Ansible功能強大的關鍵所在。playbook經過多個task集合完成一類功能,如Web服務的安裝部署、數據庫服務器的批量備份等。能夠簡單地把playbook理解爲經過組合多條ad-hoc操做的配置文件。
 
執行過程:
  1. 加載本身的配置文件,默認/etc/ansible/ansible.cfg;
  2. 查找對應的主機配置文件,找到要執行的主機或者組;
  3. 加載本身對應的模塊文件,如 command;
  4. 經過ansible將模塊或命令生成對應的臨時py文件(python腳本), 並將該文件傳輸至遠程服務器;
  5. 對應執行用戶的家目錄的$HOME/.ansible/tmp/ansible-tmp-數字/XXX.PY文件,給文件 +x 執行權限;
  6. 執行並返回結果;
  7. 刪除臨時py文件,退出;

2、安裝配置

Centos7安裝

方式一:yum安裝html

yum install epel-release -y
yum install ansible –y

查看版本python

ansible --version

方式二:pip安裝mysql

yum install python-pip 
pip install ansible

ubuntu安裝

sudo apt-get update
sudo apt-get install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt-get install ansible

目錄結構

配置文件目錄:/etc/ansible/
執行文件目錄:/usr/bin/
Lib庫依賴目錄:/usr/lib/python2.7/site-packages/ansible/
Help文檔目錄:/usr/share/doc/ansible-<version>/

ansible配置文件查找順序

1. ANSIBLE_CONFIG :優先經過環境變量查找,例如設置爲 export ANSIBLE_CONFIG=/home/admin/ansible.cfg
2. ansible.cfg :當前目錄下的ansible.cfg配置文件
3. ~/.ansible.cfg :家目錄下的.ansible.cfg配置文件
4. /etc/ansible/ansible.cfg:/etc下的ansible.cfg配置文件
利用以上特性,咱們能夠對不一樣使用ansible用戶利用配置文件進行權限劃分。好比admin用戶在其家目錄配置.ansible.cfg,而www用戶在其家目錄下定義另外一個.ansible.cfg,配置不一樣的inventory,這樣admin用戶和www用戶管理的主機就不相同。
 

經常使用配置參數

所有ansible.cfg配置參數可參考官網: https://docs.ansible.com/ansible/latest/reference_appendices/config.html,如下列舉經常使用配置參數: 
inventory      = /etc/ansible/hosts  #主機清單配置
forks          = 5                   #同時執行任務的個數配置(併發數配置)
sudo_user      = root                #設置默認sudo用戶,主機清單指定可覆蓋該選項
ask_sudo_pass = True                 #設置sudo是否須要須要密碼
ask_pass      = True                 #設置ssh是否須要輸入密碼
transport      = smart               #paramiko遠程鏈接的鏈接類型
remote_port    = 22                  #遠程主機默認ssh端口設置
log_path       = /tmp/ansible.log    #日誌目錄配置,默認不記錄日誌
host_key_checking = False            #是否主機檢查指紋
timeout        = 60                  #ssh鏈接超時默認設置
roles_path     = /etc/ansible/roles  #默認role配置目錄
private_key_file = /path/to/file     #設置默認ssh私鑰位置
retries = 3                          #設置ssh鏈接失敗時候的嘗試次數

須要注意的是ansible採用ConfigParser模塊進行配置解析,其中一個配置組稱爲一個 section而具體的配置參數稱爲options,例如:
[defaults]
inventory      = /etc/ansible/hosts  
forks          = 5                   
sudo_user      = root  

其中[defaults]叫作配置組(section),而inventory、forks是配置參數(options)。linux

主機清單

  ansible主機清單就是記錄被控制的機器的清單,可分爲動態主機清單和靜態主機清單。靜態主機清單經過配置文件ansible.cfg的inventory 選項指定文件路徑,用於定義多個被管控主機。支持域名、IP,並可對主機分組,以下:ios

[web]           #分組
10.1.210.53     #使用IP地址
10.1.210.51     
www.example.com #使用域名

[db]
10.1.210.68

使用主機清單時候可使用通配符,切片,邏輯表達式來使用。例如:nginx

ansible 10.1.210.* -m ping   #10.1.210.x網段的全部主機
ansible web[0:3] -m ping     #屬於組web的第1到4臺主機
ansible web1&web2 -m ping    #屬於組web1又屬於web2的主機

3、Ansible經常使用命令

  ansible經常使用命令比較多,一般咱們經常使用的就三個:ansible、ansible-doc、ansible-playbook。如下是相關命令以及做用:git

/usr/bin/ansible  #Ansibe AD-Hoc 臨時命令執行工具,經常使用於臨時命令的執行
/usr/bin/ansible-doc   #Ansible 模塊功能查看工具
/usr/bin/ansible-galaxy  #網絡roles管理工具,可在網站(https://galaxy.ansible.com)上傳或下載比較優秀的roles代碼
/usr/bin/ansible-playbook  #Ansible 定製自動化的任務集編排工具
/usr/bin/ansible-pull  #支持直接從git下載playbook執行,須要遵循其規定的目錄格式一般在配置大批量機器的場景下會使用
/usr/bin/ansible-vault  #Ansible 文件加密工具
/usr/bin/ansible-console  #與用戶交互的命令執行工具

ansible-doc

  ansible-doc用於查看模塊的使用方法,經常使用方式以下:web

 

ansible-doc -l #獲取所有模塊的信息 
ansible-doc -s MOD_NAME #獲取指定模塊的使用幫助

 

示例查看cron模塊參數:正則表達式

ansible

  ad-hoc模式工具,用於執行一次行命令使用語法:sql

ansible <host-pattern> <-m 模塊> [-a args] [options]

options經常使用選項:

 

-a MODULE_ARGS   #模塊的參數,若是執行默認COMMAND的模塊,便是命令參數,如: 「date」,「pwd」等等
-k,--ask-pass #ask for SSH password。登陸密碼,提示輸入SSH密碼而不是假設基於密鑰的驗證
--ask-su-pass #ask for su password。su切換密碼
-K,--ask-sudo-pass #ask for sudo password。提示密碼使用sudo,sudo表示提權操做
--ask-vault-pass #ask for vault password。假設咱們設定了加密的密碼,則用該選項進行訪問
-B SECONDS #後臺運行超時時間
-C #模擬運行環境並進行預運行,能夠進行查錯測試
-c CONNECTION #鏈接類型使用
-f FORKS #並行任務數,默認爲5
-i INVENTORY #指定主機清單的路徑,默認爲/etc/ansible/hosts
--list-hosts #查看有哪些主機組
-m MODULE_NAME #執行模塊的名字,默認使用 command 模塊,因此若是是隻執行單一命令能夠不用 -m參數
-o #壓縮輸出,嘗試將全部結果在一行輸出,通常針對收集工具使用
-S #用 su 命令
-R SU_USER #指定 su 的用戶,默認爲 root 用戶
-s #用 sudo 命令
-U SUDO_USER #指定 sudo 到哪一個用戶,默認爲 root 用戶
-T TIMEOUT #指定 ssh 默認超時時間,默認爲10s,也可在配置文件中修改
-u REMOTE_USER #遠程用戶,默認爲 root 用戶
-v #查看詳細信息,同時支持-vvv,-vvvv可查看更詳細信息

 

host-pattern:在主機清單定義的目標主機,可支持如下幾種方式:

  • all:表示主機清單中全部的主機
  • groupname:表示組中的全部主機
  • host:指定某臺主機,可是此主機必須在主機清單中
  • 支持通配符(*)、邏輯與(:&)或(:)非(:!)和正則表達式(~) 

示例:

ansible all -m ping #全部默認inventory文件中的機器 
ansible "*" -m ping #同上 
ansible 10.1.210.* -m ping #全部122.28.13.X機器 
ansible web1:web2 -m ping #全部屬於組web1或屬於web2的機器 
ansible web1:!web2 -m ping #屬於組web1,但不屬於web2的機器 
ansible web1&web2 -m ping #屬於組web1又屬於web2的機器 
ansible webserver[0] -m ping #屬於組webserver的第1臺機器 
ansible webserver[0:5] -m ping #屬於組webserver的第1到4臺機器

ansible-playbook

  ansible-playbook用於執行劇本命令,語法:

ansible-playbook [options] playbook.yml [playbook2 ...]

經常使用選項:

 -u REMOTE_USER, --user=REMOTE_USER  #ssh 鏈接的用戶名
 -k, --ask-pass    #ssh登陸認證密碼
 -s, --sudo           #sudo 到root用戶,至關於Linux系統下的sudo命令
 -U SUDO_USER, --sudo-user=SUDO_USER    #sudo 到對應的用戶
 -K, --ask-sudo-pass     #用戶的密碼(—sudo時使用)
 -T TIMEOUT, --timeout=TIMEOUT  #ssh 鏈接超時,默認 10 秒
 -C, --check      #指定該參數後,執行 playbook 文件不會真正去執行,而是模擬執行一遍,而後輸出本次執行會對遠程主機形成的修改

 -e EXTRA_VARS, --extra-vars=EXTRA_VARS   #設置額外的變量如:key=value 形式 或者 YAML or JSON,以空格分隔變量,或用多個-e

 -f FORKS, --forks=FORKS    #進程併發處理,默認 5
 -i INVENTORY, --inventory-file=INVENTORY   #指定 hosts 文件路徑,默認 default=/etc/ansible/hosts
 -l SUBSET, --limit=SUBSET    #指定一個 pattern,對- hosts:匹配到的主機再過濾一次
 --list-hosts    #只打印有哪些主機會執行這個 playbook 文件,不是實際執行該 playbook
 --list-tasks   #列出該 playbook 中會被執行的 task
 --private-key=PRIVATE_KEY_FILE   #私鑰路徑
 --step    #同一時間只執行一個 task,每一個 task 執行前都會提示確認一遍
 --syntax-check  #只檢測 playbook 文件語法是否有問題,不會執行該 playbook
 -t TAGS, --tags=TAGS   #當 play 和 task 的 tag 爲該參數指定的值時才執行,多個 tag 以逗號分隔
 --skip-tags=SKIP_TAGS   #當 play 和 task 的 tag 不匹配該參數指定的值時,才執行
 -v, --verbose   #輸出更詳細的執行過程信息,-vvv可獲得全部執行過程信息。

3、快速開始

編寫配置文件

  前面提到了ansible在運行時候配置文件的讀取順序,這裏咱們定義/etc/ansible/ansible.cfg

vi /etc/ansible/ansible.cfg

[defaults]
inventory = /etc/ansible/hosts
forks = 5
remote_port = 22
host_key_checking = False
timeout = 20
remote_user = root
log_path =/tmp/ansible.log

定義主機清單

  配置完成ansible配置文件之後須要定義主機清單,因爲咱們在配置文件中指明瞭inventory文件是/etc/ansible/hosts,因此須要在該路徑下編輯主機清單:

vi /etc/ansible/hosts

[test]
10.1.210.51
10.1.210.53

以上定義了一個test組含有兩個主機10.1.210.5一、10.1.210.53,最基本的主機清單就定義完畢了,固然主機清單中還運行定義ssh鏈接的一些參數,如用戶、端口等:

10.1.210.51 ansible_ssh_user=root ansible_ssh_port=522
10.1.210.53 ansible_ssh_user=admin ansible_ssh_port=522

配置ssh免密鑰

  ansible運行時基於ssh,你也能夠選擇不配置免密碼,可是這樣每次運行ansible都須要輸入密碼,這樣比較麻煩,這也不是推薦的方式,更好的方式是是經過公私鑰方式免密碼登陸。
首先生成密鑰對:
[root@app52 ~]# ssh-keygen -t rsa 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:P7AbPwaKH0sPweOtmd8MJ3xevSIlrQx4zTtulxurMZI root@app52
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|                 |
|     .           |
|      +.So .     |
|     ..=+=+ o.   |
|     .=oE+B=o..  |
|    ...O &X=+o . |
|     .*.++B*oo.  |
+----[SHA256]-----+

拷貝公鑰到兩臺目標主機:

[root@app52 ~]# ssh-copy-id root@10.1.210.51
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '10.1.210.51 (10.1.210.51)' can't be established.
ECDSA key fingerprint is SHA256:nT15Ecx6eQNSmfpYlkMTAA13/P4povudxMzQiUgfYqo.
ECDSA key fingerprint is MD5:da:f1:53:9e:33:22:40:f8:52:a5:9a:1c:5d:d8:64:e8.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.1.210.51's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@10.1.210.51'"
and check to make sure that only the key(s) you wanted were added.

[root@app52 ~]# ssh-copy-id root@10.1.210.53
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '10.1.210.53 (10.1.210.53)' can't be established.
ECDSA key fingerprint is SHA256:xgZWILH5LuqmfjXe6rM9TaMQ8nlrnZl1f+qa8QnlaeY.
ECDSA key fingerprint is MD5:9a:fd:9a:0e:33:c4:0e:4b:6c:17:24:70:ad:f1:7a:f7.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.1.210.53's password: 

Number of key(s) added: 1

測試免密碼登陸:

[root@app52 ~]# ssh 10.1.210.51
Last login: Sun Mar 10 18:59:27 2019 from 10.1.201.30
[root@app51 ~]#

 

運行模塊

這裏使用ping模塊能夠判斷主機是否連通。

[root@app52 ~]# ansible test -m ping
10.1.210.53 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
10.1.210.51 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

以上ansible就能夠正常使用了,下面介紹經常使用模塊。

4、經常使用模塊

  所用經常使用模塊都遵循如下語法,這裏將介紹經常使用模塊以及相關參數。

ansible <host-pattern> <-m 模塊> [-a args] [options]

1. authorized_key模塊

該模塊用於添加或推送密鑰到遠程主機,在配置ansible無密碼方式很是有用,經常使用參數:

key       #公鑰路徑,能夠是本地文件,能夠是url地址,本地文件時使用{{ lookup('file','~/.ssh/id_rsa.pub') }},# url使用https://example.com/username.keys。
manage_dir  #是否建立或修改目標authorized_keys所在目錄的全部者和權限。默認爲yes。使用自定義的目標路徑時,必須設置爲no
path    #authorized_keys所在的目錄,默認爲家目錄下的.ssh目錄中
state   #是否將密鑰添加到目標authorized_keys文件中,present表示添加,absent表示刪除,
user    #指明添加到那個用戶下的authorized_keys文件

演示:
推送root用戶的公鑰到目標主機
[root@app52 ~]# ansible 10.1.210.53 -m authorized_key -a "user=root key={{lookup('file','~/.ssh/id_rsa.pub')}} state=present " -k 
SSH password: 
10.1.210.53 | SUCCESS => {
    "changed": false, 
    "comment": null, 
    "exclusive": false, 
    "follow": false, 
    "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVlq85BhjzI9pTKBMW3h4Ntoto8FoBicifvhpZ4V2DhNr5nacKzIFTjcq/asFZ+VKJKoInRQkozRBnSrB1Rf5BbpOABK22ROgZUwkHX1H/emuuFm75s1o5y6/4Xkvfcwjczb0ZIzXSuSwSpXk66BaPRVSSVia4XLr6ZBzrZoGrTrwV1jK4phWI/cJTqdC9PSH24HfLyyPS1CMB9UWEQXGUMwem9Y9USOeAgrlVqFl3aoWx58SA6xnmm2hAefIKpDzIyuQaxCM7Yr5JdeXWlV4qE8ibBdPR3ltmZ7O2opZBRig+eMZmZoo0XpTKLbkDRHu3CxpECQAZ+nENG3apc9Yl root@app52", 
    "key_options": null, 
    "keyfile": "/root/.ssh/authorized_keys", 
    "manage_dir": true, 
    "path": null, 
    "state": "present", 
    "unique": false, 
    "user": "root", 
    "validate_certs": true
}
#測試免密碼登陸
[root@app52 ~]# ssh 10.1.210.53
Last login: Wed Mar 20 21:38:57 2019 from 10.1.210.52
[root@app53 ~]# exit
登出
Connection to 10.1.210.53 closed

示例中使用-k選擇在ssh時候詢問密碼,若要無祕鑰推送需在主機清單文件指定ansible_ssh_pass參數配置密碼

 

[test]
10.1.210.51  ansible_ssh_pass=1234qwer
10.1.210.53  ansible_ssh_pass=1234qwer

 

2.命令模塊command

  該模塊用於直接在遠程主機執行命令,但不不支持|(管道)、$、&等shell操做符,這也是和shell模塊的區別。經常使用參數:

chdir       # 在執行命令以前,先切換到該目錄
executable # 切換shell來執行命令,須要使用命令的絕對路徑
free_form   # 要執行的Linux指令,通常使用Ansible的-a參數代替。
creates  # 文件路徑,當這個文件存在,則該命令不執行,能夠用來作判斷
removes  # 文件路徑,這個文件不存在,則該命令不執行

演示:
使用command命令查看遠程目錄文件
[root@app52 ~]# ansible test -m command -a 'ls -l'
10.1.210.53 | CHANGED | rc=0 >>
總用量 8
-rw-------. 1 root root 1258 1月  16 01:03 anaconda-ks.cfg
-rw-r--r--  1 root root  521 1月  16 10:50 rs.sh

10.1.210.51 | CHANGED | rc=0 >>
總用量 220332
-rw-------. 1 root root      1258 1月  16 00:15 anaconda-ks.cfg
-rw-r--r--  1 root root         7 2月  27 10:25 a.txt
-rw-r--r--  1 root root     10240 3月   1 15:42 backup.tar
drwxr-xr-x  6 root root        47 3月   4 19:38 demo
-rw-r--r--  1 root root        76 2月  27 19:14 Dockerfile
-rw-r--r--  1 root root       578 1月  16 10:41 dr.sh
-rw-r--r--  1 root root       559 1月  16 14:53 nat.sh
-rw-------  1 root root 114356736 2月  24 10:56 nginx-bus.tar.gz
-rw-------  1 root root 111224320 2月  23 19:18 nginx.tar

一樣的命令,使用creates判斷本次任務是否須要運行:

[root@app52 ~]# ansible test -m command -a 'ls -l creates=/root/a.txt'
10.1.210.51 | SUCCESS | rc=0 >>
skipped, since /root/a.txt exists #因爲/root目錄下存在a.txt該條命令跳過

10.1.210.53 | CHANGED | rc=0 >>
總用量 8
-rw-------. 1 root root 1258 1月  16 01:03 anaconda-ks.cfg
-rw-r--r--  1 root root  521 1月  16 10:50 rs.sh

3.命令模塊shell

  shell模塊用於遠程主機調用shell環境執行命令,其實是利用/bin/sh來執行命令的,該模式下可使用shell環境,如$、|、&等,其參數於command模塊相差不大。
演示:
[root@app52 ~]# ansible test -m shell -a 'cat /etc/passwd |grep root'       
10.1.210.51 | CHANGED | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

10.1.210.53 | CHANGED | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

4. 文件管理file模塊

  文件模塊用於管理文件或目錄屬性,也能夠建立文件或者目錄。經常使用參數:

group  # file/directory的所屬組
owner  # file/directory的全部者
mode   # 修改權限,格式能夠是064四、'u+rwx'或'u=rw,g=r,o=r'等
path   # 指定待操做的文件,可以使用別名'dest'或'name'來替代path
recurse # (默認no)遞歸修改文件的屬性信息,要求state=directory
src     # 建立連接時使用,指定連接的源文件
state   # 建立狀態,對應如下參數:
    # directory:若是目錄不存在則遞歸建立
    # file:文件不存在時,不會被建立(默認值)
    # touch:touch由path指定的文件,即建立一個新文件,或修改其mtime和atime 
    # link:修改或建立軟連接
    # hard:修改或建立硬連接
    # absent:目錄和其中的文件會被遞歸刪除,文件或連接將取消連接狀態

演示:
建立文件
[root@app52 ~]# ansible 10.1.210.51 -m file -a 'path=/tmp/b.txt state=touch'
10.1.210.51 | CHANGED => {
    "changed": true, 
    "dest": "/tmp/b.txt", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "size": 0, 
    "state": "file", 
    "uid": 0
}

建立目錄

[root@app52 ~]# ansible 10.1.210.51 -m file -a 'path=/tmp/test state=directory'
10.1.210.51 | CHANGED => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/tmp/test", 
    "size": 6, 
    "state": "directory", 
    "uid": 0
}

建立軟鏈接文件

[root@app52 ~]# ansible 10.1.210.51 -m file -a 'path=/tmp/link.txt src=/tmp/b.txt state=link'     
10.1.210.51 | CHANGED => {
    "changed": true, 
    "dest": "/tmp/link.txt", 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "size": 10, 
    "src": "/tmp/b.txt", 
    "state": "link", 
    "uid": 0
}
#查看軟鏈接文件
[root@app52 ~]#  ansible 10.1.210.51 -m command -a 'ls /tmp/link.txt -l'
10.1.210.51 | CHANGED | rc=0 >>
lrwxrwxrwx 1 root root 10 3月  19 19:54 /tmp/link.txt -> /tmp/b.txt

5.  文件複製copy模塊

  copy模塊用於拷貝文件到遠程主機上。默認狀況下,ansible copy會檢查文件md5查看是否須要拷貝,相同則不會拷貝,不然會拷貝。設置force=yes(默認),則當文件md5不一樣時(即文件內容不一樣)才覆蓋拷貝,設置force=no時,則只拷貝對方沒有的文件。經常使用參數:

 

src    #被複制到遠程主機的本地文件。能夠是絕對路徑,也能夠是相對路徑。若是路徑是一個目錄,則會遞歸複製,用法相似於"rsync"
content  #直接以content給定的字符串或變量值做爲文件內容保存到遠程主機上,它會替代src選項
dest    #必選項,將源文件複製到的遠程主機的絕對路徑
backup   #當文件內容發生改變後,在覆蓋以前把源文件備份,備份文件包含時間信息
directory_mode    #遞歸設定目錄的權限,默認爲系統默認權限
follow=[yes|no]      #是否追蹤到連接的文件
force    #當目標主機包含該文件,但內容不一樣時,設爲"yes",表示強制覆蓋;設爲"no",表示目標主機的目標位置不存在該文件才複製。默認爲"yes"
group       #設置遠程文件的組
owner       #設置遠程文件的全部者
mode        #設置遠程文件的權限

演示:
複製文件
[root@app52 ~]# ansible 10.1.210.51 -m copy -a 'src=/tmp/ansible.log dest=/root/'
10.1.210.51 | CHANGED => {
    "changed": true, 
    "checksum": "195af61477099d1334f7b2749f93707d367f00a4", 
    "dest": "/root/ansible.log", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "5fc43e79e4af07c52a44817f29dc8a3d", 
    "mode": "0644", 
    "owner": "root", 
    "size": 4343, 
    "src": "/root/.ansible/tmp/ansible-tmp-1553067283.66-49657624579833/source", 
    "state": "file", 
    "uid": 0
}

複製文件添加內容,指定用戶和權限

[root@app52 ~]# ansible 10.1.210.51 -m copy -a "content='this is wd' dest=/root/name.txt mode=644 owner=admin group=admin"
10.1.210.51 | CHANGED => {
    "changed": true, 
    "checksum": "3fd0fcff54aa1995f1b40a93a99b8708768a5e37", 
    "dest": "/root/name.txt", 
    "gid": 1000, 
    "group": "admin", 
    "md5sum": "f5b049c476514533b2cd5de017687f8f", 
    "mode": "0644", 
    "owner": "admin", 
    "size": 10, 
    "src": "/root/.ansible/tmp/ansible-tmp-1553067559.26-33339680488448/source", 
    "state": "file", 
    "uid": 1000
}
#查看文件
[root@app52 ~]# ansible 10.1.210.51 -m shell -a 'ls /root/name.txt -l'
10.1.210.51 | CHANGED | rc=0 >>
-rw-r--r-- 1 admin admin 10 3月  20 15:39 /root/name.txt

覆蓋文件並備份

[root@app52 ~]# ansible 10.1.210.51 -m copy -a "content='this is jack' dest=/root/name.txt backup=yes"                                  
10.1.210.51 | CHANGED => {
    "backup_file": "/root/name.txt.19514.2019-03-20@15:47:45~", 
    "changed": true, 
    "checksum": "32ed47aa1178639f3012ac6c28dafb80045328a3", 
    "dest": "/root/name.txt", 
    "gid": 1000, 
    "group": "admin", 
    "md5sum": "ab8d83c62bbb601c81166dce3b1e0a90", 
    "mode": "0644", 
    "owner": "admin", 
    "size": 12, 
    "src": "/root/.ansible/tmp/ansible-tmp-1553068064.26-211248349931283/source", 
    "state": "file", 
    "uid": 1000
}
#查看文件內容
[root@app52 ~]# ansible 10.1.210.51 -m shell -a 'cat /root/name.txt'                                     
10.1.210.51 | CHANGED | rc=0 >>
this is jack

#備份文件爲文件名+時間
[root@app52 ~]# ansible 10.1.210.51 -m shell -a 'ls /root/name.* -l'   
10.1.210.51 | CHANGED | rc=0 >>
-rw-r--r-- 1 admin admin 12 3月  20 15:47 /root/name.txt
-rw-r--r-- 1 admin admin 10 3月  20 15:39 /root/name.txt.19514.2019-03-20@15:47:45~

6.文件獲取fetch

   該模塊用於從遠程主機上獲取文件到本地,經常使用參數:

src  #遠程文件路徑
dest #本次存放的文件的目錄,若是不存在會建立
validate_checksum #獲取到文件到本地後檢查文件的md5是否一致
fail_on_missing #當文件不存在是標記爲失敗,默認yes

演示:

從10.1.210.51上拉去name.txt

[root@app52 ~]#  ansible 10.1.210.51 -m fetch -a 'src=/root/name.txt dest=/root validate_checksum=yes'
10.1.210.51 | CHANGED => {
    "changed": true, 
    "checksum": "32ed47aa1178639f3012ac6c28dafb80045328a3", 
    "dest": "/root/10.1.210.51/root/name.txt", 
    "md5sum": "ab8d83c62bbb601c81166dce3b1e0a90", 
    "remote_checksum": "32ed47aa1178639f3012ac6c28dafb80045328a3", 
    "remote_md5sum": null
}
#注意其保存文件路徑是目錄是以遠程節點的ip地址爲目錄的一個文件夾,這樣作爲了防止相同文件重複和覆蓋

#查看剛纔獲取的文件
[root@app52 ~]# cat /root/10.1.210.51/root/name.txt 
this is jack

7. 包管理yum模塊

  該模塊用於軟件包的安裝,卸載、升級等。經常使用參數:

disable_gpg_check #安裝包時禁止gpgcheck,僅在state=present或latest時生效。
disablerepo       #禁用指定的倉庫,多個倉庫使用逗號分隔。
enablerepo        #指定使用那個倉庫
exclude           #排除哪些包不安裝,僅在state=present或latest時生效。
list              #列出可安裝的包相似於yum list。
name              #指定安裝的包名,可帶上版本號。多個包可以使用逗號分隔。
update_cache      #強制更新yum的緩存
state             #安裝或卸載包,present、installed,latest用於安裝包,absent、removed用於移除已安裝包。

#說明
#name須要配合state來使用,若是state指定爲present/installed/latest將安裝包,其中latest是安裝最新包,默認爲present。若是指定爲absent/removed則用於卸載包。
#在ansible中,不少地方都會出現present和absent的狀態,通常都表示目標資源的建立和刪除。

演示:
列出包:
[root@app52 ~]# ansible 10.1.210.51 -m yum -a 'list=httpd'         
10.1.210.51 | SUCCESS => {
    "ansible_facts": {
        "pkg_mgr": "yum"
    }, 
    "changed": false, 
    "results": [
        {
            "arch": "x86_64", 
            "envra": "0:httpd-2.4.6-88.el7.centos.x86_64", 
            "epoch": "0", 
            "name": "httpd", 
            "release": "88.el7.centos", 
            "repo": "base", 
            "version": "2.4.6", 
            "yumstate": "available"
        }
    ]
}

安裝httpd服務

[root@app52 ~]# ansible 10.1.210.51 -m yum -a 'name=httpd state=present' 
10.1.210.51 | CHANGED => {
    "ansible_facts": {
        "pkg_mgr": "yum"
    }, 
    "changed": true, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirrors.huaweicloud.com\n * extras: mirrors.tuna.tsinghua.edu.cn\n * updates: mirrors.tuna.tsinghua.edu.cn\nResolving Dependencies\n--> Running transaction check\n---> Package httpd.x86_64 0:2.4.6-88.el7.centos will be installed\n--> Processing Dependency: httpd-tools = 2.4.6-88.el7.centos for package: httpd-2.4.6-88.el7.centos.x86_64\n--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-88.el7.centos.x86_64\n--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-88.el7.centos.x86_64\n--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-88.el7.centos.x86_64\n--> Running transaction check\n---> Package apr.x86_64 0:1.4.8-3.el7_4.1 will be installed\n---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed\n---> Package httpd-tools.x86_64 0:2.4.6-88.el7.centos will be installed\n---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package            Arch          Version                     Repository   Size\n================================================================================\nInstalling:\n httpd              x86_64        2.4.6-88.el7.centos         base        2.7 M\nInstalling for dependencies:\n apr                x86_64        1.4.8-3.el7_4.1             base        103 k\n apr-util           x86_64        1.5.2-6.el7                 base         92 k\n httpd-tools        x86_64        2.4.6-88.el7.centos         base         90 k\n mailcap            noarch        2.1.41-2.el7                base         31 k\n\nTransaction Summary\n================================================================================\nInstall  1 Package (+4 Dependent packages)\n\nTotal download size: 3.0 M\nInstalled size: 10 M\nDownloading packages:\n--------------------------------------------------------------------------------\nTotal                                              2.2 MB/s | 3.0 MB  00:01     \nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : apr-1.4.8-3.el7_4.1.x86_64                                   1/5 \n  Installing : apr-util-1.5.2-6.el7.x86_64                                  2/5 \n  Installing : httpd-tools-2.4.6-88.el7.centos.x86_64                       3/5 \n  Installing : mailcap-2.1.41-2.el7.noarch                                  4/5 \n  Installing : httpd-2.4.6-88.el7.centos.x86_64                             5/5 \n  Verifying  : httpd-tools-2.4.6-88.el7.centos.x86_64                       1/5 \n  Verifying  : apr-1.4.8-3.el7_4.1.x86_64                                   2/5 \n  Verifying  : mailcap-2.1.41-2.el7.noarch                                  3/5 \n  Verifying  : httpd-2.4.6-88.el7.centos.x86_64                             4/5 \n  Verifying  : apr-util-1.5.2-6.el7.x86_64                                  5/5 \n\nInstalled:\n  httpd.x86_64 0:2.4.6-88.el7.centos                                            \n\nDependency Installed:\n  apr.x86_64 0:1.4.8-3.el7_4.1                 apr-util.x86_64 0:1.5.2-6.el7    \n  httpd-tools.x86_64 0:2.4.6-88.el7.centos     mailcap.noarch 0:2.1.41-2.el7    \n\nComplete!\n"
    ]
}

卸載包

[root@app52 ~]# ansible 10.1.210.51 -m yum -a 'name=httpd state=absent'        
10.1.210.51 | CHANGED => {
    "ansible_facts": {
        "pkg_mgr": "yum"
    }, 
    "changed": true, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "已加載插件:fastestmirror\n正在解決依賴關係\n--> 正在檢查事務\n---> 軟件包 httpd.x86_64.0.2.4.6-88.el7.centos 將被 刪除\n--> 解決依賴關係完成\n\n依賴關係解決\n\n================================================================================\n Package       架構           版本                          源             大小\n================================================================================\n正在刪除:\n httpd         x86_64         2.4.6-88.el7.centos           @base         9.4 M\n\n事務概要\n================================================================================\n移除  1 軟件包\n\n安裝大小:9.4 M\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  正在刪除    : httpd-2.4.6-88.el7.centos.x86_64                            1/1 \n  驗證中      : httpd-2.4.6-88.el7.centos.x86_64                            1/1 \n\n刪除:\n  httpd.x86_64 0:2.4.6-88.el7.centos                                            \n\n完畢!\n"
    ]
}

8. 服務管理service模塊

  service模塊用於管理service服務,經常使用參數:

enabled  #是否開機自啓動
name     #服務名稱
arguments #提供額外的參數
runlevel  #啓動級別
sleep     #服務重啓的等待時間,一般指服務關閉後啓動等待的時間。
state     #管理服務發生的行爲,四種行爲started(啓動)、 stopped(中止)、 restarted(重啓)、reloaded(重載)

演示:
重啓sshd服務
[root@app52 ~]# ansible 10.1.210.51 -m service -a 'name=sshd state=restarted'
10.1.210.51 | CHANGED => {
    "changed": true, 
    "name": "sshd", 
    "state": "started", 
    "status": {
        "ActiveEnterTimestamp": "五 2019-02-01 10:08:56 CST", 
        "ActiveEnterTimestampMonotonic": "5276411", 
        "ActiveExitTimestampMonotonic": "0", 
        "ActiveState": "active", 
        "After": "basic.target network.target system.slice systemd-journald.socket sshd-keygen.service", 
        "AllowIsolate": "no",

設置sshd服務爲開機自啓動

root@app52 ~]# ansible 10.1.210.51 -m service -a 'name=sshd enabled=yes'
10.1.210.51 | SUCCESS => {
    "changed": false, 
    "enabled": true, 
    "name": "sshd", 
    "status": {
        "ActiveEnterTimestamp": "三 2019-03-20 17:24:11 CS

9. systemd模塊

  該模塊用於管理systemd所管理的服務,該模塊相似於service模塊,因爲centos7.x系統服務受systemd控制,因此ansible提供與之對應的模塊管理,經常使用參數:

daemon_reload   #是否進行systemctl daemon-reload操做
enabled         #設置是否服務開機自啓動
masked          #是否將此unit作mask(隱藏、掩蓋)處理。mask後的unit將沒法啓動
name            #服務名稱
state           #service模塊,四種狀態:started、stopped、restarted、reloaded

演示:
啓動httpd服務(前提已經安裝)
[root@app52 ~]# ansible 10.1.210.51 -m systemd -a 'name=httpd state=started'
10.1.210.51 | CHANGED => {
    "changed": true, 
    "name": "httpd", 
    "state": "started", 
    "status": {
        "ActiveEnterTimestampMonotonic": "0", 
        "ActiveExitTimestampMonotonic": "0", 
        "ActiveState": "inactive", 
        "After": "remote-fs.target basic.target systemd-journald.socket tmp.mount network.target nss-lookup.target -.mount system.slice", 
        "AllowIsolate": "no", 
        "AmbientCapabilities": "0",

10. 用戶管理user模塊

  該模塊用於管理遠程主機的用戶。經常使用參數:

comment   #用戶描述信息
createhome #是否穿件家目錄,默認建立(須要ansible版本大於2.5)
force      # 強制刪除用戶,在使用state=absent時, 行爲與userdel –force一致.
group      #指定該用戶的組
groups     #指定該用戶的附加組
home       #指定用戶家目錄
move_home  #移動家目錄到某個目錄
name       #用戶名稱
uid        #設置用戶uid
password   #設置用戶密碼
remove     #刪除用戶時(state=absent)移除與之關聯的目錄, 行爲與userdel —remove一致
shell      #指定默認shell,默認是/bin/bash
state      #建立仍是刪除用戶,present建立,absent刪除
system     #標記爲系統用戶,該操做不能對已經存在的用戶生效
update_password #密碼修改策略,always老是修改,不管當前用戶是否存在,on_create表明只有新建才修改

演示:
建立一個zabbix用戶,指定shell,並指定家目錄
[root@app52 ~]# ansible 10.1.210.51 -m user -a 'name=zabbix state=present shell=/sbin/nologin home=/home/zabbix'       
10.1.210.51 | CHANGED => {
    "append": false, 
    "changed": true, 
    "comment": "", 
    "group": 1001, 
    "home": "/home/zabbix", 
    "move_home": false, 
    "name": "zabbix", 
    "shell": "/sbin/nologin", 
    "state": "present", 
    "uid": 1001
}

修改剛纔建立zabbix用戶的家目錄

[root@app52 ~]# ansible 10.1.210.51 -m user -a 'name=zabbix state=present home=/home/myhome'                    
10.1.210.51 | CHANGED => {
    "append": false, 
    "changed": true, 
    "comment": "", 
    "group": 1001, 
    "home": "/home/myhome", 
    "move_home": false, 
    "name": "zabbix", 
    "shell": "/sbin/nologin", 
    "state": "present", 
    "uid": 1001
}
###查看修改的用戶
[root@app52 ~]# ansible 10.1.210.51 -m shell -a 'cat /etc/passwd |grep zabbix'
10.1.210.51 | CHANGED | rc=0 >>
zabbix:x:1001:1001::/home/myhome:/sbin/nologin

刪除用戶

[root@app52 ~]# ansible 10.1.210.51 -m user -a 'name=zabbix state=absent'                   
10.1.210.51 | CHANGED => {
    "changed": true, 
    "force": false, 
    "name": "zabbix", 
    "remove": false, 
    "state": "absent"
}

11. 定時任務cron模塊

  cron模塊用於管理unix定時任務,經常使用參數:

inute #分鐘,指定默認是*,數字範圍0-59
hour  #小時,不指定默認是*,範圍0-23,支持unix語法,如(0-23, *, */2)
day   #日,不指定默認爲*,範圍1-31
month #月,不指定默認爲*,範圍1-12
weekday #周,不指定默認爲*,範圍0-6
name    #計劃任務名稱
 user    #指定運行計劃任務的用戶
job     #指定運行計劃任務的命令
 state   #計劃任務狀態,present表示建立,absent表示刪除
disabled #禁止或開啓計劃任務,yes表明禁止,no表明開啓,使用該參數時候須要指定計劃任務name和job
reboot   #主機重啓時候是否須要執行,yes/no
backup   #yes/no若是設置了,則會在修改遠程cron_file前備份這些文件
Special_time #特定時間運行,可選值reboot(重啓後)、yearly(每一年)、annually(每一年,與yearly相同)、monthly(每個月)、weekly(每週)、daily(天天)、hourly(每時)。

演示:
建立一個天天6點半執行的計劃任務
[root@app52 ~]# ansible 10.1.210.51 -m cron -a "name='test crontab' hour=6 minute=30 job='echo this is wd' state=present"       
10.1.210.51 | CHANGED => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "test crontab"
    ]
}
#查看計劃任務
[root@app52 ~]# ansible 10.1.210.51 -m shell -a 'crontab -l'
10.1.210.51 | CHANGED | rc=0 >>
#Ansible: test crontab
30 6 * * * echo this is wd

禁用計劃任務

[root@app52 ~]# ansible 10.1.210.51 -m cron -a "name='test crontab' job='echo this is wd' disabled=yes"
10.1.210.51 | CHANGED => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "test crontab"
    ]
}
#查看禁用的計劃任務
[root@app52 ~]# ansible 10.1.210.51 -m shell -a 'crontab -l'
10.1.210.51 | CHANGED | rc=0 >>
#Ansible: test crontab
#* * * * * echo this is wd

刪除計劃任務

[root@app52 ~]# ansible 10.1.210.51 -m cron -a "name='test crontab' state=absent"                      
10.1.210.51 | CHANGED => {
    "changed": true, 
    "envs": [], 
    "jobs": []
}
#查看已經沒有了
[root@app52 ~]# ansible 10.1.210.51 -m shell -a 'crontab -l'                     
10.1.210.51 | CHANGED | rc=0 >>

12.運行腳本script模塊

  該模塊用於將本地的腳本在遠程主機上運行,使用的是遠程主機的shell環境,經常使用參數以下:

chdir                # 運行腳本前先切換目錄
creates              # 遠程主機上的文件路徑,用於判斷,當文件存在時候,本次任務不會運行
executable:          # 可執行文件,調用腳本的
removes              # 遠程主機上的文件路徑,也用於判斷,當文件不存在時候,本次任務不會執行

演示:
切換目錄運行一個腳本
建立腳本
vi test.sh
#!/bin/sh
touch ab.txt
echo "test script" >> ab.txt

#添加執行權限
[root@app52 ~]# chmod a+x test.sh 

#遠程主機上運行腳本
[root@app52 ~]# ansible 10.1.210.51 -m script -a "chdir=/tmp /root/test.sh" 
10.1.210.51 | CHANGED => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 10.1.210.51 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to 10.1.210.51 closed."
    ], 
    "stdout": "", 
    "stdout_lines": []
}

#查看建立的文件
[root@app52 ~]# ansible 10.1.210.51 -m shell -a 'cat /tmp/ab.txt'
10.1.210.51 | CHANGED | rc=0 >>
test script

13.目錄同步synchronize模塊

  該模塊用於文件或者目錄同步,實現了簡單的rsync命令功能,沒有linux中的rsync功能完整,可是對於一些目錄同步功能已經夠用了。經常使用參數:

src  #指定待傳輸的源文件。能夠是相對路徑,也能夠是絕對路徑。
dest #目標路徑。能夠是絕對路徑,也能夠是相對路徑。
mode #指定推(push)仍是拉(pull)的傳輸模式。
archive #等價於rsync的"-a"選項,即便用歸檔模式。它等價於rsync的"-rtopgDl"選項。值爲yes/no。
times   #保留mtime屬性。
group   #保留所屬組屬性。
owner   #保留全部者屬性。
links   #拷貝連接文件自身。
perms   #保留權限屬性。
recursive #遞歸到目錄中的文件。
compress  #傳輸過程當中壓縮傳輸。應該老是開啓,除非遇到問題。即rsync的"-z"選項。
copy_links #拷貝軟連接的文件名和其指向的文件的內容。即a指向b文件時,將在目標端生成a普通文件,但此文件中的內容是b中的內容。
dirs   #非遞歸方式傳輸目錄。
delete #目標端若是比源端文件多,則刪除這些多出來的文件,要求recursive=yes。
checksum #等價於"-c"選項,將基於文件的checksum來判斷是否同步,而不是默認的quick check
existing_only #接收端沒有的文件不一樣步。但仍會傳輸,只是臨時文件重組後不重命名而已。
partial      #等價於"--partial"選項。默認rsync在傳輸中斷時會刪除傳輸了一半的文件,指定該選項將保留這部分不完整的文件,使得下次傳輸時能夠直接從未完成的數據塊開始傳輸。
dest_port    #遠程主機ssh的鏈接端口。
rsync_opts   #指定額外的rsync選項。使用數組的方式傳遞這些選項。
rsync_path  #當不指定rsync路徑時,默認爲/usr/bin/rysnc。
rsync_timeout #指定超時時間,rsync在多久時間內尚未數據傳輸就超時退出。
verify_host #對目標主機進行ssh的host key驗證。

演示:
將本地/tmp目錄同步到10.1.210.51/tmp/目錄下
[root@app52 tmp]# ansible 10.1.210.51 -m synchronize -a 'src=/tmp dest=/tmp archive=yes'
10.1.210.51 | CHANGED => {
    "changed": true, 
    "cmd": "/usr/bin/rsync --delay-updates -F --compress --archive --rsh=/usr/bin/ssh -S none -o Port=22 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null --out-format=<<CHANGED>>%i %n%L /tmp root@10.1.210.51:/tmp", 
    "msg": "cd+++++++++ tmp/\n<f+++++++++ tmp/ansible.log\n<f+++++++++ tmp/yum_save_tx.2019-03-11.11-15.DZcIkr.yumtx\n<f+++++++++ tmp/yum_save_tx.2019-03-11.11-19.Qc5Kc3.yumtx\ncd+++++++++ tmp/.ICE-unix/\ncd+++++++++ tmp/.Test-unix/\ncd+++++++++ tmp/.X11-unix/\ncd+++++++++ tmp/.XIM-unix/\ncd+++++++++ tmp/.font-unix/\ncd+++++++++ tmp/ansible_synchronize_payload_EWJueH/\n<f+++++++++ tmp/ansible_synchronize_payload_EWJueH/__main__.py\n<f+++++++++ tmp/ansible_synchronize_payload_EWJueH/__main__.pyc\n<f+++++++++ tmp/ansible_synchronize_payload_EWJueH/ansible_synchronize_payload.zip\ncd+++++++++ tmp/systemd-private-7f85d6b12aa643b4bc7c7563e118eb6f-chronyd.service-v9nL5T/\ncd+++++++++ tmp/systemd-private-7f85d6b12aa643b4bc7c7563e118eb6f-chronyd.service-v9nL5T/tmp/\n", 
    "rc": 0, 
    "stdout_lines": [
        "cd+++++++++ tmp/", 
        "<f+++++++++ tmp/ansible.log", 
        "<f+++++++++ tmp/yum_save_tx.2019-03-11.11-15.DZcIkr.yumtx", 
        "<f+++++++++ tmp/yum_save_tx.2019-03-11.11-19.Qc5Kc3.yumtx", 
        "cd+++++++++ tmp/.ICE-unix/", 
        "cd+++++++++ tmp/.Test-unix/", 
        "cd+++++++++ tmp/.X11-unix/",

14.信息採集setup模塊

  setup模塊用於手機遠程主機的設備信息,包括操做系統版本、CPU、IP地址、內存等重要信息。默認狀況下,當ansible執行playbook時會先使用該模塊收集遠程主機信息,可經過gather_facts :False參數來指定不收集facts信息來加快playbook運行速度。經常使用參數:

filter #過濾收集的主機信息,支持通配符
gather_subset #收集指定類型的信息,可選的有all(全部)、min(精簡)、hardware(硬件)、network(網絡)等,多個使用逗號隔開,可使用操做符號!,表明去反
gather_timeout #設置收集超時時間

演示:
收集主機信息,並存放在本地
[root@app52 action]# ansible test -m setup --tree /tmp/facts

#保存形式是每個IP一個文件
[root@app52 action]# ls /tmp/facts/
10.1.210.32  10.1.210.33  10.1.210.51  10.1.210.53

#查看信息
[root@app52 action]# cat /tmp/facts/10.1.210.32 
{"ansible_facts": {"ansible_all_ipv4_addresses": ["10.0.0.125", "10.0.0.1", 「10.0.0...

過濾收集的信息

[root@app52 action]#  ansible 10.1.210.51 -m setup -a 'filter=ansible_*_mb'   
10.1.210.51 | SUCCESS => {
    "ansible_facts": {
        "ansible_memfree_mb": 218, 
        "ansible_memory_mb": {
            "nocache": {
                "free": 7407, 
                "used": 415
            }, 
            "real": {
                "free": 218, 
                "total": 7822, 
                "used": 7604
            }, 
            "swap": {
                "cached": 3, 
                "free": 8043, 
                "total": 8063, 
                "used": 20
            }
        }, 
        "ansible_memtotal_mb": 7822, 
        "ansible_swapfree_mb": 8043, 
        "ansible_swaptotal_mb": 8063
    }, 
    "changed": false
}

收集指定類型的信息,這裏只收集硬件和網絡的信息:

[root@app52 action]# ansible 10.1.210.51 -m setup -a 'gather_subset=network,hardware' |less
10.1.210.51 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "10.1.210.51", 
            "172.17.0.1"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80::1caa:6cff:fe84:e466", 
            "fe80::7828:2fff:fec8:5251", 
            "fe80::38ab:99ff:fe54:dd71", 
            "fe80::1496:77ff:fe7d:ee8b", 
            "fe80::d80d:90ff:fe2b:1c3f", 
            "fe80::dbc9:8e18:ea5e:fc02", 
            "fe80::42:31ff:febb:2858", 
            "fe80::60b8:daff:fe5f:356d", 
            "fe80::7083:f1ff:fe03:78d3"
        ], 
        "ansible_apparmor": {
            "status": "disabled"
        }, 
        "ansible_architecture": "x86_64", 
        "ansible_bios_date": "04/05/2016", 
        "ansible_bios_version": "6.00", 
        "ansible_cmdline": {
            "BOOT_IMAGE": "/vmlinuz-3.10.0-693.el7.x86_64", 
            "LANG": "zh_CN.UTF-8",

 

總結

  本文詳細了介紹了ansible的基本使用方法,並將經常使用模塊也作了一一介紹,這些模塊涵蓋了平常運維操做的大部分操做,不難發現經過ansible批量操做主機很是的方便,可是也具備必定的危險性好比一旦操做失誤將影響大批主機,使用時候應該當心。此外,當有一些複雜的運維操做時(好比源碼安裝nginx、mysql等),ansible-doc模式仍是有侷限性,而ansible爲咱們提供了playbook以及role管理,讓這複雜操做都變得簡單和有條理,下一篇文章將介紹playbook和role的使用。

相關文章
相關標籤/搜索