1. 程式人生 > >ansible輕量級運維工具使用

ansible輕量級運維工具使用

同步 started 生成 cron pin cat 多余 ip地址 ech

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輕量級運維工具使用