一、Ansible簡介
Ansible是新出現的自動化運維工具,基於python開發,集合了眾多運維工具(puppet(ruby)、cfengine、chef、func、fabric、)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。
特性:
1. no agent:不需要在被管控主機上安裝任何軟件
2. no server: 無服務器端,使用時直接運行命令即可
3. modules in any languages: 基於模塊工作,可使用任意語言開發模塊。
4. Yaml,not code:使用yaml語言定制腳本playbook。
5. Ssh by default: 基於ssh工作。
優點:
1. 輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可。
2. 批量任務執行可以寫成腳本,而且不用分發到遠程就可以執行。
3. 使用python編寫,維護簡單,ruby語法過於復雜。
4. 支持sudo
二、Ansible的基礎架構圖
ansible core : ansible 自身核心模塊
host inventory: 主機庫,定義可管控的主機列表
connection plugins: 連接插件,一般默認基於 ssh 協議連接
modules:core modules ( 自帶模塊 ) 、 custom modules ( 自定義模塊 )
playbooks :劇本,按照所設定編排的順序執行完成安排任務
三、安裝Ansible
3.1 Ansible需要epel源來安裝
# uname -r 3.10.0-327.el7.x86_64 # cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) # yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y # yum install ansible -y
3.2 創建密鑰,並分發公鑰到所有的主機
# ssh-keygen -t rsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1 # ssh-copy-id -i .ssh/id_dsa.pub root@192.168.5.71 # ssh-copy-id -i .ssh/id_dsa.pub root@192.168.5.72
# ssh-copy-id -i .ssh/id_dsa.pub root@192.168.5.73
3.3 配置Ansible主機組清單
# vim /etc/ansible/hosts [test] 192.168.5.71 192.168.5.72 192.168.5.73 主機清單可以包含主機清單,例: [web] 192.168.5.71 192.168.5.72 [mysql] 192.168.5.73 [online:children] web mysql 也可以使用帳號密碼的方式: [test] 192.168.5.71 ansible_ssh_user=root ansible_ssh_pass=mypawd ansible_ssh_port=22
3.4 查看主機清單
# ansible test --list-hosts hosts (8): 192.168.5.71 192.168.5.72 192.168.5.73
四、Ansible ping模塊
ansible 主組組 使用模塊 ping模塊 # ansible test -m ping 192.168.5.73 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.5.72 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.5.71 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }
五、Ansible yum模塊
基於yum機制,對遠程主機管理程序包
name --- 必須參數,用於指定需要管理的軟件包,比如 nginx。
state --- 用於指定軟件包的狀態有installed、latest、absent、removed,其中 installed 與present 等效,latest 表示安裝 yum 中最新的版本,absent 和 removed 等效,表示刪除對應的軟件包。
disable_gpg_check --- 用於禁用對 rpm 包的公鑰 gpg 驗證。默認值為 no,表示不禁用驗證,設置為 yes 表示禁用驗證,即不驗證包,直接安裝。在對應的 yum 源沒有開啟 gpg 驗證的情況下,需要將此參數的值設置為 yes,否則會報錯而無法進行安裝。
enablerepo --- 用於指定安裝軟件包時臨時啟用的 yum 源。假如你想要從A源中安裝軟件,但是你不確定A源是否啟用了,你可以在安裝軟件包時將此參數的值設置為 yes,即使A源的設置是未啟用,也可以在安裝軟件包時臨時啟用A源。
disablerepo --- 用於指定安裝軟件包時臨時禁用的 yum 源。某些場景下需要此參數,比如,當多個 yum 源中同時存在要安裝的軟件包時,你可以使用此參數臨時禁用某個源,這樣設置后,在安裝軟件包時則不會從對應的源中選擇安裝包。
enablerepo 參數和 disablerepo 參數可以同時使用。
# ansible test -m yum -a 'name=net-tools state=installed'
六、Ansible service模塊
用來管理遠程主機上的服務的模塊
name --- 被管理的服務名稱(/etc/init.d)
state --- startd | stopped | restarted | reloaded 表示啟動、停止、重啟、重新加載。
enabled --- yes|no 表示要不要設定該服務開機自啟。
runleve --- 如果設定了enabled開機自動啟動,則要定義在哪些運行級別下自動啟動。
# ansible test -m service -a 'name=nginx state=started enabled=yes'
七、Ansible command模塊
執行命令模塊,不支持管道
# ansible test -m command -a 'w' 192.168.5.73 | CHANGED | rc=0 >> 16:13:01 up 2:35, 2 users, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 13:37 2:34m 0.08s 0.08s -bash root pts/0 192.168.5.55 16:13 0.00s 0.11s 0.01s w 192.168.5.72 | CHANGED | rc=0 >> 16:13:01 up 2:36, 1 user, load average: 0.08, 0.06, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.5.55 16:13 0.00s 0.11s 0.01s w 192.168.5.71 | CHANGED | rc=0 >> 16:13:01 up 2:38, 2 users, load average: 0.04, 0.08, 0.08 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 13:34 2:21m 0.73s 0.73s -bash root pts/0 192.168.5.55 16:13 0.00s 0.08s 0.00s w
# 默認使用command模板,可以不加 -m command參數 # ansible test -a 'cat /etc/hosts'
八、Ansible shell模塊
被管理端執行命令支持重定向,管道
# ansible test -m shell -a 'rpm -qa | grep nginx' # ansible test -m shell -a 'echo password1! | passwd --stdin root'
九、Ansible copy模塊
拷貝ansible管理端的文件到遠程主機的指定位置
src --- 推送數據的源文件信息
dest --- 推送數據的目標路徑
backup --- 對推送傳輸過去的文件,進行備份
content --- 直接批量在被管理端文件中添加內容
group --- 將本地文件推送到遠端,指定文件屬組信息
owner --- 將本地文件推送到遠端,指定文件屬主信息
mode --- 將本地文件推送到遠端,指定文件權限信息
remote_src ---如果是no它將在ansible主機中搜索src,如果是yes,src將是遠程/目標主機的src目錄
# ansible test -m copy -a 'src=/etc/resolv.conf dest=/etc/resolv.conf' # ansible test -m copy -a 'content="hehe" dest=/tmp/abc.txt owner=root group=root mode=644 backup=yes'
十、Ansible Scripts模塊
在本地運行模塊,等同於在遠程執行,不需要將腳本文件進行推送目標主機執行
# mkdir scripts # vim scripts/yum.sh # ansible test -m script -a '/root/scripts/yum.sh'
十一、Ansible File模塊
一般用於創建目錄和創建文件
path --- 指定遠程主機目錄或文件信息
recurse --- 遞歸授權
state ---
directory --- 在遠端創建目錄
touch --- 在遠端創建文件
link --- link或hard表示創建鏈接文件
absent --- 表示刪除文件或目錄
mode --- 設置文件或目錄權限
owner --- 設置文件或目錄屬主信息
group --- 設置文件或目錄屬組信息
# 在遠端創建/backup目錄 # ansible test -m file -a 'path=/backup state=directory' 192.168.5.72 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "gid": 0, "group": "root", "mode": "0755", "owner": "root", "path": "/backup", "size": 6, "state": "directory", "uid": 0 } ...... # ansible test -a 'ls -ld /backup' 192.168.5.72 | CHANGED | rc=0 >> drwxr-xr-x 2 root root 6 Jul 11 09:52 /backup # 創建文件,默認touch的權限就是root和644,但是如果文件夾存在則不會創建,然后權限不會變成你想要的。 # ansible test -m file -a 'path=/tmp/connie state=touch mode=644 owner=root group=root' 192.168.5.73 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "dest": "/tmp/connie", "gid": 0, "group": "root", "mode": "0644", "owner": "root", "size": 0, "state": "file", "uid": 0 } # 遞歸修改權限,將子目錄及文件一並修改 # ansible test -m file -a 'path=/backup state=directory owner=root group=root recurse=yes'
# 創建軟鏈接
# ansible test -m file -a 'src=/usr/local/mysql-5.6.32 path=/usr/local/mysql state=link'
十二、Ansible Group模塊
用來創建用戶組
name --- 指定創建的組名
gid --- 指定組的gid
state
absent --- 移除遠端主機的組
present --- 創建遠端主機的組(默認)
# 創建組指定GID # ansible test -m group -a 'name=connie gid=1981'
十三、Ansible User模塊
創建指定的用戶
uid --- 指定用戶的uid
group --- 指定用戶組名稱,默認為空
groups --- 指定附加組名稱
password --- 給用戶添加密碼
shell --- 指定用戶登錄shell
create_home --- 是否創建家目錄
# 創建connie用戶並加入用戶組connie 設置UID為1981,禁止登錄,不創建家目錄 # ansible test -m user -a 'name=connie group=connie uid=1981 shell=/sbin/nologin create_home=no' 192.168.5.72 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "comment": "", "create_home": false, "group": 1981, "home": "/home/connie", "name": "connie", "shell": "/sbin/nologin", "state": "present", "system": false, "uid": 1981 } ...... # 創建加密的登錄用戶,password參數必須要是經過加密的字符串。-1是MD5加密 # echo 'linzfn' | openssl passwd -1 -stdin $1$FNGUGf3H$5rfXpwXqlkL9HDC88uWRA1 # ansible test -m user -a 'name=leon password="$1$FNGUGf3H$5rfXpwXqlkL9HDC88uWRA1"' 192.168.5.72 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "comment": "", "create_home": true, "group": 1982, "home": "/home/leon", "name": "leon", "password": "NOT_LOGGING_PASSWORD", "shell": "/bin/bash", "state": "present", "system": false, "uid": 1982 }
十四、Ansible Cron模塊
使用cront服務,如果填寫的時候不寫分時日月周,則默認都是'*'
# 設置定時任務注釋信息,防止重復,name設定 # ansible test -m cron -a 'name="ntpdate" minute=*/5 hour=* month=* weekday=* job="/usr/sbin/ntpdate time1.aliyun.com"' 192.168.5.72 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "envs": [], "jobs": [ "ntpdate" ] } # 登錄192.168.5.72查看定時任務 # crontab -l #Ansible: ntpdate */5 * * * * /usr/sbin/ntpdate time1.aliyun.com # 按名稱刪除定時任務 # ansible test -m cron -a 'name="ntpdate" state=absent' # 注釋相應定時任務,使定時任務失效 # ansible test -m cron -a 'name="ntpdate" minute=*/5 hour=* month=* weekday=* job="/usr/sbin/ntpdate time1.aliyun.com" disabled=yes'
十五、Ansible Mount模塊
present --- 開機掛載,僅將掛載配置寫入/etc/fstab
mounted --- 掛載設備,並將配置寫入/etc/fstab
unmounted --- 卸載設備,不會清除/etc/fstab寫入的配置
absent --- 卸載設備,會清理/etc/fstab寫入的配置
# 掛載192.168.5.80:/data目錄到test組中的主機 # ansible test -m mount -a "src=192.168.5.80:/data path=/data fstype=nfs opts=defaults state=mounted" # 卸載,會直接刪除/data目錄,掛載的時候也不需要創建目標的/data目錄 # ansible test -m mount -a "src=192.168.5.80:/data path=/data fstype=nfs opts=defaults state=absent"