2.1 安裝Ansible
以CentOS為例:
2.1.1 在管理員的電腦安裝
- 安裝Ansible軟件
yum install epel-release -y
yum install ansible -y
- 配置Ansible管理節(jié)點到主機的連接
#生成密鑰
ssh-keygen
#復制密鑰的遠程主機上
ssh-copy-id remoteuser@remoteserver
#SSH的時候不會提示是否保存密鑰
ssh-keyscan remote_servers >> ~/.ssh/known_hosts
2.1.2 被管理的遠程主機
啥也不用做底循,只需要保證SSH服務是啟動的,并且Python版本大于2.4即可。
2.2 Ansible管理哪些主機
2.2.1 什么是主機目錄
主機目錄(Host Inventory骡送,又稱為主機清單)是配置文件饼暑,用來告訴Ansible需要管理哪些主機司抱,并且把這些主機按需分類余境。
2.2.2 主機目錄配置文件
默認的文件是: /etc/ansible/hosts .可以修改為其他文件
2.3 Ansible用命令管理主機
Ansible提供了一個命令行工具钓账,官方叫做 Ad-Hoc Commands陕悬。
- Ansible命令的格式
ansible <host-pattern> [options]
- 示例
#檢查所有的遠程主機题暖,是否以 "pangcm" 用戶創(chuàng)建了Ansible管理主機可以訪問的環(huán)境
ansible all -m ping -u pangcm
#執(zhí)行命令
ansible all -a "/bin/echo hello"
#復制文件
ansible web -m copy -a "src=/etc/hosts dest=/tmp/hosts"
#安裝包
ansible web -m yum -a "name=acme state=present"
#添加用戶
ansible all -m user -a "name=foo password=<crypted passowrd here>"
#并行執(zhí)行
ansible lb -a "/sbin/reboot" -f 10
#查看遠程主機的全部系統(tǒng)信息
ansible all -m setup
2.4 Ansible用腳本管理主機
為了避免重復輸入命令,Ansible提供了腳本功能。Ansible腳本的名字叫做Playboo芙委,使用的YAML格式逞敷,文件以yml活yaml為后綴。
2.4.1 執(zhí)行腳本Playboook的方法
ansible-playbook deploy.yml
2.4.2 Playbook 的例子
Playbook 包含了幾個關鍵字灌侣,每個關鍵字的含義如下推捐。
- hosts: 某主機的IP,或者主機名侧啼,或者關鍵字 all.
- remote_user: 以某個用戶身份執(zhí)行牛柒。
- vars: 變量
- tasks: Playbook的核心,定義順序執(zhí)行的動作Action痊乾。每個Action調(diào)用一個Ansible模塊皮壁。
- action 語法:
module: module_parameter=module_value
- 常用的模塊有 yum、copy哪审、template等蛾魄,模塊在Ansible中的作用,相當與bash腳本中的yum湿滓、copy這樣命令的作用滴须。
- handers: Playbook的Even處理操作,有且僅有被Action觸發(fā)時才會執(zhí)行叽奥。但是多次出發(fā)只執(zhí)行一次扔水,并按照聲明的順序執(zhí)行。下面是一個安裝Apache的示例:
---
- hosts: web
vars:
http_port:80
remote_user: root
tasks:
- name: ensure apache is at the lastest version
yum: pkg=httpd state=latest
- name: Write the configuration file
template: src=template/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify:
- restart apache
- name: ensure apache is running
service: name=httpd state=started
handlers:
- name: restart apache
service: name=httpd state=restarted
2.4.3 Play和Playbook
在一個Playbook文件中朝氓,針對每一組主機的所有操作就是一個Play魔市,一般情況下一個Playbook只包含一個Play,但是也而已包含多個赵哲。
2.5 Ansible模塊
2.5.1 什么是Ansible模塊
類別于shell待德,Ansible中的模塊就好比shell中的命令。shell中的命令可以帶參數(shù)枫夺,Ansible中的模塊也可以帶參數(shù)磅网。
2.5.2 在命令行中使用模塊
在命令行中:
- -m 后面接調(diào)用模塊的名字
- -n 后面接調(diào)用模塊的參數(shù)
如:
ansible all -m copy -a "src=/etc/hosts dest=/tmp/hosts"
2.5.3 在Playbook中使用模塊
在Playbook腳本中,tasks中每一個Action都是對模塊的一次調(diào)用筷屡。在每個Action中:
- 冒號前面的是模塊的名字
- 冒號后面是調(diào)用模塊的參數(shù)
2.5.4 Ansible模塊的特點
- 像Linux中的命令一樣涧偷,Ansible的模塊既可以在命令行中調(diào)用,也可以在Ansible腳本Playbook中調(diào)用毙死。
- 每個模塊的參數(shù)和狀態(tài)判斷燎潮,都取決于該模塊的具體實現(xiàn),所以在使用它們之前需要查閱該模塊的文檔扼倘。
- 可以通過文檔查看具體的用法
- 通過命令 ansible-doc 也可以查看模塊的用法
- Ansible提供一些常用功能的模塊确封,同時Ansible也提供API除呵,讓用戶可以自己寫模塊,使用的編程語言是Python爪喘。
2.5.5 常用的模塊
下面介紹一些常用的模塊
-
調(diào)試和測試類的模塊
- ping: ping遠程主機颜曾,如果返回pong,則意味著能夠通過Ansible連接
- debug: 用于調(diào)試的模塊秉剑,只是打印一些消息泛豪,類比Linux的ehco。
-
文件類的模塊
- copy: 從本地復制文件到遠程節(jié)點
- template: 從本地復制文件到遠程節(jié)點侦鹏,并進行變量的替換
- file: 設置文件屬性
-
Linux 上常用的操作
- user: 管理用戶賬戶
- yum: Red Hat 系Linux上的包管理
- service: 管理服務
- firewall: 管理防火墻中的服務和端口
-
執(zhí)行shell命令
- shell:在節(jié)點上執(zhí)行shell命令诡曙,支持 $HOME、 "|" 和 "&" 等略水。
- command: 在節(jié)點上執(zhí)行shell命令价卤,不支持 $HOME、 "|" 和 "&" 等渊涝。
針對上面提到的常用模塊慎璧,下面針對幾個做下具體的介紹
- debug 模塊
- 通過參數(shù) msg 定義打印的字符串,當然也可以打印變量
- debug: msg: "I can echo vars {{ inventory_hostname }}"
- 通過參數(shù) var 定義需要打印的變量跨释,后面直接跟變量的名稱
- debug: var: inventory_hostname
msg 和 var 都能輸出變量胸私,但是 msg輸出變量時需要顯式地表示變量才行,也就是使用 "{{}}" 標注煤傍,如果shell中的 "$()" 盖文。而var則不需要嘱蛋。
-
copy 模塊
需要注意的是蚯姆,copy模塊在復制前會先比較文件的 checksum,如果相同則不復制洒敏,返回狀態(tài)OK龄恋;如果不同才復制,返回狀態(tài) changed.- 設置文件權限
利用mode 設置權限可以是數(shù)字凶伙,也可以時符號的形式郭毕,如"u=rw,g=r,o=r"
- copy: "src=/etc/hosts dest=/tmp/hosts owner=foo group:foo mode=0644"
- 備份節(jié)點上原來的文件
當backup參數(shù)為yes的時候,如果發(fā)生了復制操作函荣,那么會先復制目標節(jié)點上的源文件显押。當兩個文件相同時,不再進行復制操作傻挂。
- copy: "src=/etc/hosts dest=/tmp/hosts backup=yes"
- 復制后的驗證操作
validate 參數(shù)接需要驗證的命令乘碑。一般需要驗證復制后的文件,所以 %s 都可以指代復制后的文件金拒。當copy模塊中加入 validate 參數(shù)后兽肤,不僅需要成功復制文件,還需要 validate命令返回成功的狀態(tài),整個模塊的執(zhí)行才算成功资铡。常見的場景如 visudo电禀。
- copy: src: /tmp/sudoers dest: /etc/sudoders validate: 'visudo -cf %s'
- 設置文件權限
template 模塊
使用的方法和copy幾乎一模一樣,不同的是template可以攜帶變量笤休。也就是說能夠進行變量的替換尖飞,起到模版的用途。這里只需要知道變量的使用需要使用 "{{}}" 即可宛官,后面會介紹jinja2的具體用法葫松。常見的場景如nginx配置文件的復制替換。
- file模塊
file模塊可以用來設置遠程主機的文件底洗、軟連接和文件夾的權限腋么,也可以用來創(chuàng)建和刪除他們。如下所示
- name: "改變文件的權限"
file: path=/etc/foo.conf mode=0644
- name: "創(chuàng)建文件的軟鏈接"
file: src=/tmp/hosts dest=/tmp/hosts_symlink state=link
- name: "創(chuàng)建一個新文件"
file:
path: /etc/foo.conf
state: touch
mode: 0644
- name: "創(chuàng)建一個目錄"
file:
path: /tmp/test
state: directory
mode: 0755
- user 模塊
user 模塊可以增亥揖、刪珊擂、改Linux遠程節(jié)點的用戶賬戶,并為其設置賬戶的屬性费变。如下
---
- hosts: remote_host
tasks:
- names: "增加用戶"
user: "name=johnd comment='John Doe' uid=1040 group=admin"
- name: "創(chuàng)建用戶james摧扇,并將其添加到兩個group中"
user: "name=james shell=/bin/bash groups=admin,developers append=yes"
- name: "刪除賬戶"
user: "name=johnd state=absent remove=yes"
- name: "修改賬戶的屬性,創(chuàng)建SSH密鑰,并放在 ~/.ssh/id_rsa 中 "
user:
name: jsmith
generate_ssh_key: yes
ssh_key_file: .ssh/id_rsa
- yum 模塊
yum模塊用來管理RedHat系的安裝包的挚歧,Red Hat8使用了dnf來管理包扛稽,如果遠程主機是版本8的話,則需要使用dnf模塊滑负。
- name: "從yum源上安裝最新的httpd包在张,已經(jīng)有的話則會更新"
yum: "name=httpd state=latest"
- name: "安裝指定版本的包"
yum: "name=httpd-2.2.29-1.4.amzn1 state=present"
- name: "刪除httpd包"
yum: "name=httpd state=absent"
- name: "安裝一組包"
yum:
name: "@Development tools"
state: present
- name: "本地安裝包"
yum: "name=/tmp/httpd.rpm state=present"
- service 服務管理模塊
改模塊用來管理遠程節(jié)點上的服務,比如httpd矮慕、sshd等帮匾。
- name: "開啟服務"
service: "name=httpd state=started"
- name: "重啟服務"
service: "name=httpd state=restarted"
- name: "設置開機啟動"
service: "name=httpd enabled=yes"
- name: "啟動網(wǎng)絡服務下的接口 eth0"
service: "name=network state=restarted args=eth0"
- firewalld 模塊
firewalld 模塊為某服務和端口添加firewalld規(guī)則。firewalld中有正在運行的規(guī)則和永久規(guī)則痴鳄,firewalld模塊都支持瘟斜。
- name: "為服務添加firewalld規(guī)則"
firewalld: "zone=dmz service=https permanent=true state=enabled"
- name: "為端口號添加firewalld規(guī)則"
firewalld: "port=8081/tcp permanent=true state=disabled"
- name: "其他復雜的firewalld規(guī)則"
firewalld: "source=192.168.2.0/24 zone=internal state=enabled"
- name: "其他復雜的firewalld規(guī)則"
firewalld: "zone=trusted interface=eth2 permanent=true state=enabled"
- shell 模塊
如果能通過其他的Ansible模塊實現(xiàn)的盡量不要使用shell模塊來實現(xiàn),原因是shell模塊不會對執(zhí)行的狀態(tài)進行判斷痪寻,也就是不存在該模塊不存在冪等性螺句。
shell模塊支持 $HOME、"<"橡类、">"蛇尚、"|"、";" 和 "&" 猫态。
- name: "test $home"
shell: echo "test1" > ~/tmp/test1
- name: "test &&"
shell: service jboss start && chkconfig jboss on
- name: "支持調(diào)用腳本"
shell: "somescript.sh >> somelog.txt"
- name: "可以指定工作目錄"
shell: "somescript.sh >> somelog.txt"
args:
chdir: somedir/
- name: "指定工作目錄佣蓉,并且僅在文件somelog.txt 不存在時執(zhí)行命令"
shell: "somescript.sh >> somelog.txt"
args:
chdir: somedir/
creates: somelog.txt
- command 模塊
功能和shell類似披摄,但是不支持 $HOME、"<"勇凭、">"疚膊、"|"、";" 和 "&" 等操作虾标。和shell不同的地方是能夠傳入?yún)?shù)寓盗。
- name: "比shell模塊多一個傳參的方式"
command: /usr/bin/make_database.sh arg1 arg2 creates=/path/database