ansible輕量級運維工具使用
Linux輕量級自動運維工具-
Ansible 創始人 Michael DeHanan 2012-03-09
同類自動化工具:
Ansible
Saltstack
Puppet
Chef
Fabric
Ansible 特點
agentless (去中心化)
只要保存管理機的認證信息,那麽任何一臺機器都可以變成管理機
Stupied Simple
SSH by default
YAML no code 定制劇本
基於python 實現
模塊化:調用特定模塊,完成特定任務,支持自定義模塊
冥等性
-m 指定模塊
-a 指定參數
web 主機列表
ansible特性
模塊化:調用特定的模塊,完成特定的任務;
基於Python語言研發,由Paramiko, PyYAML和Jinja2三個核心庫實現;
部署簡單:agentless;
支持自定義模塊,使用任意編程語言;
強大的playbook機制;
冪等性;
安裝及程序環境:
程序:
ansible
ansible-playbook
ansible-doc
配置文件:
/etc/ansible/ansible.cfg
主機清單:
/etc/ansible/hosts
插件目錄:
/usr/share/ansible_plugins
Master 機
安裝ansible
yum -y install ansible
ansible命令的使用:
Usage: ansible <host-pattern> [options]
常用選項:
-m MOD_NAME
-a MOD_ARGS
配置Host Inventory:
/etc/ansible/hosts
[group_id]
HOST_PATTERN1
HOST_PATTERN2
編輯/etc/ansible/hosts文件
然後添加我們下面實驗操作用到的主機
[web] 主機列表
172.18.252.126
172.18.254.26
172.18.251.122
生成公鑰
# ssh-keygen
#ssh-copi-id [email protected] 把公鑰發送到目標主機
#ssh-copi-id [email protected]
#ssh-copi-id [email protected]
如果目標主機已經認證過
可以清掉公鑰
cd .ssh/
> authorzed_key
> know_hosts
為了實驗再來一次
———————————————————————————————————————————————————————————也可
cd /root/.ssh/
生成私鑰和公鑰 ssh-keygen -t rsa -P ‘‘
ls
復制公鑰文件到authorized_keys
# cat id_rsa.pub >> authorized_keys
# chmod 600 authorized_keys
把公鑰傳送到其他主機
scp authorized_keys 172.18.252.126:/root/.ssh/
.................
.................
然後重新執行ansible的ping模塊命令查看該兩臺主機的連通性
可以發現此時已經成功
# ansible web -m ping
ansible模塊:
獲取模塊列表:ansible-doc -l
獲取指定模塊的使用幫助:ansible-doc -s MOD_NAME
常用模塊:
ping模塊:探測目標主機是否存活;
# ansible web -m ping
(註 : 像Ping 這樣的模塊有上千個)
ansible的默認模塊
command
示例1
讓所有主機都執行 uname -r 命令 (顯示操作系統的發行版號)
# ansible web -m command -a "uname -r"
示例2
在主機上都創建一個 hello 用戶
#ansible web -m command -a "useradd hello"
然後檢查三臺主機是否創建此用戶
# ansible web -m command -a "id hello"
# ansible web -m command -a "tail /etc/passwd"
幫三個主機的hello用戶改密碼
*shell模塊:在遠程主機上調用shell解釋器運行命令,支持shell的各種功能,例如管道等
*因為ansible的command模塊並不支持管道等輸出,所以下面介紹另外一個ansible的模塊shell
# ansible web -m shell -a "echo chenhao | passwd --stdin hello"
但是實際工作中不允許root 用戶來直接登錄使用,可以使用以下方法
在目標主機
# visudo
把這行註釋掉 #wheel ALL=(ALL) ALL
把這行#取消 %wheel ALL=(ALL) NOPASSWD:ALL
# usermod -G wheel chen (把chen 用戶添加到 wheel附加組裏 就可以直接執行 免密碼sudo )
###
# ansible web -m ping -u chen -b --become-user root
小公司 可能會直接使用root
大公司 會把root 權限回收
copy模塊:復制文件到遠程主機
ansible-doc -s copy
用法:
(1) 復制文件
-a "src= dest= "
(2) 給定內容生成文件
-a "content= dest= "
其它參數:mode, owner, group, …
示例:
復制文件到其他主機
前提: 該目標主機的指定目錄需要存在,不然會報錯
src 源
dest 目標
mode 權限
# ansible web -m copy -a "src=/path/to/somefile dest=/path/to/somefile mode=600"
# ansible web -m copy -a "src=/etc/fstab dest=/tmp/ backup=yes mode=0644 owner=chen group=hellogroup"
file模塊:設置文件的屬性
用法:
(1) 創建目錄:
-a "path= state=directory"
(2) 創建鏈接文件:
-a "path= src= state=link"
(3) 刪除文件:
-a "path= state=absent“
查看說明
ansible-doc -s file
修改文件的權限和屬主
# ansible web -m file -a "path=/path/to/somefile mode=600 owner=chen"
然後到目標主機上驗證
創建文件的軟連接
ansible web -m file -a "src=/somefile path=/somefile.link state=link"
目標主機上驗證文件、
ll /dir/somefile
設置文件的狀態為absent(即刪除文件)
# ansible web -m file -a "path=/dir/somefile.link state=absent"
_____________________________________________
fetch模塊:從遠程主機拿文件
# ansible-doc -s fetch
示例: 從172.18.254.26上拿個文件
# ansible 172.18。254.26 -m fetch -a "src=/dir/somefile dest=/root"
獲取文件的時候,也會創建對應的ip地址的目錄,以區分文件
————————————————————————————————————————————————
cron模塊:管理計劃任務條目
用法:
-a ""
minute=
hour=
day=
month=
weekday=
job=
name=
user=
state={present|absent}
#ansible-doc -s cron
示例:創建一個同步時間的計劃任務,每10分鐘同步一下服務器的時間
# ansible web -m cron -a "minute=‘*/10‘ job=‘/usr/sbin/ntpdate 172.18.252.126 &> /dev/null‘ name=‘sync time‘"
驗證:目標主機上
crontab -l
示例
刪除計劃任務
# ansible web -m cron -a "name=‘sync time ‘ state=absent"
這時到目標主機上驗證,任務已經被刪除了
# crontab -l
hostname模塊:管理主機名
用法:
name=
#ansible-doc -s hostname
示例: 查看所有主機名
#ansible web -a "hostname"
修改:
# ansible 172.182.252.84 -m hostname "name=centos007"
_______________________________________________
yum模塊:使用yum命令完成程序包管理
用法:
-a ""
(1) name= state={present|latest}
(2) name= state=absent
# ansible-doc -s yum
示例:安裝指定包
此實驗,首先,確定主機的yum源是可用的,否則實驗會失敗
# yum info nginx
安裝nginx
# ansible web -m yum -a "name=nginx"
刪除nginx
# ansible web -m yum "name=nginx state=absent"
這時查看
#yum info nginx 已經沒安裝的字眼REPO installed
++++++++++++++++++++++++++++++++++++++++++++++++
service模塊:服務管理
用法:
-a ""
name=
state=
started
stopped
restarted
enabled=
runlevel=
#ansible-doc -s service
示例: 開啟httpd服務
首先確認服務是關閉的
# service httpd stop
#ss -tnl
開啟httpd服務,並設置為開機啟動
#ansible web -m service -a "name=httpd state=started enabled=ture"
____________________________________
group模塊:增加或刪除組
用法:
-a ""
name=
state=
system=
gid=
# ansible-doc -s group
示例 添加一個組
# ansible web -m group -a "name=grouphello system=ture" (是否為系統組)
驗證 # gentent group hellogroup
刪除組:
# ansible web -m group -a "name=hellogroup state=absent"
——————————————————————————————————————————————
user模塊: 用戶管理
使用格式:
name= : 創建的用戶名
state= : present新增,absent刪除
force= : 刪除用戶的時候刪除家目錄
system= : 創建系統用戶
uid= : 指定UID
shell= : 指定shell
home= : 指定用戶家目錄
# ansible-doc -s user
示例: 添加一個系統用戶
# ansible web -m suer -a "name=hellousers system=ture"
驗證 # ansible web -a "id hellousers"
(再說一次這裏沒指定模塊,默認模塊是command)
示例: 刪除一個用戶
# ansible web -m user -a "name=hellousers state=absent"
______________________________________________
setup模塊:獲取主機裏面的各種信息
# ansible-doc -s setup
# ansible 172.18.251.122 -m setup
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
________________________________________________________________________________________________________________________________________________
YAML : 是一種數據序列化工具的語言格式
YAML is a data serialization format designed for human readability and interaction with scripting languages.
# yum info PyYAML
數據結構:
key:value
– item1
– item2
– item3
例如{name:jerry, age:21}
PlayBook
核心元素:
Tasks:任務,由模塊定義的操作的列表;
Variables:變量
Templates:模板,即使用了模板語法的文本文件;
Handlers:由特定條件觸發的Tasks;
Roles:角色;
playbook的基礎組件:
Hosts:運行指定任務的目標主機;
remote_user:在遠程主機以哪個用戶身份執行;
sudo_user:非管理員需要擁有sudo權限;
tasks:任務列表
模塊,模塊參數:
格式:
(1) action: module arguments
(2) module: arguments
運行playbook,使用ansible-playbook命令
(1) 檢測語法
ansible-playbook –syntax-check /path/to/playbook.yaml
(2) 測試運行
ansible-playbook -C /path/to/playbook.yaml
–list-hosts
-list-tasks
–list-tags
(3) 運行
ansible-playbook /path/to/playbook.yaml
-t TAGS, –tags=TAGS
–skip-tags=SKIP_TAGS
–start-at-task=START_AT
示例1:定義一個playbook任務來新增用戶和組
定義一個yaml的模板( 這裏使用TAB 鍵是會被踢出運維隊伍的,所以全部用空格代替)
# vim group.yml
---
- hosts: all
remote_user: root
tasks:
- name: add a group
group: name=hellogroup system=ture
- name: add a user
user: name=hellousers group=hellogroup system=ture
先檢查語法有沒有錯誤,沒有提示就說明語法沒問題
# ansible-playbook --syntax-check group.yml
先測試運行看看 -C 表示僅測試一遍, 但是不會實際操作
# ansible-playbook -C group.yml
也可以單獨測試某些特定的選項查看僅影響的主機
# ansible-playbook -C group.yml --list-hosts
查看運行哪些任務
# ansible-playbook -C group.yml --list-taskss
查看哪個任務打標了,這裏並沒有任何任務打標記,後面再演示
# ansible-playbook -C group.yml --list-tags
以上都沒有問題,開始正式運行該任務
# ansible-playbook group.yml
示例添加用戶
vim user.yml
---
- hosts: web
remote_user: root
tasks:
- name: Added User1
user: name=user1 system=true uid=307
- name: Added User2
user: name=user2 system=true uid=308
示例: 定義一個playbook任務來修改文件端口
vim web.yml
此步驟裏面有安裝httpd的安裝包,其實此處有點多余,因為測試的兩臺主機均已經安裝該服務,此處添加上去是為了演示效果,因為當生產環境中,假如存在一臺服務器沒有該安裝包,那麽次處就能幫我們安裝上去,不然的話,漏了這一步,到後面查原因也挺麻煩的
---
- hosts: websrvs
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=latest
- name: install conf file
copy: src=/testdir/httpd.conf dest=/etc/httpd/conf/httd.conf
- name: start httpd service
service: name-hhtpd state=started
檢查語法問題
# ansible-playbook --syntax-check web.yml
先從一臺主機上面把httpd.conf文件拷來編輯
scp 172.18.251.122:/etc/httpd/conf/httpd.conf /testdir/
修改httpd.conf文件
比如修改端口為8080. 其他都為默認配置
Listen 8080
首先備份好鴿子主機裏面的配置文件,以防萬一
# ansible web -m shell -a "cp /etc/httpd/conf/httpd.conf{,.bask}"
、
檢查備份是否成功
# ansible web -a "ls -l /etc/httpd/conf"
測試運行 web.yml 看看有沒有問題,沒有問題就正常運行
# ansible-playbook -C web.yml
然後就執行該文件
# ansible-playbook web.yml
驗證服務器端口打開沒有,可以看見8080端口已經打開,實驗成功
# ansible websrvs -a "ss -tnl"
---------------
Handlers的使用:由特定條件觸發的Tasks;
格式:
tasks:
– name: TASK_NAME
module: arguments
notify: HANDLER_NAME
handlers:
– name: HANDLER_NAME
module: arguments
示例:參照上面的例子繼續修改apache的端口
修改端口號為8090
修改原來的web.yml腳本實現操作
---
- hosts: websrvs
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=latest
- name: install conf file
copy: src=/testdir/httpd.conf dest=/etc/httpd/conf/httd.conf
notify: restart httpd service *****
- name: start httpd service
service: name-hhtpd state=started
handlers: ****
- name: restart httpd service ****
service: name=httpd state=restarted *****
檢測語法
#ansible-playbook --syntax-check web.yml
測試運行,可以看出,當復制文件過去的時候,會觸發到restart httpd service的handlers任務,所以任務就重啟了,而不是啟動
# ansible-playbook -C web.yml
正式執行
# ansible-playbook web.yml
驗證結果,8090端口已經打開,實驗成功
# ansible web -a "ss -tnl"
______________________________
tags:給指定的任務定義一個調用標識;
使用格式:
– name: NAME
module: arguments
tags: TAG_ID
示例:執行特定的tags
修改文件的端口為8088
在此前的配置文件上面插入一個標簽instconf
後面打****************號的
---
- hosts: websrvs
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=latest
- name: install conf file
copy: src=/testdir/httpd.conf dest=/etc/httpd/conf/httd.conf
tags: inatconf ***************
notify: restart httpd service
- name: start httpd service
service: name-hhtpd state=started
handlers:
- name: restart httpd service
service: name=httpd state=restarted
檢查語法
#ansible-playbookp--syntax-check web.yml
此處可以查看到該yml腳本有一個標簽,影響著websrvs組
測試運行
# ansible-playbook -C -t instconf web.yml
正式運行一下,指定以instconf的標簽運行,所以此處不會顯示器其他多余的信息,包括安裝httpd包和啟動httpd服務
# ansible-playbook -t instconf web.yml
驗證該結果
# ansible web -a "ss -tnl"
===============================================
Variables:變量
類型:
內建:
(1) facts
自定義:
(1) 命令行傳遞;
-e VAR=VALUE
(2) 在hosts Inventory中為每個主機定義專用變量值;
(a) 向不同的主機傳遞不同的變量 ;
IP/HOSTNAME variable_name=value
(b) 向組內的所有主機傳遞相同的變量 ;
[groupname:vars]
variable_name=value
(3) 在playbook中定義
vars:
– var_name: value
– var_name: value
(4) Inventory還可以使用參數:
用於定義ansible遠程連接目標主機時使用的屬性,而非傳遞給playbook的變量;
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
…
(5) 在角色調用時傳遞
roles:
– { role: ROLE_NAME, var: value, …}
變量調用:
{{ var_name }}
寫了一下午,未完待續。。。。。。
ansible輕量級運維工具使用