devops工具-Ansible基礎

来源:https://www.cnblogs.com/wdliu/archive/2019/03/21/10572532.html
-Advertisement-
Play Games

一、Ansible介紹 簡介 Ansible使用Python語言開發,是一個配置管理型工具,與之類似的工具還有Puppet、SaltStack、chef等,預設通過SSH協議進行遠程命令執行或下發配置,無需部署任何客戶端代理軟體,可同時支持多台主機進行管理,Ansible是基於模塊工作的,本身沒有批 ...


一、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文件,退出;

二、安裝配置

Centos7安裝

方式一:yum安裝

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

查看版本

ansible --version

方式二:pip安裝

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)。

主機清單

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

[web]           #分組
10.1.210.53     #使用IP地址
10.1.210.51     
www.example.com #使用功能變數名稱

[db]
10.1.210.68

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

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的主機

三、Ansible常用命令

  ansible常用命令比較多,通常我們常用的就三個:ansible、ansible-doc、ansible-playbook。以下是相關命令以及作用:

/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用於查看模塊的使用方法,常用方式如下:

 

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

 

示例查看cron模塊參數:

ansible

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

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可得到所有執行過程信息。

三、快速開始

編寫配置文件

  前面提到了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.51、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 [email protected]
/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 '[email protected]'"
and check to make sure that only the key(s) you wanted were added.

[root@app52 ~]# ssh-copy-id [email protected]
/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就可以正常使用了,下麵介紹常用模塊。

四、常用模塊

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

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   # 修改許可權,格式可以是0644、'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": 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 概述 IOC (Inversion of Control) 控制反轉,大家應該都比較熟悉了、應該也都有用過,這裡就不具體介紹了。自己平時也有用到過IOC,但是對它的具體實現原理只有一個模糊的概念,所以決定自己手動實現一個簡單IOC。 開始 首先呢我們得知道IOC的主要作用是什麼,才能開始動手寫。IO ...
  • SecureCRT如何上傳/下載文件? 伺服器不能使用外網, 導致lrzsz軟體無法安裝時又該如何上傳/下載文件? sftp如何上傳/下載文件? 本篇文章詳細告訴你要如何解決這些問題. ...
  • 硬體配置 背景 配置如上所示的虛擬機在每天凌晨03-04時間段內發現磁碟告警。由於監控數據是概要類信息,不是快照類信息,無法排除出是否是某個或某幾個進程在這段時間消耗了大量的IO,所以在伺服器上用at命令定時去收集信息 sar -d 2和pidstat -d 2 信息 %iowait 達到50%左右 ...
  • 本篇講解如何配置php開發環境,讓你的php代碼可以正常的在網頁中運行。 準備工作 + linux centos7操作系統 + ssh軟體 + nginx php資源 想要瞭解更多關於php的內容,請訪問: + "php官網" 安裝php 本次安裝介紹兩個版本的安裝方法,一個是廣泛應用的5.x,另一 ...
  • 基本知識 串列通信按照數據傳送方向分為: 單工: 數據傳輸只支持數據在一個方向上傳輸 半雙工: 允許數據在兩個方向上傳輸,但是,在某一時刻,只允許數 據在一個方向上傳輸,它實際上是一種切換方向的單工通信; 全雙工: 允許數據同時在兩個方向上傳輸,因此,全雙工通信是兩個 單工通信方式的結合,它要求發送 ...
  • 博主裝Ubuntu18.04主要是為了用於跑深度學習,所以我們先來搞搞gcc環境 第一步:安裝多版本gcc、g++可切換 切換版本命令 根據自己想要的環境選擇 第二步:準備安裝顯卡驅動和cuda8.0等相關文件 最新cuda8.0 及其補丁 cuda_8.0.61.2_linux.run cuda_ ...
  • Linux Rsyslog日誌集中管理 一、Rsyslog簡介 ryslog 是一個快速處理收集系統日誌的程式,提供了高性能、安全功能和模塊化設計。rsyslog 是syslog 的升級版,它將多種來源輸入輸出轉換結果到目的地。 Rsyslog的傳輸方式有三種: UDP 傳輸協議 基於傳統UDP協議 ...
  • 電源 心臟,單個伺服器核心業務用雙電源,雙路(AB),集群除外。熱插拔主板 板卡介面CPU 大腦 ,運算控制Intel、AMD 。一般企業伺服器2-4顆,單顆4核。記憶體16-256G(常見32,64G),做虛擬化的宿主機,CPU4-8顆,記憶體一般48-128G,6-8個虛擬機CPU風扇 散熱BIOS... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...