# mkdir /etc/ansible # cd /etc/ansible # vi ansible.cfg #添加如下內容 [defaults] # some basic default values... hostfile = /etc/ansible/hosts library = /usr/share/ansible remote_tmp = $HOME/.ansible/tmp pattern = * forks = 5 poll_interval = 15 sudo_user = root #ask_sudo_pass = True #ask_pass = True transport = smart remote_port = 33891 host_key_checking = False log_path = /var/log/ansible.log
部分配置項說明:
hostfile=/etc/ansible/hosts #指定默認hosts配置的位置
host_key_checking = False #不進行host_key檢查,省去目標key發生變化時輸入(yes/no)的步驟
ask_pass=True # 每次執行ansible命令是否詢問ssh密碼
ask_sudo_pass=True # 每次執行ansible命令時是否詢問sudo密碼
log_path= /var/log/ansible.log # ansible用戶時需要:chown -R admin:admin ansible.log(筆者服務器使用admin用戶)
二、創建主機分組文件
vi hosts #支持IP和域名,支持分組,變量設置 [local] #組名稱,本機 127.0.0.1 [test] #組名稱,遠程服務器 192.168.2.216 ansible_ssh_user=admin ansible_ssh_port=33891 192.168.2.218 ansible_ssh_user=admin ansible_ssh_port=33891 192.168.2.113 ansible_ssh_user=admin ansible_ssh_port=33891
hosts文件內部支持的一些特定指令(inventory參數):
ansible_ssh_host:指定主機別名對應的真實IP,如:251ansible_ssh_host=183.60.41.251,隨后連接該主機無須指定完整IP,只需指定251就行
ansible_ssh_port:指定連接到這個主機的ssh端口,默認22
ansible_ssh_user:連接到該主機的ssh用戶
ansible_ssh_pass:連接到該主機的ssh密碼(連-k選項都省了),安全考慮還是建議使用私鑰或在命令行指定-k選項輸入
ansible_sudo_pass:sudo密碼
ansible_sudo_exe(v1.8+的新特性):sudo命令路徑
ansible_connection:連接類型,可以是local、ssh或paramiko,ansible1.2之前默認為paramiko
ansible_ssh_private_key_file:私鑰文件路徑
ansible_shell_type:目標系統的shell類型,默認為sh,如果設置csh/fish,那么命令需要遵循它們語法
ansible_python_interpreter:python解釋器路徑,默認是/usr/bin/python,但是如要要連*BSD系統的話,就需要該指令修改python路徑
ansible_*_interpreter:這里的"*"可以是ruby或perl或其他語言的解釋器,作用和ansible_python_interpreter類似
三、ssh免秘鑰登陸設置
# admin用戶 $ ssh-keygen -t rsa #每台機器上執行 $ ssh-copy-id admin@192.168.2.216 $ ssh-copy-id admin@192.168.2.218 $ ssh-copy-id admin@192.168.2.113 # 使用非默認22端口,例: $ ssh-copy-id "-p 33891 192.168.2.113"
四、Ansible參數詳解
Usage:ansible <host-pattern> [options]
Options:
-m MODULE_NAME,--module-name=MODULE_NAME //要執行的模塊,默認為command
-a MODULE_ARGS,--args=MODULE_ARGS //模塊的參數
-u REMOTE_USER,--user=REMOTE_USER //ssh連接的用戶名,默認用root,ansible.cfg 中可以配置
-k,--ask-pass //提示輸入ssh登錄密碼,當使用密碼驗證登錄的時候用
-s,--sudo //sudo運行
-U SUDO_USER,--sudo-user=SUDO_USER //sudo到哪個用戶,默認為root
-K,--ask-sudo-pass //提示輸入sudo密碼,當不是NOPASSWD模式時使用
-B SECONDS,--background=SECONDS //runasynchronously,failingafterXseconds(default=N/A)
-P POLL_INTERVAL,--poll=POLL_INTERVAL //setthepollintervalifusing-B(default=15)
-C,--check //只是測試一下會改變什么內容,不會真正去執行
-c CONNECTION //連接類型(default=smart)
-f FORKS,--forks=FORKS //fork多少個進程並發處理,默認5
-i INVENTORY,--inventory-file=INVENTORY //指定hosts文件路徑,默認default=/etc/ansible/hosts
-l SUBSET,--limit=SUBSET //指定一個pattern,對<host_pattern>已經匹配的主機中再過濾一次
--list-hosts //只打印有哪些主機會執行這個playbook文件,不是實際執行該playboo
-M MODULE_PATH,--module-path=MODULE_PATH //要執行的模塊的路徑,默認為/usr/share/ansible/
-o,--one-line //壓縮輸出,摘要輸出
--private-key=PRIVATE_KEY_FILE //私鑰路徑
-T TIMEOUT,--timeout=TIMEOUT //ssh連接超時時間,默認10秒
-t TREE,--tree=TREE //日志輸出到該目錄,日志文件名會以主機名命名
-v,--verbose //verbose mode(-vvv for more,-vvvv to enable connection debugging)
基本格式:
ansible <pattern_goes_here> -m <module_name> -a <arguments>
匹配所有主機
*或者all
匹配多個組
group1:group2
在group1這個組里,但不能在group2這個組里的主機
group1:!group2
取兩個組的交集
group2:&group2
排除某一主機
ansible-playbook site.yaml --limit salt-msater
當然也可以用正則,在/etc/ansible/hosts里面去定義。如
~salt(master|minion)\.li*\.com
四、常用模塊使用
常用的模塊有:command、user、copy、cron、file、filesystem、group、hostname、mount、ping、yum、shell、service、script
ansible 默認提供了很多模塊來供我們使用。在 Linux 中,我們可以通過 ansible-doc -l 命令查看到當前 ansible 都支持哪些模塊,通過 ansible-doc -s 模塊名 又可以查看該模塊有哪些參數可以使用。
ping模塊
目的:檢查指定節點機器是否還能連通
命令:ansible test -m ping
執行效果:
command模塊
目的:在指定節點上運行nc命令,測試端口是否相通
命令:ansible test -m command -a 'nc -nz 192.168.2.213 80'
ansible默認使用的就是command模塊,所以命令可以簡寫成:
ansible test -a 'nc -nz 192.168.2.213 80'
執地效果:
shell模塊
目的:在指定節點查看進程
命令:ansible test -m shell -a 'ps -ef|grep nginx'
在這里我們使用command模塊可以嗎?不行。因為command模塊不支持管道、通配符等。
執地效果:
raw模塊
目的:在指定節點查看進程
命令:nsible test -m raw -a 'whoami'
執地效果:
command模塊不支持的特性,我們可以和shell模塊,shell模塊不支持的特性可以用raw模塊。
script模塊:
目的:在指定節點運行服務端的腳本
命令:ansible test -m script -a "/app/admin/sbin/test.sh"
先寫一個簡單腳本:
$ cat test.sh
#!/bin/bash
ps -ef|grep nginx
執行效果:
group模塊
目的:在所有節點上創建一個組名為nolinux,gid為2017的組
命令:ansible test -m group -a 'gid=2017 name=test' -s #創建用戶及組需要root權限,admin用戶具有sudo權限,因此命令后面使用-s,即使用sudo權限。
執行效果:
user模塊
目的:在指定節點上創建一個用戶名為test,組為test的用戶
命令:ansible test -m user -a 'name=test groups=test state=present' -s
執行效果:
copy模塊(文件較多情況下,效率不高)
目的:將主控方/app/admin/soft目錄推送到指定節點的/app/admin目錄下(效率太低下)
命令:ansible test -m synchronize -a 'src=/app/admin/soft dest=/app/admin/'
執行效果:
synchronize模塊
目的:將主控方/app/admin/soft目錄推送到指定節點的/app/admin目錄下(使用rsync同步文件,效率較高)
命令:ansible test -m synchronize -a 'src=/app/admin/soft dest=/app/admin/ delete=yes'
delete=yes 使兩邊的內容一樣(即以推送方為主)
compress=yes 開啟壓縮,默認為開啟
--exclude=.svn 忽略同步.svn結尾的文件
執行效果:
其它參數:
archive: 歸檔,相當於同時開啟recursive(遞歸)、links、perms、times、owner、group、-D選項都為yes ,默認該項為開啟
checksum: 跳過檢測sum值,默認關閉
compress:是否開啟壓縮
copy_links:復制鏈接文件,默認為no ,注意后面還有一個links參數
delete: 刪除不存在的文件,默認no
dest:目錄路徑
dest_port:默認目錄主機上的端口 ,默認是22,走的ssh協議
dirs:傳速目錄不進行遞歸,默認為no,即進行目錄遞歸
rsync_opts:rsync參數部分
set_remote_user:主要用於/etc/ansible/hosts中定義或默認使用的用戶與rsync使用的用戶不同的情況
mode: push或pull 模塊,push模的話,一般用於從本機向遠程主機上傳文件,pull 模式用於從遠程主機上取文件
get_url模塊
目的:將nginx的安裝包下載到指定節點的/tmp目錄下
命令:ansible test -m get_url -a 'url=http://124.202.164.11/files/3182000009C41C0C/nginx.org/download/C/nginx.org/download/nginx-1.10.3.tar.gz dest=/tmp'