1、Ansible 概述
一、Ansible 特色
-
Ansible 基於 Python 開發,運維工程師對其二次開發相對比較容易; -
Ansible 豐富的內置模塊,幾乎能夠知足一切要求; -
管理模式很是簡單,一條命令能夠影響上千臺主機; -
無客戶端模式,底層經過 SSH 通訊; -
Ansible發佈後,也陸續被 AWS、Google Cloud Platform、Microsoft Azure、Cisco、HP、VMware、Twitter 等大公司接納並投入使用;
2、Ansible的角色
-
使用者:如何使用 Ansible 實現自動化運維? -
Ansible 工具集:Ansible 能夠實現的功能? -
做用對象:Ansible 能夠影響哪些主機?
一、使用者
-
CMDB:CMDB 存儲和管理者企業IT架構中的各項配置信息,是構建 ITIL 項目的核心工具,運維人員能夠組合 CMDB 和 Ansible,經過 CMDB 直接下發指令調用Ansible 工具集完成操做者所但願達到的目標; -
PUBLIC/PRIVATE 方式:Ansible 除了豐富的內置模塊外,同時還提供豐富的 API語言接口,如PHP、Python、PERL 等多種流行語言,基於 PUBLIC/PRIVATE,Ansible 以 API 調用的方式運行; -
Ad-Hoc 命令集:Users直接經過Ad-Hoc命令集調用Ansible工具集來完成任務; -
Playbooks:Users 預先編寫好 Ansible Playbooks,經過執行 -
Playbooks 中預先編排好的任務集,按序執行任務;
![](http://static.javashuo.com/static/loading.gif)
二、Ansible 工具集
Ansible Playbooks:任務腳本,編排定義Ansible任務及的配置文件,由Ansible按序依次執行,一般是JSON格式的YML文件;python
Inventory:Ansible 管理主機清單;mysql
Modules:Ansible 執行命令功能模塊,多數爲內置的核心模塊,也可自定義;web
Plugins:模塊功能的補充,如鏈接類型插件、循環插件、變量插件、過濾插件等,該功能不太經常使用;sql
API:供第三方程序調用的應用程序編程接口;shell
Ansible:該部分圖中表現得不太明顯,組合 Inventory、API、Modules、Plugins能夠理解爲是 Ansible 命令工具,其爲核心執行工具;數據庫
三、做用對象
3、Ansible的配置
一、Ansible安裝
1)經過YUM安裝Ansible
[root@centos01 ~]# cd /mnt/ansiblerepo/ansiblerepo/repodata/
[root@centos01 ansiblerepo]# vim /etc/yum.repos.d/local.repo
[local]
name=centos
baseurl=file:///mnt/ansiblerepo/ansiblerepo <!--修改yum路徑-->
enabled=1
gpgcheck=0
[root@centos01 ~]# yum -y install ansible
<!--安裝Ansible自動化運維工具-->
2)驗證安裝結果
[root@centos01 ~]# ansible --version
<!--若是命令能夠正常執行,則表示Ansible工具安裝成功-->
ansible 2.3.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
python version = 2.7.5 (default, Nov 6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
3)建立 SSH 免交互登陸
[root@centos01 ~]# 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鍵表示無密碼-->
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:cJz6NRTrvMDxX+Jpce6LRnWI3vVEl/zvARL7D10q9WY root@centos01
The key's randomart image is:
+---[RSA 2048]----+
| . . .|
| . . + oo|
| . = o o. oo|
| = * o..+ *|
| . S *.=+=*+|
| . o =+XooE|
| . ..=.++.|
| ..o ..|
| .. o. |
+----[SHA256]-----+
[root@centos01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.100.20 <!--複製公鑰到遠端192.168.100.20-->
[root@centos01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.100.30 <!--複製公鑰到遠端192.168.100.30-->
二、Ansible 配置
-i
或—inventory-file
來指定 Inventory。
[root@centos01 ~]# ansible -i /etc/ansible/hosts web -m ping
[root@centos01 ~]# ansible web -m ping
[root@centos01 ~]# vim /etc/ansible/hosts
............ <!--此處省略部份內容-->
[web]
192.168.100.20
192.168.100.30
[test]
www.benet.com:222 <!--經過222端口管理設備-->
[mail]
yj1.kgc.cn
yj[2:5].kgc.cn
<!--[2:5]表示2~5之間的全部數字,即表示yj2.kgc.cn、yj3.kgc.cn……的全部主機-->
[root@centos01 ~]# ansible web -m command -a "systemctl status httpd" --limit "192.168.100.20"
192.168.100.20 | SUCCESS | rc=0 >>
<!--看到SUCCESS就知道成功了,因此如下內容-->
<!--若是測試httpd服務,被測試主機必然已經安裝並啓動了httpd服務-->
[root@centos01 ~]# ansible 192.168.100.20 -m command -a "systemctl status httpd"
192.168.100.20 | SUCCESS | rc=0 >>
[root@centos01 ~]# ansible 192.168.1.* -m command -a "systemctl status httpd"
192.168.100.20 | SUCCESS | rc=0 >>
....... <!--此處省略部份內容-->
192.168.100.30 | SUCCESS | rc=0 >>
....... <!--此處省略部份內容-->
<!--實驗環境,效果同樣,這裏就很少說了-->
三、Ansible 命令
[root@centos01 ~]# ansible <!--連續按Tab鍵-->
ansible ansible-console-2 ansible-galaxy ansible-playbook-2.7 ansible-vault-2
ansible-2 ansible-console-2.7 ansible-galaxy-2 ansible-pull ansible-vault-2.7
ansible-2.7 ansible-doc ansible-galaxy-2.7 ansible-pull-2
ansible-connection ansible-doc-2 ansible-playbook ansible-pull-2.7
ansible-console ansible-doc-2.7 ansible-playbook-2 ansible-vault
1)ansible
非固化需求; 臨時一次性操做; 二次開發接口調用;
Ansible <host-pattern> [options]
-
-v(—verbose):輸出詳細的執行過程信息,能夠獲得執行過程全部信息; -
-i PATH(—inventory=PATH):指定inventory信息,默認爲/etc/ansible/hosts; -
-f NUM(—forks=NUM):併發線程數,默認爲5個線程; -
—private-key=PRIVATE_KEY_FILE:指定密鑰文件; -
-m NAME,—module-name=NAME:指定執行使用的模塊; -
-M DIRECTORY(—module-path=DIRECTORY) :指定模塊存放路徑,默認爲/usr/share/ansible; -
-a ARGUMENTS(—args=ARGUMENTS):指定模塊參數; -
-u USERNAME(—user=USERNAME):指定遠程主機以USERNAME運行命令; -
-l subset(—limit=SUBSET):限制運行主機;
[root@centos01 ~]# ansible all -f 5 -m ping
<!--調用ping模塊,all表示/etc/ansible/hosts文件中的全部主機,不用建立all分組(默認存在)-->
192.168.100.20 | SUCCESS => { <!--表示執行成功-->
"changed": false, <!--沒有對主機作出更改-->
"ping": "pong" <!--表示執行ping命令的返回結果-->
}
192.168.100.30 | SUCCESS => {
"changed": false,
"ping": "pong"
}
[root@centos01 ~]# ansible web --list <!-- --list:表示列出主機列表信息-->
hosts (2):
192.168.100.20
192.168.100.30
[root@centos01 ~]# ansible web -m command -a "df -hT"
192.168.100.30 | SUCCESS | rc=0 >>
文件系統 類型 容量 已用 可用 已用% 掛載點
/dev/mapper/cl-root xfs 17G 4.4G 13G 26% /
devtmpfs devtmpfs 897M 0 897M 0% /dev
tmpfs tmpfs 912M 84K 912M 1% /dev/shm
tmpfs tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 173M 842M 18% /boot
tmpfs tmpfs 183M 16K 183M 1% /run/user/42
tmpfs tmpfs 183M 0 183M 0% /run/user/0
192.168.100.20 | SUCCESS | rc=0 >>
文件系統 類型 容量 已用 可用 已用% 掛載點
/dev/mapper/cl-root xfs 17G 4.3G 13G 26% /
devtmpfs devtmpfs 897M 0 897M 0% /dev
tmpfs tmpfs 912M 84K 912M 1% /dev/shm
tmpfs tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 173M 842M 18% /boot
tmpfs tmpfs 183M 16K 183M 1% /run/user/42
tmpfs tmpfs 183M 0 183M 0% /run/user/0
/dev/sr0 iso9660 4.1G 4.1G 0 100% /mnt
-
紅色:表示執行過程出現異常; -
橘黃顏色:表示命令執行後目標有狀態變化; -
綠色:表示執行成功且沒有目標機器作修改;
2)Ansible-doc
ansible-doc [options] [module……]
[root@centos01 ~]#ansible-doc -l
[root@centos01 ~]# ansible-doc ping
> PING (/usr/lib/python2.7/site-packages/ansible/modules/system/ping.py)
A trivial test module, this module always returns `pong' on successful contact. It
does not make sense in playbooks, but it is useful from `/usr/bin/ansible' to verify
the ability to login and that a usable python is configured. This is NOT ICMP ping,
this is just a trivial test module.
EXAMPLES:
# Test we can logon to 'webservers' and execute python with json lib.
ansible webservers -m ping
MAINTAINERS: Ansible Core Team, Michael DeHaan
METADATA:
Status: ['stableinterface']
Supported_by: core
3)Ansible-playbook
Ansible-playbook playbook.yml
<!--playbook.yml文件要提早編寫好,建議使用絕對路徑-->
4)Ansible-console
[root@centos01 ~]# ansible-console
Welcome to the ansible console.
Type help or ? to list commands.
<!--輸入help或?獲取幫助-->
root@all (2)[f:5]$ cd web <!--使用cd命令切換主機或分組-->
root@web (2)[f:5]$ list <!--列出當前的設備-->
192.168.100.20
192.168.100.30
<!--支持Tab鍵補全,快捷鍵Ctrl+D或Ctrl+C便可退出當前的虛擬終端-->
四、Ansible模塊
1)command模塊
-
chdir:在遠程主機上運行命令前要提早進入的目錄; -
creates:在命令運行時建立一個文件,若是文件已存在,則不會執行建立任務; -
removes:在命令運行時移除一個文件,若是文件不存在,則不會執行移除任務; -
executeable:指明運行命令的shell程序;
[root@centos01 ~]# ansible web -m command -a "chdir=/ ls ./"
2)shell模塊
[root@centos01 ~]# ansible web -m shell -a "echo hello world " <!--輸出到屏幕-->
192.168.100.20 | SUCCESS | rc=0 >>
hello world
192.168.100.30 | SUCCESS | rc=0 >>
hello world
[root@centos01 ~]# ansible web -m shell -a "echo hello world > /1.txt" <!--輸出到1.txt文件中-->
192.168.100.20 | SUCCESS | rc=0 >>
192.168.100.30 | SUCCESS | rc=0 >>
3)copy模塊
-
dest:指出複製文件的目標目錄位置,使用絕對路徑。若是源是目錄,則目標也要是目錄,若是目標文件已存在,會覆蓋原有內容; -
src:指出源文件的路徑,可使用相對路徑和絕對路徑,支持直接指定目錄。若是源是目錄,則目標也要是目錄; -
mode:指出複製時,目標文件的權限,可選; -
owner:指出複製時,目標文件的屬主,可選; -
group:指出複製時目標文件的屬組,可選; -
content:指出複製到目標主機上的內容,不能和src一塊兒使用,至關於複製content指明的數據到目標文件中;
[root@centos01 ~]# ansible web -m copy -a "src=/etc/hosts
dest=/root/a1.hosts mode=777 owner=root group=root"
<!--/將本機的hosts文件複製到web組中的全部主機上存放在家目錄下的a1.hosts目錄,
權限是777,屬主是root,屬組是root-->
4)hostname模塊
name: 指明主機名;
[root@centos01 ~]# ansible 192.168.100.20 -m hostname -a "name=test"
<!--將192.168.100.20的主機名改成test,
可是192.168.100.20須要敲一下bash才生效-->
5)yum模塊
-
name:程序包名稱,能夠帶上版本號。若不指明版本,則默認爲最新版本; -
state=present|atest|absent:指明對程序包執行的操做:present代表安裝程序包,latest表示安裝最新版本的程序包,absent表示卸載程序包; -
disablerepo:在用yum安裝時,臨時禁用某個倉庫的ID; -
enablerepo:在用yum安裝時,臨時啓用某個倉庫的ID; -
conf_file:yum運行時的配置文件,而不是使用默認的配置文件; -
disable_gpg_check=yes|no:是否啓用完整性校驗功能;
[root@centos01 ~]# ansible web -m shell -a "/usr/bin/rm -rf
/etc/yum.repos.d/CentOS-*"
<!--批量化刪除web組主機的yum源-->
[root@centos01 ~]# ansible web -m shell -a "/usr/bin/mount
/dev/cdrom /mnt" <!--批量化掛載光盤-->
[WARNING]: Consider using mount module rather than running mount
192.168.100.20 | SUCCESS | rc=0 >>
mount: /dev/sr0 寫保護,將以只讀方式掛載
192.168.100.30 | SUCCESS | rc=0 >>
mount: /dev/sr0 寫保護,將以只讀方式掛載
[root@centos01 ~]# ansible web -m yum -a "name=httpd
state=present" <!--批量化安裝httpd程序-->
[root@centos01 ~]# ansible web -m shell -a "rpm -qa | grep httpd"
<!--批量化查看安裝的httpd程序包-->
[WARNING]: Consider using yum, dnf or zypper module rather than running rpm
192.168.100.20 | SUCCESS | rc=0 >>
httpd-2.4.6-67.el7.centos.x86_64
httpd-tools-2.4.6-67.el7.centos.x86_64
192.168.100.30 | SUCCESS | rc=0 >>
httpd-2.4.6-67.el7.centos.x86_64
httpd-tools-2.4.6-67.el7.centos.x86_64
[root@centos01 ~]# ansible web -m shell -a "systemctl start httpd" <!--批量啓動服務-->
[root@centos01 ~]# ansible web -m shell -a "netstat -anptu | grep httpd" <!--批量化監聽httpd服務是否啓動成功-->
192.168.100.20 | SUCCESS | rc=0 >>
tcp6 0 0 :::80 :::* LISTEN 2072/httpd
192.168.100.30 | SUCCESS | rc=0 >>
tcp6 0 0 :::80 :::* LISTEN 3098/httpd
6)service模塊
-
name:被管理的服務名稱; -
state=started|stopped|restarted:動做包含啓動,關閉或重啓; -
enable=yes|no:表示是否設置該服務開機自啓動; -
runlevel:若是設定了enabled開機自啓動,則要定義在哪些運行目標下自動啓動;
[root@centos01 ~]# ansible web -m service -a "name=httpd
enabled=yes state=restarted"
<!--設置httpd服務從新啓動和開機自動啓動-->
7)user模塊
name:必選參數,帳號名稱; state=present|absent:建立帳號或者刪除帳號,present表示建立,absent表示刪除; system=yes|no:是否爲系統帳戶; uid:用戶UID; group:用戶的基本組 groups:用戶的附加組; shell:默認使用的shell;
home:用戶的家目錄;
mve_home=yes|no:
若是設置的家目錄已經存在,是否將已存在的家目錄進行移動;
pssword:用戶的密碼,建議使用加密後的字符串;
comment:
用戶的註釋信息;
remore=yes|no:
當state=absent時,是否要刪除用戶的家目錄;
[root@centos01 ~]# ansible web -m user -a "name=user01
system=yes uid=502 group=root groups=root shell=/etc/nologin
home=/home/user01 password=pwd@123"
<!--在web組的全部主機上新建一個系統用戶,UID爲502,
屬組是root,名字是user01,密碼是pwd@123-->
4、playbook配置文件
一、執行配置文件
[root@centos01 ~]# grep -v ^# /etc/ansible/hosts | grep -v ^$ <!--查看hosts中的分組信息-->
[web1]
192.168.100.20
[web2]
192.168.100.30
[root@centos01 ~]# vim /etc/ansible/a.yml
<!--建立a.yml文件,寫入如下內容-->
---
- hosts: web1 <!--針對web1組中的操做-->
remote_user: root <!--遠端執行用戶身份爲root-->
tasks: <!--任務列表-->
- name: adduser <!--任務名稱-->
user: name=user1 state=present <!--執行user模塊,建立用戶-->
tags: <!--建立tag標籤-->
- aaa <!--tag標籤爲aaa-->
- name: addgroup <!--任務名稱-->
group: name=root system=yes <!--執行group模塊,建立組-->
tags: <!--建立tag標籤-->
- bbb <!--tag標籤爲bbb-->
- hosts: web2 <!--針對web2組中的操做-->
remote_user: root <!--遠端執行用戶身份爲root-->
tasks: <!--任務列表-->
- name: copy file to web <!--任務名稱-->
copy: src=/etc/passwd dest=/home <!--執行copy模塊,複製文件-->
tags: <!--建立tag標籤-->
- ccc <!--tag標籤爲ccc-->
...
![](http://static.javashuo.com/static/loading.gif)
hosts: 任務的目標主機,多個主機用冒號分隔,通常調用/etc/ansible/hosts中的分組信息; remote_user: 遠程主機上,運行此任務的默認身份爲root; tasks:任務,即定義的具體任務,由模塊定義的操做列表; handlers: 觸發器,相似tasks,只是在特定的條件下才會觸發的任務。 某任務的狀態在運行後爲changed時,可經過「notify」通知給相應的handlers進行觸發執行;
roles:角色,將hosts剝離出去,由tasks、handlers等所組成的一種特定的結構集合;
ansible-playbook [option] /PATH/TO/PLAYBOOK.yaml
-
—syntax-check:檢測yaml文件的語法; -
-C(—check):預測試,不會改變目標主機的任何設置; -
—list-hosts:列出yaml文件影響的主機列表; -
—list-tasks:列出yaml文件的任務列表; -
—list-tags:列出yaml文件中的標籤; -
-t TAGS(—tags=TAGS):表示只執行指定標籤的任務; -
—skip-tags=SKIP_TAGS:表示除了指定標籤的任務,執行其餘任務; -
—start-at-task=START_AT:從指定的任務開始往下運行;
[root@centos01 ~]# ansible-playbook --syntax-check /etc/ansible/a.yml <!--語法檢測-->
playbook: /etc/ansible/a.yml <!--表示沒有報錯-->
[root@centos01 ~]# ansible-playbook -C /etc/ansible/a.yml
<!--對a.yml進行預測試-->
.................<!--省略部份內容-->
192.168.100.20 : ok=3 changed=1 unreachable=0 failed=0
192.168.100.30 : ok=2 changed=1 unreachable=0 failed=0
<!--返回結果表示沒有錯誤,所有能夠執行成功。-->
[root@centos01 ~]# ansible-playbook --list-hosts /etc/ansible/a.yml
<!--列出a.yml文件中的主機-->
[root@centos01 ~]# ansible-playbook --list-tasks /etc/ansible/a.yml
<!--列出任務-->
[root@centos01 ~]# ansible-playbook --list-tags /etc/ansible/a.yml <!--列出標籤-->
[root@centos01 ~]# ansible-playbook /etc/ansible/a.yml <!--執行任務-->
[root@centos01 ~]# ssh 192.168.100.20 tail -1 /etc/passwd <!--確認執行結果-->
user1:x:1001:1001::/home/user1:/bin/bash
[root@centos01 ~]# ssh 192.168.100.30 ls -ld /home/passwd
-rw-r--r--. 1 root root 2342 7月 23 16:06 /home/passwd
<!--通常狀況先執行「-C」命令進行預測試,沒有問題後再執行.yml文件。-->
二、觸發器
handlers是Ansible提供的條件機制之一。編程
handlers和task很相似,可是它只在被task通知的時候纔會觸發執行。json
handlers只會在全部任務執行完成後執行。vim
並且即便被通知了不少次,它也只會執行一次。centos
handlers按照定義的順序依次執行。
[root@centos01 ~]# ssh 192.168.100.20 netstat -anpt | grep 80 <!--查詢100.20主機監聽的端口-->
tcp6 0 0 :::80 :::* LISTEN 94858/httpd
<!--能夠看到是監聽80端口,如今經過腳本改成8080端口,並使其生效。-->
[root@centos01 ~]# vim /etc/ansible/httpd.yml
<!--編輯httpd.yml文件,寫入如下內容-->
---
- hosts: web1
remote_user: root
tasks:
- name: change port
command: sed -i 's/Listen\ 80/Listen\ 8080/g' /etc/httpd/conf/httpd.conf
notify: <!--配置觸發條件-->
- restart httpd server <!--完成該任務後調用名爲「restart httpd server」的觸發器-->
handlers: <!--配置觸發器-->
- name: restart httpd server <!--指定觸發器名字,要和上面「notify」指定的觸發器名字同樣-->
service: name=httpd state=restarted<!--觸發任務爲重啓httpd服務-->
...
<!--編寫完成後,保存退出便可-->
[root@centos01 ~]# ansible-playbook -C /etc/ansible/httpd.yml <!--進行預測試-->
[root@centos01 ~]# ansible-playbook /etc/ansible/httpd.yml <!--執行腳本-->
[root@centos01 ~]# ssh 192.168.100.20 netstat -anpt | grep 8080 <!--遠端主機已經運行8080端口-->
tcp6 0 0 :::8080 :::* LISTEN 103594/httpd
三、角色
![](http://static.javashuo.com/static/loading.gif)
-
mariadb:mysql角色; -
Apache:httpd角色; -
Nginx:Nginx角色;
-
files:存放由copy或script等模塊調用的文件; -
templates:存放template模塊查找所須要的模板文件的目錄,如mysql配置文件模板; -
tasks:任務存放的目錄; -
handlers:存放相關觸發執行的目錄; -
vars:變量存放的目錄; -
meta:用於存放此角色元數據; -
default:默認變量存放的目錄,文件中定義了此角色使用的默認變量;
- hosts: web
remote_user: root
roles:
- mysql <!--調用角色名-->
- httpd <!--調用角色名-->
要求被管理主機上自動安裝mariadb,安裝完成後上傳提早準備好的配置文件至遠端主機,重啓服務,而後新建testdb數據庫,並容許test用戶對其擁有全部權限。
被管理主機配置yum倉庫,自行配置,若被管理端能夠鏈接互聯網,那麼直接將yum倉庫指向互聯網便可。
來源:https://blog.51cto.com/14156658/2461907
本文分享自微信公衆號 - 追馬Linux(zhuima_k8s)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。