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自動執行,能夠由控制主機針對多臺被管理主機同時運行多個任務。
方式一:yum安裝html
yum install epel-release -y
yum install ansible –y
查看版本python
ansible --version
方式二:pip安裝mysql
yum install python-pip
pip install ansible
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>/
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配置文件
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鏈接失敗時候的嘗試次數
[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的主機
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用於查看模塊的使用方法,經常使用方式以下:web
ansible-doc -l #獲取所有模塊的信息 ansible-doc -s MOD_NAME #獲取指定模塊的使用幫助
示例查看cron模塊參數:正則表達式
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:在主機清單定義的目標主機,可支持如下幾種方式:
示例:
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 [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.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
[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就能夠正常使用了,下面介紹經常使用模塊。
所用經常使用模塊都遵循如下語法,這裏將介紹經常使用模塊以及相關參數。
ansible <host-pattern> <-m 模塊> [-a args] [options]
該模塊用於添加或推送密鑰到遠程主機,在配置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@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
該模塊用於直接在遠程主機執行命令,但不不支持|(管道)、$、&等shell操做符,這也是和shell模塊的區別。經常使用參數:
chdir # 在執行命令以前,先切換到該目錄 executable # 切換shell來執行命令,須要使用命令的絕對路徑 free_form # 要執行的Linux指令,通常使用Ansible的-a參數代替。 creates # 文件路徑,當這個文件存在,則該命令不執行,能夠用來作判斷 removes # 文件路徑,這個文件不存在,則該命令不執行
[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
[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
文件模塊用於管理文件或目錄屬性,也能夠建立文件或者目錄。經常使用參數:
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
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~
該模塊用於從遠程主機上獲取文件到本地,經常使用參數:
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
該模塊用於軟件包的安裝,卸載、升級等。經常使用參數:
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" ] }
service模塊用於管理service服務,經常使用參數:
enabled #是否開機自啓動 name #服務名稱 arguments #提供額外的參數 runlevel #啓動級別 sleep #服務重啓的等待時間,一般指服務關閉後啓動等待的時間。 state #管理服務發生的行爲,四種行爲started(啓動)、 stopped(中止)、 restarted(重啓)、reloaded(重載)
[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
該模塊用於管理systemd所管理的服務,該模塊相似於service模塊,因爲centos7.x系統服務受systemd控制,因此ansible提供與之對應的模塊管理,經常使用參數:
daemon_reload #是否進行systemctl daemon-reload操做 enabled #設置是否服務開機自啓動 masked #是否將此unit作mask(隱藏、掩蓋)處理。mask後的unit將沒法啓動 name #服務名稱 state #service模塊,四種狀態:started、stopped、restarted、reloaded
[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",
該模塊用於管理遠程主機的用戶。經常使用參數:
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表明只有新建才修改
[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" }
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(每時)。
[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 >>
該模塊用於將本地的腳本在遠程主機上運行,使用的是遠程主機的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
該模塊用於文件或者目錄同步,實現了簡單的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驗證。
[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/",
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的使用。