文章目錄
- Ansible基本概述
- 手動運維時代(原始社會)
- 自動化運維時代
- 自動化運維工具的優勢
- Ansible的功能及優點
- Ansible的架構
- Ansible的執行流程
- 安裝Ansible
- Ansible配置文件生效順序
- Ansible inventory主機清單
- Ansible基于免秘鑰方式管理客戶端
- 小結
- Ansible-Adhoc
- ad-hoc常用模塊
- Ansible playbook
- YAML語法
Ansible基本概述
什么是Ansible?Ansible是一個自動化統一配置管理工具,自動化主要體現在Ansible集成了豐富模塊以及功能組件,可以通過一個命令完成一系列的操作,進而能減少重復性的工作和維護成本,可以提高工作效率。
手動運維時代(原始社會)
在之前,我們學習了如何安裝nginx。但是我們使用的是yum安裝的方式,在以前,運維需要規范,需要統一配置管理,我們只能使用源碼安裝方式,便于我們去管理,源碼安裝,如果是單臺還好,一會也就裝完了,如果此時,生產環境壓力驟增,需要擴展100臺web節點(源碼安裝100臺nginx)我們該如何操作?
#1.安裝依賴
yum install pcre-devel openssl-devel -y#2.進入安裝目錄
cd /usr/local/tools#3.創建nginx用戶
useradd nginx -M -s /sbin/nologin#4.解壓
tar xf nginx-1.6.3.tar.gz#5.進入nginx程序目錄
cd nginx-1.6.3#6.生成
./configure --prefix=/usr/local/nginx-1.6.3 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module#7.編譯
make#8.安裝
make install#9.做軟鏈接
ln -s /usr/local/nginx-1.6.3/ /usr/local/nginx
以上步驟還只是安裝,那還要部署代碼呢?修改配置文件?優化?啟動?那還工作個毛線啊,一天啥也不用干了,就裝nginx
吧。
自動化運維時代
只需要一條命令,搞定100臺集群
自動化運維工具的優勢
Ansible的功能及優點
1.遠程執行
批量執行遠程命令,可以對多臺主機進行遠程操作2.配置管理
批量配置軟件服務,可以進行自動化方式配置,服務的統一配置管理,和啟停3.事件驅動
通過Ansible的模塊,對服務進行不同的事件驅動
比如:
1)修改配置后重啟
2)只修改配置文件,不重啟
3)修改配置文件后,重新加載
4)遠程啟停服務管理4.管理公有云
通過API接口的方式管理公有云,不過這方面做的不如saltstack.
saltstack本身可以通過saltcloud管理各大云廠商的云平臺。5.二次開發
因為語法是Python,所以便于運維進行二次開發。6.任務編排
可以通過playbook的方式來統一管理服務,并且可以使用一條命令,實現一套架構的部署7.跨平臺,跨系統
幾乎不受到平臺和系統的限制,比如安裝apache和啟動服務在Ubuntu上安裝apache服務名字叫apache2
在CentOS上安裝apache服務名字叫httpd在CentOS6上啟動服務器使用命令:/etc/init.d/nginx start
在CentOS7上啟動服務器使用命令:systemctl start nginx
Ansible的架構
1、連接插件connection plugins用于連接主機 用來連接被管理端
2、核心模塊core modules連接主機實現操作, 它依賴于具體的模塊來做具體的事情
3、自定義模塊custom modules根據自己的需求編寫具體的模塊
4、插件plugins完成模塊功能的補充
5、劇本playbookansible的配置文件,將多個任務定義在劇本中,由ansible自動執行
6、主機清單inventor定義ansible需要操作主機的范圍
最重要的一點是 ansible是模塊化的 它所有的操作都依賴于模塊
Ansible的執行流程
1.Ansible讀取playbook劇本,劇本中會記錄對哪些主機執行哪些任務。
2.首先Ansible通過主機清單找到要執行的主機,然后調用具體的模塊。
3.其次Ansible會通過連接插件連接對應的主機并推送對應的任務列表。
4.最后被管理的主機會將Ansible發送過來的任務解析為本地Shell命令執行。
安裝Ansible
主機名 wanIP lanIP 角色
m01 10.0.0.61 172.16.1.61 Ansible控制端
web01 10.0.0.7 172.16.1.7 Ansible被控端
web02 10.0.0.8 172.16.1.8 Ansible被控端1.需要配置epel倉庫
2.安裝Ansible #注意:ansible只安裝不啟動
[root@m01 ~]#yum install -y ansibleAnsible參數:
-i #主機清單文件路徑,默認是在/etc/ansible/hosts 使用-i指定主機清單的位置
-m #使用的模塊名稱,默認使用command模塊
-a #使用的模塊參數,模塊的具體動作#3.查看Ansible版本及模塊路徑
[root@m01 ~]# ansible --version
ansible 2.7.1config file = /etc/ansible/ansible.cfgconfigured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']ansible python module location = /usr/lib/python2.7/site-packages/ansibleexecutable location = /usr/bin/ansiblepython version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)][root@m01 ~]#cat /etc/ansible/hosts
10.0.0.7 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass='1'[root@m01 ~]#ansible 10.0.0.7 -m ping #ping不通需要關閉Ansible指紋檢查
10.0.0.7 | FAILED! => {"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."
}修改主機配置文件:跳過指紋檢測
[root@m01 ~]#grep -n "host_key_checking" /etc/ansible/ansible.cfg
71:host_key_checking = False
Ansible配置文件生效順序
1. $ANSIBLE_CONCFIG
2. ./ansible.cfg
3. ~/.ansible.cfg
4. /etc/ansible/ansible.cfg
Ansible inventory主機清單
/etc/ansible/hosts 是Ansible默認主機清單文件,用于定義被管理主機的認證信息,例如:ssh登錄用戶名、密碼以及key相關信息。inventory文件中填寫需要被管理的主機與主機組信息。還可以自定義inventory主機清單的位置,使用-i指定文件位置即可。
方法一:基于ssh
[root@m01 ~]#cat /etc/ansible/hosts
10.0.0.7 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass='1'
#測試是否管理客戶端 使用:ping模塊
[root@m01 ~]#ansible 10.0.0.7 -m ping
10.0.0.7 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"
}方法二:使用主機方式,使用別名方式管理客戶端
[root@m01 ~]#cat /etc/ansible/hosts
web02 ansible_ssh_host=10.0.0.8 ansible_ssh_pass='1'[root@m01 ~]#ansible web02 -m ping
web02 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"
}
[root@m01 ~]#cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6方法三:使用區間的方式管理客戶端
[root@m01 ~]#vim /etc/ansible/hosts
10.0.0.[7:8] ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass='1'
#表示客戶端包含 :10.0.0.7和10.0.0.8 [root@m01 ~]#ansible 10.0.0.8 -m ping
10.0.0.8 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"
}方法四:設置小組方式:[小組名稱]
[root@m01 ~]#cat /etc/ansible/hosts
[webs]
web01 ansible_ssh_host=10.0.0.7 ansible_ssh_pass='1'
web02 ansible_ssh_host=10.0.0.8 ansible_ssh_pass='1'
[root@m01 ~]#
[root@m01 ~]#ansible webs -m ping
web01 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"
}
web02 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"
}#設置多個小組:
[root@m01 ~]#vim /etc/ansible/hosts
[webs]
web01 ansible_ssh_host=10.0.0.7 ansible_ssh_pass='1'
web02 ansible_ssh_host=10.0.0.8 ansible_ssh_pass='1'[dbs]
10.0.0.51 ansible_ssh_pass=1[root@m01 ~]#ansible dbs -m ping
10.0.0.51 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"
}#查看組內成員列表
[root@m01 ~]#ansible webs -m ping --list-hostshosts (2):web01web02
Ansible基于免秘鑰方式管理客戶端
1.生成秘鑰對
[root@m01 ~]#ssh-keygen
2.拷貝到客戶端
[root@m01 ~]#ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.7
[root@m01 ~]#ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.8
3.配置主機清單
[root@m01 ~]#cat /etc/ansible/hosts
10.0.0.7
10.0.0.8
測試:
[root@m01 ~]#ansible 10.0.0.7 -m ping
10.0.0.7 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"
}
[root@m01 ~]#ansible 10.0.0.8 -m ping
10.0.0.8 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"
}使用all表示所有客戶端:
[root@m01 ~]#ansible all -m ping
10.0.0.8 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"
}
10.0.0.7 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"
}#設置小組:
[root@m01 ~]#vim /etc/ansible/hosts
[webs]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8[root@m01 ~]#ansible webs -m ping
web02 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"
}
web01 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"
}#設置包含多個組:
[root@m01 ~]#vim /etc/ansible/hosts
[webs]
web01 ansible_ssh_host=10.0.0.7[dbs]
web02 ansible_ssh_host=10.0.0.8[lnmp:children]
webs
dbs[root@m01 ~]#ansible webs -m ping
web01 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"
}
[root@m01 ~]#ansible dbs -m ping
web02 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"
}
小結
inventory 主機清單
基于ssh
1)基于用戶名+端口+密碼
2)基于免秘鑰vim /etc/ansible/hosts
10.0.0.7 #指定單臺主機
web01 ansible_ssh_host=10.0.0.7 #使用別名
[webs] #指定小組
10.0.0.7
10.0.0.8[dbs] #指定多個組
10.0.0.51
10.0.0.31[lnmp:children]
webs
dbs
Ansible-Adhoc
什么是ad-hoc?
ad-hoc簡而言之就是“臨時命令”,執行完即結束,并不會保存。ad-hoc模式的使用場景
比如在多臺機器上查看某個進程是否啟動,或拷貝指定文件到本地,等等··
ad-hoc常用模塊
command #執行shell命令(不支持管道等特殊字符)
shell #執行shell命令
scripts #執行shell腳本
yum_repository #配置yum倉庫
yum #安裝軟件
copy #變更配置文件
file #建立目錄或者文件
service #啟動與停止服務
mount #掛載設備
cron #定時任務
get_url #下載軟件
firewalld #防火墻
selinux #selinux
第一個模塊:command模塊 不支持管道,不建議使用
第二個模塊:shell 在不知道使用什么模塊的時候使用shell模塊
第三個模塊:scripts 執行腳本時候
第四個模塊:yum:
yum:name:nfs-utils 軟件的名稱state:動作present:安裝absent:卸載latest:最新版本
安裝nfs-utils
1.開啟10.0.0.31
2.配置Ansible-host
[root@m01 ~]#cat /etc/ansible/hosts
nfs ansible_ssh_host=10.0.0.31
3.設置免秘鑰
[root@m01 ~]#ssh-keygen
[root@m01 ~]#ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.31[root@m01 ~]#ansible nfs -m yum -a 'name=nfs-utils state=present'
nfs | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "msg": "", "rc": 0, "results": ["1:nfs-utils-1.3.0-0.68.el7.2.x86_64 providing nfs-utils is already installed"]
}卸載nfs-utils
[root@m01 ~]#ansible nfs -m yum -a 'name=nfs-utils state=absent'配置nfs-utils啟動nfs-utils#查看Ansible幫助文檔:
[root@m01 ~]#ansible-doc yum
/EXA創建文件file模塊:
[root@m01 ~]#cat /etc/ansible/hosts
nfs ansible_ssh_host=10.0.0.31
[webs]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8[root@m01 ~]#ansible webs -m file -a 'path=/root/ansible.txt state=touch'
[root@m01 ~]#ansible webs -m file -a 'path=/root/ansible state=directory'
[root@m01 ~]#ansible webs -m file -a 'path=/root/oldboy state=directory mode=055 owner=root group=root'
Ansible playbook
playbook即劇本,兵書之意,playbook是由以下部分組成的
play:定義的是主機的角色。(主角還是配角,找哪個明星)
task:定義的是具體執行的任務(角色的臺詞和動作)
playbook:由一個或者多個play(角色)組成,一個play(角色)可以包含多個task(臺詞動作)簡單理解為:使用不同的模塊完成一件事情
在Ansible中“劇本文件”是yml結尾的文件
在saltStack中“劇本文件”是以sls結尾的文件
但是語法,使用的都是yaml語法
playbook 功能比ad-hoc更全,是對ad-hoc的一種編排
playbook 能很好的控制先后執行順序,以及依賴關系
playbook 語法展現更加直觀
playbook 可以持久使用,ad-hoc 無法持久使用
YAML語法
語法 | 描述 |
---|---|
縮進 | YAML使用固定的縮進風格表示層級結構,每個縮進由兩個空格組成, 不能使用TAB |
冒號 | 以冒號結尾的除外,其他所有冒號后面所有必須有空格 |
短橫線 | 表示列表項,使用一個短橫杠加一個空格,多個項使用同樣的縮進級別作為同一列表 |
yum:name: vsftpdstate: present1.環境準備:
10.0.0.31
2.配置Ansible-host
[root@m01 ~]#cat /etc/ansible/hosts
nfs ansible_ssh_host=10.0.0.31
3.設置免秘鑰
[root@m01 ~]#ssh-keygen
[root@m01 ~]#ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.31
[root@m01 ~]#mkdir -p ansible
[root@m01 ansible]#cat nfs.yml
- hosts: nfs #操作的客戶端tasks: #定義tasks- name: Install NFS Serveryum: #yum模塊安裝nfs-utils服務name: nfs-utilsstate: present- name: Configure NFS Server #配置nfs服務copy:content: "/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)"dest: /etc/exports- name: Configure group www #添加www用戶、用戶組group:name: wwwgid: 666state: present- name: Add user wwwuser:name: wwwuid: 666group: wwwshell: /sbin/nologincreate_home: false- name: Create /data #創建必要的數據file:path: /datastate: directorygroup: wwwowner: www- name: Start NFS #啟動nfs服務systemd: name: nfsstate: startedenabled: yes[root@m01 ansible]#ansible-playbook --syntax-check nfs.yml #檢測語法是否正確,什么都不顯示表示沒問題。#執行play-book
[root@m01 ansible]#ansible-playbook nfs.yml yam模塊:
yum:name: 指定包的名稱(nfs-utils)state: 動作 [present|absent|lastest]copy模塊:
copy:src: 源文件(在Ansible服務器)dest: 拷貝到客戶端的具體位置owner: 屬主group: 屬組content: “字符串”
案例:將61的exports文件拷貝到31的家目錄 屬主屬組為bin 權限為600
- name: Configure NFS Servercopy:src: exportsdest: /root/exportsowner: bingroup: binmode: 0600
案例:將content中的字符串定向到目標位置- name: Configure NFS Servercopy:content: "/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)"dest: /etc/exportsgroup模塊:
group:name: #組名稱gid: #組idstate: #動作創建|刪除[present|absent]user模塊:
user:name: #用戶名稱uid: #UIDgroup: #屬組[GID|組名稱]shell: #指定解釋器[/bin/bash|/sbin/nologin]create_home: #是否創建家目錄 false true案例:創建www用戶和用戶組- name: Configure group wwwgroup:name: wwwgid: 666state: present- name: Add user wwwuser:name: wwwuid: 666group: wwwshell: /sbin/nologincreate_home: falseflie模塊:
file:path:創建的位置state:touch 創建文件 directory 創建目錄 absent 刪除文件或目錄group: 屬組owner: 屬主mode: 權限recurse: 遞歸授權案例:[root@m01 ansible]#cat test.yml
- hosts: web01tasks:- name: testfile:path: /root/teststate: directoryowner: wwwgroup: wwwrecurse: yes- name: filefile: path: /root/test/test.txtstate: touchsystemd模塊:
systemd:name: nfs #服務名稱state: started #啟動 停止 重加載[started|stoped|reloaded]enabled: yes #是否開機自啟 [yes|no]案例:- name: Start NFSsystemd:name: nfsstate: startedenabled: yes
mount模塊:
mount:path: /mnt #掛載到本地的位置src: 172.16.1.31:/data #掛載的路徑fstype: nfs #掛載類型state: present #掛載并寫入fstabcrontab模塊:
cron: name: "ntpdate" #描述信息minute: "*/5" #每隔5分鐘job: "ntpdate ntp1.aliyun.com &> /dev/null" #具體執行的命令state: present #動作,創建present 刪除absentunarchive模塊:unarchive:src: /root/hehe.tar.gz #壓縮包的位置dest: /root/ #解壓的目的位置remote_src: yes #壓縮包文件是否在客戶端。加了此參數 hehe.tar.gz 在目標服務器,如果不加此參數默認在Ansible服務器上查找hehe.tar.gz