一饶号、ansible的作用及工作結構
1涩禀、ansible簡介:
ansible是新出現(xiàn)的自動化運維工具屿岂,基于Python開發(fā),集合了眾多運維工具(puppet霉撵、cfengine剥啤、chef牺丙、func则涯、fabric)的優(yōu)點,實現(xiàn)了批量系統(tǒng)配置冲簿、批量程序部署粟判、批量運行命令等功能。ansible是基于模塊工作的峦剔,本身沒有批量部署的能力档礁。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架吝沫。主要包括:
(1)呻澜、連接插件connection plugins:負責和被監(jiān)控端實現(xiàn)通信递礼;
(2)、host inventory:指定操作的主機羹幸,是一個配置文件里面定義監(jiān)控的主機宰衙;
(3)、各種模塊核心模塊睹欲、command模塊供炼、自定義模塊;
(4)窘疮、借助于插件完成記錄日志郵件等功能袋哼;
(5)、playbook:劇本執(zhí)行多個任務時闸衫,非必需可以讓節(jié)點一次性運行多個任務
2涛贯、ansible的總體架構:連接其他主機默認使用ssh協(xié)議
由上面的圖可以看到 Ansible 的組成由 5 個部分組成:
Ansible: 核心
Modules: 包括 Ansible 自帶的核心模塊及自定義模塊
Plugins: 完成模塊功能的補充,包括連接插件蔚出、郵件插件等
Playbooks: 劇本(編排好一步一步的執(zhí)行)弟翘;定義 Ansible 多任務配置文件,有 Ansible 自動執(zhí)行
Inventory: 定義 Ansible 管理主機的清單
二骄酗、ansible的安裝以及常用的模塊使用
1稀余、ansible無服務器端,使用時直接運行命令即可趋翻,同時不需要在被管控主機上安裝任何客戶端睛琳,因此ansible是一個十分輕量級的工具,可以再epel源進行安裝踏烙。
配置好epel源直接安裝yum安裝ansible
[root@centos7 ~]#yum -y install ansible
查看生成的主要文件:
[root@centos7 ~]#rpm -ql ansible
/etc/ansible
/etc/ansible/ansible.cfg #配置文件
/etc/ansible/hosts #主機庫(host inventory)
/usr/bin/ansible #主程序
/usr/bin/ansible-doc #文檔
/usr/bin/ansible-playbook #劇本
......
2师骗、ansible命令的使用方法
語法:
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
host-pattern:host inventory文件的一個組名,可以為all
-f forks:并行處理的個數(shù)讨惩,默認為5
-m module_name:模塊名辟癌,默認為command
-a args:參數(shù)
ansible-doc:
-l:查看模塊列表
-s:查看相關模塊參數(shù)
Ansible默認安裝好后有一個配置文件/etc/ansible/ansible.cfg,改配置文件中定義了ansible的主機的默認配置部分荐捻,如默認是否需要輸入密碼黍少、是否開啟sudo認證、action_plugins插件的位置靴患、hosts主機組的位置仍侥、是否需要開啟log功能要出、默認端口鸳君、key文件位置等。
[defaults]
# some basic default values...
hostfile = /etc/ansible/hosts \\指定默認hosts配置的位置
# library_path = /usr/share/my_modules/
remote_tmp = $HOME/.ansible/tmp
pattern = *
forks = 5
poll_interval = 15
sudo_user = root \\遠程sudo用戶
#ask_sudo_pass = True \\每次執(zhí)行ansible命令是否詢問sudo密碼
#ask_pass = True \\每次執(zhí)行ansible命令時是否詢問ssh密碼
transport = smart
remote_port = 22
module_lang = C
gathering = implicit
host_key_checking = False \\關閉第一次使用ansible連接客戶端是輸入命令提示
log_path = /var/log/ansible.log \\需要時可以自行添加患蹂。chown -R root:root ansible.log
system_warnings = False \\關閉運行ansible時系統(tǒng)的提示信息或颊,一般為提示升級
# set plugin path directories here, separate with colons
action_plugins = /usr/share/ansible_plugins/action_plugins
callback_plugins = /usr/share/ansible_plugins/callback_plugins
connection_plugins = /usr/share/ansible_plugins/connection_plugins
lookup_plugins = /usr/share/ansible_plugins/lookup_plugins
vars_plugins = /usr/share/ansible_plugins/vars_plugins
filter_plugins = /usr/share/ansible_plugins/filter_plugins
fact_caching = memory
[accelerate]
accelerate_port = 5099
accelerate_timeout = 30
accelerate_connect_timeout = 5.0
# The daemon timeout is measured in minutes. This time is measured
# from the last activity to the accelerate daemon.
accelerate_daemon_timeout = 30
下面對一些常用的模塊進行演示說明:
首先準備測試環(huán)境:四臺主機砸紊,一臺作為ansible的控制主機,另外三臺作為被管理的機器節(jié)點
1囱挑、ansible的連接:
通過前面的介紹我們知道醉顽,ansible是基于ssh協(xié)議來進行數(shù)據(jù)傳輸,ssh連接一般由兩種方法平挑,一種是使用密碼密鑰游添,一種是使用公私密碼免密碼登陸,為了順利使用ansible通熄,下面配置基于公私密碼免密碼登錄
(1)生成密鑰對
[root@centos7 ~]#ssh-keygen -t rsa
\\-t表示使用的加密類型唆涝,其中rsa1表示version1版本,rsa唇辨、dsa廊酣、ecdsa的加密是對于version2版本
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): \\這里詢問你要把生成的密鑰文件保存在哪里,默認是在家目錄下的.ssh文件夾中赏枚,回車保存默認目錄
Enter passphrase (empty for no passphrase):
\\ 這里是對密鑰文件加密亡驰,不輸入則表示不加密
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:
e3:39:0e:4b:f0:a1:4f:23:aa:f2:d2:5f:d6:90:8e:af root@centos7.3.zj.com
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| |
| . |
| . + S |
| * = o |
| . + X = |
|o .. O = . |
|o+o.E.+ . |
+-----------------+
(2)查看已經(jīng)成功生成了一對密鑰
[root@centos7 ~]#ls /root/.ssh
id_rsa id_rsa.pub known_hosts
\\其中id_rsa為私鑰,id_rsa.pub為公鑰
(3)在生成完密鑰對之后將公鑰上傳給服務器對應用戶的家目錄
[root@centos7 ~]#ssh-copy-id -i .ssh/id_rsa.pub root@172.16.252.190
[root@centos7 ~]#ssh-copy-id -i .ssh/id_rsa.pub root@172.16.252.192
[root@centos7 ~]#ssh-copy-id -i .ssh/id_rsa.pub root@172.16.250.129
已經(jīng)配置好無需密碼登錄了饿幅,下面進行ansible的配置
2凡辱、配置ansible需要控制的主機列表,其配置在/etc/ansible/hosts文件中
[test表示控制的組可以根據(jù)實際進行定義栗恩,下面添加主機列表]
3煞茫、命令模塊
這也是默認的模塊,也就是不加-m指定模塊時默認的模塊摄凡,這個模塊不能使用包含管道的命令续徽。
[root@centos7 ~]#ansible-doc -s command
演示:
[root@centos7 ~]#ansible test -a 'date'
4、shell模塊
shell模塊也是可以執(zhí)行命令亲澡,與command模塊不同的是钦扭,command模塊不能執(zhí)行包含管道的模塊,而shell可以
[root@centos7 ~]#ansible-doc -s shell
演示:
[root@centos7 ~]#ansible test -m shell -a 'echo 111 > /tmp/test.txt'
172.16.250.129 | SUCCESS | rc=0 >>
172.16.252.190 | SUCCESS | rc=0 >>
172.16.252.192 | SUCCESS | rc=0 >>
客戶端查看已經(jīng)生成文件
[root@centos7 ~]#cat /tmp/test.txt
111
5床绪、copy模塊:可以把本機的文件拷貝至被管理的機器客情,通常用于分發(fā)配置文件
[root@centos7 ~]#ansible-doc -s copy
演示:
[root@centos7 ~]#ansible test -m copy -a 'src=/etc/issue dest=/tmp/issue.txt mode=600'
查看測試成功
[root@centos7 ~]#ansible test -a 'ls /tmp/issue.txt'
6、cron模塊:分發(fā)定期任務
[root@centos7 ~]#ansible-doc -s cron
演示:每5分鐘同步ntp服務器
[root@centos7 ansible]#ansible test -m cron -a 'name="test" minute=*/5 hour=* day=* month=* weekday=* job="usr/sbin/ntpdate 172.16.0.1"'
7癞己、yum模塊:顧名思義膀斋,該模塊可以管理軟件的安裝和卸載,state=present(安裝) absent(卸載)
[root@centos7 ~]#ansible-doc -s yum
演示:
[root@centos7 ~]#ansible test -m yum -a 'name=tree state=present'
測試安裝是否成功
[root@centos7 ~]#ansible test -a 'rpm -q httpd'
8痹雅、service模塊
state=started/stopped/restarted
[root@centos7 ~]#ansible-doc -s service
演示:
現(xiàn)在的httpd服務是停止的仰担,我們重啟一下
[root@centos7 ~]#ansible test -m service -a 'name=httpd state=started '
查看已經(jīng)啟動成功
[root@centos7 ~]#ansible test -m shell -a 'ss -tnl|grep 80'
三、ansible的playbook使用
由上面的演示我們體會到了ansible的強大绩社,但是上面的演示都是一條一條指令的輸入摔蓝,這樣未免影響了效率赂苗,這里可以使用playbook劇本像shell腳本一樣一次執(zhí)行多條語句
1:playbook組織格式:YAML語言格式
playbook是ansible更強大的配置管理組件,實現(xiàn)基于文本文件編排執(zhí)行的多個任務贮尉,且多次重復執(zhí)行
(1)YAML簡介
- YAML:YAML Ain‘t Markup Language; Yet Another Markup Language;
- 類似于半結構化數(shù)據(jù)拌滋,聲明配置;可讀性較高的用來表達資料序列的格式猜谚,易于與腳本語言交互
- 官方站點:http://www.yaml.org
(2)語法格式 - 任何數(shù)據(jù)結構都用縮進來標識败砂,可以嵌套
- 每一行是一個鍵值數(shù)據(jù)key:value,冒號隔開魏铅。若想在一行標識需要用{ } 和吠卷,分隔格式
- 列表用-標識
(3)playbook組成結構 - Tasks:任務,即調(diào)用模塊完成的操作
- Variables:變量
- Templates:模板
- Handlers:處理器沦零,由某個條件觸發(fā)執(zhí)行的操作
- Roles:角色
基本結構:
- host:webservices
remote_user:
- tasks:
- task1
module_name
YAML文件擴展名通常為.yaml祭隔,如test.yaml
2、playbook的使用:
前面已經(jīng)介紹了playbook的存儲在*.yaml文件中路操,我們創(chuàng)建一個yaml文件驗證一下
[root@centos7 ansible]#cat /etc/ansible/test.yaml
- hosts: test
remote_user: root
tasks:
- name: user a group
group: gid=1111 name=test system=no
- name: show command
shell: date
正式使用時我們最好先運行下看有沒有錯誤
[root@centos7 ansible]#ansible-playbook --check test.yaml
沒有問題就可以正式運行命令腳本了
[root@centos7 ansible]#ansible-playbook test.yaml
檢查測試成功
[root@centos7 ansible]#ansible test -a 'tail -1 /etc/group'
3疾渴、playbook變量
(1)變量命名:字母、數(shù)字和下劃線組成屯仗,僅能以字母開頭搞坝;
(2)變量種類:
- facts:由遠程主機發(fā)回主機特有的屬性信息,這些信息被保存在ansible變量中魁袜;無需聲明桩撮,可直接調(diào)用
- 自定義變量:
- 通過命令行傳遞:ansible-playbook test.yaml -extra-vars "host=www user=test"
- 通過roles傳遞
- 主機變量:定義在inventory中的主機之后的變量;直接傳遞給單個主機的變量