一、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操作的配置文件。
- 載入自己的配置文件,預設/etc/ansible/ansible.cfg;
- 查找對應的主機配置文件,找到要執行的主機或者組;
- 載入自己對應的模塊文件,如 command;
- 通過ansible將模塊或命令生成對應的臨時py文件(python腳本), 並將該文件傳輸至遠程伺服器;
- 對應執行用戶的家目錄的$HOME/.ansible/tmp/ansible-tmp-數字/XXX.PY文件,給文件 +x 執行許可權;
- 執行並返回結果;
- 刪除臨時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":