是基於python語言開發的自動化軟件工具node
是基於SSH遠程管理服務實現遠程主機批量管理python
1) 提升工做的效率linux
2) 提升工做準確度web
3) 減小維護的成本正則表達式
4) 減小重複性工做shell
1) 能夠實現批量系統操做配置vim
2) 能夠實現批量軟件服務部署windows
3) 能夠實現批量文件數據分發bash
4) 能夠實現批量系統信息收集服務器
管理端不須要啓動服務程序(no server)
管理端不須要編寫配置文件(/etc/ansible/ansible.cfg)
受控端不須要安裝軟件程序(libselinux-python)
被管理端selinux服務沒有關閉---影響ansible軟件的管理
libselinux-python讓selinux開啓的狀態也可使用ansible程序
受控端不須要啓動服務程序(no agent)
服務程序管理操做模塊衆多(module)
利用劇本編寫來實現自動化(playbook)
[root@m01 ~]# yum -y install ansible [root@m01 ~]# rpm -qc ansible /etc/ansible/ansible.cfg --ansible服務配置文件 /etc/ansible/hosts --主機清單文件 /etc/ansible/roles ---角色目錄
[root@m01 ansible]# vim /etc/ansible/hosts [all] 172.16.1.31 172.16.1.41 172.16.1.7 [backup] 172.16.1.41 [nfs] 172.16.1.31 [web] 172.16.1.7
[root@m01 ansible]# ansible all -a "hostname" 172.16.1.41 | CHANGED | rc=0 >> backup 172.16.1.7 | CHANGED | rc=0 >> web01 172.16.1.31 | CHANGED | rc=0 >> nfs [root@m01 ansible]#
1.主機支持主機名通配以及正則表達式,例如 web[1:3].oldboy.com 表明三臺主機
2.主機支持基於非標準的 ssh 端口,例如 web1.oldboy.com:6666
3.主機支持指定變量,可對個別主機的特殊配置,如登錄用戶,密碼
4.主機組支持指定變量[group_name:vars],同時支持嵌套組[game:children]
#主機組 [root@m01 ~]# cat /etc/ansible/hosts [all] 172.16.1.31 172.16.1.41 #主機+端口+密碼 [all] 172.16.1.31 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456' 172.16.1.41 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456' #對整個主機組都生效的變量 [all:vars] ansible_ssh_pass='123456'
command – Execute commands on targets 在一個遠程主機上執行一個命令
應用場景:
相似shell,可是隻能執行簡單的命令,複雜的命令和有些符號並不能識別,用的比較少
01.查看主機名,能夠執行成功
[root@m01 ~]# ansible all -m ping 172.16.1.41 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 172.16.1.31 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }
02.使用awk拼接查看主機IP執行失敗
[root@m01 ansible]# ansible all -m command -a "ifconfig eth0|grep 172" 172.16.1.7 | FAILED | rc=255 >> SIOCSIFADDR: No such device eth0|grep: ERROR while getting interface flags: No such devicenon-zero return code 172.16.1.41 | FAILED | rc=255 >> SIOCSIFADDR: No such device eth0|grep: ERROR while getting interface flags: No such devicenon-zero return code 172.16.1.31 | FAILED | rc=255 >> SIOCSIFADDR: No such device eth0|grep: ERROR while getting interface flags: No such devicenon-zero return code [root@m01 ansible]#
command – Execute shell commands on targets 在節點上執行操做
萬能模塊,全部命令均可以執行,和本地執行效果同樣
01.使用管道查詢IP地址
[root@m01 ~]# ansible all -m shell -a "ifconfig eth0|grep 10.0.1" 172.16.1.41 | CHANGED | rc=0 >> inet 10.0.1.41 netmask 255.255.255.0 broadcast 10.0.1.255 172.16.1.31 | CHANGED | rc=0 >> inet 10.0.1.31 netmask 255.255.255.0 broadcast 10.0.1.255
copy – Copy files to remote locations 將數據信息進行批量分發
01.拷貝m01的hostsname文件到其餘主機的/opt目錄下
[root@m01 ~]# ansible 172.16.1.31 -m copy -a "src=/etc/hostname dest=/opt" 172.16.1.31 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "checksum": "f434396716e2c9aed47cfde87c491cce5a2c08fa", "dest": "/opt/hostname", "gid": 0, "group": "root", "md5sum": "318d7defb693a2eb0d4f1a7a96575a57", "mode": "0644", "owner": "root", "size": 4, "src": "/root/.ansible/tmp/ansible-tmp-1563780990.63-144254987732501/source", "state": "file", "uid": 0 }
02.在傳輸文件時修改文件屬主和屬組信息及權限信息
ansible 172.16.1.31 -m copy -a "src=/root/rsync.password dest=/etc/ owner=opesn group=opesn mode=0600"
03.建立文件並直接寫入內容
ansible 172.16.1.31 -m copy -a "content='opesn' dest=/etc/rsync.password mode=0600"
05.複製目錄
src後面目錄沒有/: 將目錄自己以及目錄下面的內容都進行遠程傳輸複製
ansible 172.16.1.31 -m copy -a "src=/data dest=/data"
src後面目錄有/: 只將目錄下面的內容都進行遠程傳輸複製
ansible 172.16.1.31 -m copy -a "src=/data/ dest=/data"
參數說明:
src #推送數據的源文件信息 dest #推送數據的目標路徑 backup #對推送傳輸過去的文件,進行備份 content #直接批量在被管理端文件中添加內容 group #將本地文件推送到遠端,指定文件屬組信息 owner #將本地文件推送到遠端,指定文件屬主信息 mode #將本地文件推送到遠端,指定文件權限信息
01.建立文件夾
ansible all -m file -a "path=/root/test state=directory"
02.建立文件並更改屬性
ansible all -m file -a "path=/root/test.txt state=touch mode=777 owner=root group=root"
03.建立軟連接
ansible all -m file -a "src=/root/abc path=/root/abc_link state=link"
參數說明:
path #指定遠程主機目錄或文件信息 recurse #遞歸受權 state directory #在遠端建立目錄 touch #在遠端建立文件 link #link 或 hard 表示建立連接文件 absent #表示刪除文件或目錄 mode #設置文件或目錄權限 owner #設置文件或目錄屬主信息 group #設置文件或目錄屬組信息
script – Runs a local script on a remote node after transferring it 在傳輸遠程節點以後,在遠程節點上運行一個本地腳本
# 編寫腳本 [root@m01 ~]# mkdir -p /server/scripts [root@m01 ~]# cat /server/scripts/yum.sh #!/usr/bin/bash yum install -y iotop #在本地運行模塊,等同於在遠程執行,不須要將腳本文件進行推送目標主機執行 [root@m01 ~]# ansible oldboy -m script -a "/server/scripts/yum.sh"
01.建立一條定時任務
ansible all -m cron -a "minute=* hour=* day=* month=* weekday=* job='/bin/sh /server/scripts/test.sh'"
02.添加定時任務名字信息,防止重複
ansible all-m cron -a "name='cron01' job='/bin/sh /server/scripts/test.sh'"
03.刪除相應定時任務
ansible all -m cron -a "name='ansible cron02' minute=0 hour=0 job='/bin/sh /server/scripts/test.sh' state=absent"
04.註釋相應定時任務,使定時任務失效
ansible all -m cron -a "name='ansible cron01' minute=0 hour=0 job='/bin/sh /server/scripts/test.sh' disabled=no"
src:須要掛載的存儲設備或文件信息 path:指定目標掛載點目錄 fstype:指定掛載時的文件系統類型 state:presnet/mounted --- 進行掛載 present:不會實現當即掛載修改fstab文件,實際開機自動掛載 mounted:會實現當即掛載,而且會修改fstab文件,實際開機自動掛載 absent/umounted --- 進行卸載 absent:會實現當即卸載,而且會刪除fstab文件信息,禁止開機自動掛載 unmounted:會實現當即卸載,但不會刪除fstab文件信息
ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs state=present" ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs state=mounted" ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs state=unmounted" ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs state=absent"
01.建立用戶指定uid,gid,不建立家目錄也不容許登錄
ansible all -m user -a "name=test uid=888 group=888 shell=/sbin/nologin create_home=no"
name #指定建立的用戶名 uid #指定用戶的 uid group #指定用戶組名稱 groups #指定附加組名稱 password #給用戶添加密碼 shell #指定用戶登陸 shell create_home #是否建立家目錄
01.建立用戶組
ansible test -m group -a "name=test gid=888 state=present"
name #指定建立的組名 gid #指定組的 gid state absent #移除遠端主機的組 present #建立遠端主機的組(默認)
name #指定要安裝的軟件包名稱 state #指定使用 yum 的方法 installed, present #安裝軟件包 removed, absent #移除軟件包 latest #安裝最新軟件包
ansible test -m yum -a "name=httpd state=installed"
name # 定義要啓動服務的名稱 state # 指定服務狀態 started #啓動服務 stopped #中止服務 restarted #重啓服務 reloaded #重載服務 enabled #開機自啓
ansible oldboy -m service -a "name=nfs state=stopped enabled=yes"
01.解壓遠程服務器的壓縮包到指定目錄 建立壓縮包: cd /etc && tar zxvf /opt/sys.tar.gz etc/fstab etc/hosts 執行命令: ansible 172.16.1.31 -m unarchive -a "src=/opt/sys.tar.gz dest=/opt/ remote_src=yes"
02.把本地文件解壓到目標機器指定目錄 建立命令 cd / && tar zcvf /opt/log.tar.gz var/log/messages ansible 172.16.1.31 -m unarchive -a "src=/opt/log.tar.gz dest=/opt/"
01.壓縮單個文件
ansible 172.16.1.31 -m archive -a "path=/var/log/message dest=/tmp/log.tar.gz format=gz force_archive=true"
01.直接執行獲取主機信息
ansible 172.16.1.31 -m setup
02.只將主機某個信息打印出來
[root@m01 /server/scripts/test]# ansible 172.16.1.41 -m setup -a "filter=ansible_all_ipv4_addresses" 172.16.1.41 | SUCCESS => { "ansible_facts": { "ansible_all_ipv4_addresses": [ "172.16.1.41", "10.0.1.41" ], "discovered_interpreter_python": "/usr/bin/python" }, "changed": false }
[root@mo1 ~]# ansible-doc -l --- 列出ansible簡介 [root@mo1 ~]# ansible-doc -s fetch --- 指定一個模塊詳細說明 [root@mo1 ~]# ansible-doc fetch --- 查詢模塊在劇本中應用方法
01. 綠色信息: 查看主機信息/對主機未作改動 02. 黃色信息: 對主機數據信息作了修改 03. 紅色信息: 命令執行出錯了 04. 粉色信息: 忠告信息 05. 藍色信息: 顯示ansible命令執行的過程
1) 管理端沒有分發好主機的公鑰 2) 被管理端遠程服務出現問題SSH 3) 被管理端進程出現僵死狀況 /usr/sbin/sshd -D --- 負責創建遠程鏈接 sshd: root@pts/0 --- 用於維護遠程鏈接(windows---linux) sshd: root@notty --- 用戶維護遠程鏈接(ansible---被管理端)