一、初步介紹node
Ansible是一個完全的簡單的配置管理、應用部署、任務執行和多節點編制引擎。設計原則有一個死去的簡單的安裝過程和最小的學習曲線是很是快和並行默認不須要服務器或客戶端守護進程,使用現有的SSHd使用一種語言,是機器和人類友好容易專一於安全審覈/審查/修改的內容當即管理遠程機器,沒有在任何動態語言引導容許模塊開發,不只Python做爲非根可用最簡單的自動化系統使用。python
在管理服務器的時候對於數量較少的時候還比較輕鬆。可是若是一旦服務器數量過多那麼管理就會很吃力。而ansible的出現可以很好的知足需可以很好解決問題。nginx
二、進一步解析ansibleshell
2.一、結構圖以下vim
2.二、對於ANSIBLE來講須要在服務器上進行部署想關進程才能對其劃分的服務器進行管理。centos
而安裝程序須要的安裝有以下幾個安全
[root@localhost ~]# rpm -qa ansible服務器
ansible-1.9.2-1.el7.noarchbabel
若是是手動編譯安裝須要解決其依賴關係其須要的依賴包以下網絡
python-jinja2
PyYAML
python-paramiko
python-babel
python-crypto
2.三、ANSIBLE主要的一些配置文件
[root@localhost ~]# rpm -ql ansible | less
/etc/ansible
/etc/ansible/ansible.cfg——ansible主配置文件
/etc/ansible/hosts——定義須要的控制服務器的ip地址或者服務器名
/etc/ansible/roles——定義須要角色
/usr/bin/ansible-doc——ansible須要的幫助文檔
/usr/bin/ansible-playbook——執行劇本
/usr/bin/ansible-vault——ansible庫文件
對於ansible而言全部的配置文件都在ansible目錄下面。
2.四、對於ansible而言在操做以前須要事先配置ansible端能基於密鑰認證的方式聯繫各被管理節點。以下的操做
[root@wp ~]# ssh-keygen ——對於彈出來的界面回車到結束便可
[root@wp ~]# ssh-copy-id -i ~/.ssh/id_rsa root@172.16.17.1
[root@wp ~]# ssh-copy-id -i ~/.ssh/id_rsa root@172.16.17.22
把全部的須要管理的服務器統一添加都羣組中去。
2.五、ansible簡單的操做以下
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
[root@localhost ~]# ansible-doc -s
Usage: ansible-doc [options] [module...]
Options:
-h, --help show this help message and exit
-l, --list List available modules
-s, --snippet Show playbook snippet for specified module(s)
-v Show version number and exit
[root@localhost ~]#
三、ansible具體介紹
3.一、對其主配置文件進行說明
[root@node1 ~]# vim /etc/ansible/ansible.cfg
[defaults]
inventory = /etc/ansible/hosts——默認用戶存放文件
#library = /usr/share/my_modules/——ansible默認模塊
remote_tmp = $HOME/.ansible/tmp
pattern = *——全局匹配
forks = 5——分叉五次
poll_interval = 1——投票間隔
sudo_user = root——默認以root用戶設置
#remote_port = 22——默認遠程端口
sudo_exe = sudo——以sudo的方式執行執行權限
timeout = 10——ssh鏈接超時10s
[root@localhost ~]# vim /etc/ansible/hosts
[keep]定義ansible組
172.16.17.1
172.16.17.3
[httpd]
172.16.17.4
172.16.17.5
3.二、對於ansible而言除了可以單個命令執行還能夠定義劇本一次執行。
第二部分、接下說說ansible經常使用模塊
一、Setup
收集遠程主機的服務器的基本信息
Ansible HOSTS -m setup
二、File 設置文件的一些經常使用屬性
[root@localhost ~]# ansible-doc -s file
force須要在兩種狀況下強制建立軟連接一種是源文件不存在但以後會創建的狀況下另外一種是目標軟連接已存在,須要先取消以前的軟鏈而後建立新的軟鏈有兩個選項yes|no
group定義文件/目錄的屬組
mode定義文件/目錄的權限
owner定義文件/目錄的屬主
path必選項定義文件/目錄的路徑
recurse遞歸的設置文件的屬性只對目錄有效
src要被連接的源文件的路徑只應用於state=link的狀況
dest被連接到的路徑只應用於state=link的狀況
state指定須要實現的狀態狀態有以下的這些
directory若是目錄不存在建立目錄
file即便文件不存在也不會被建立
link建立軟連接
hard建立硬連接
touch若是文件不存在則會建立一個新的文件若是文件或目錄已存在則更新其最後修改時間
absent刪除目錄、文件或者取消連接文件
例子
ansible nginx -m file -a 'src=/etc/fstab dest=/tmp/fstab state=link'
ansible nginx -m file -a 'path=/tmp/test.sh state=touch'
ansible nginx -m shell -a 'echo "hell world" > /tmp/test.sh'
ansible nginx -m file -a 'path=/tmp/test1 state=directory mode=744'
三、command 在控制的服務器中執行命令
chdir # 在運行某個目錄下的命令以前先切換到目錄下
creates # 若是建立的文件存在即退出不建立
executable # 以shell的方式執行命令可是須要時絕對路徑的前提下
removes # 移除某個文件可是若是不存在就不執行
例子
[root@localhost ~]# ansible nginx -m command -a 'date'
172.16.17.1 | success | rc=0 >>
Thu Oct 22 00:51:39 CST 2015
172.16.17.22 | success | rc=0 >>
Thu Oct 22 00:51:39 CST 2015
四、user 添加用戶
[root@localhost ~]# ansible-doc -s user
createhome 除非設置爲「不」,一個主目錄將爲用戶建立帳戶時或者主目錄不存在。
force 當狀態 爲absent就如使用 `userdel --force'同樣
generate_ssh_key 是否產生問題中的用戶的SSH密鑰。這將不會覆蓋現有的SSH密鑰。
groups 列出全部用戶組當 groups=空的時候把附加組都刪除
home 給用戶建立家目錄
move_home 修改用戶的家目錄
name= 建立刪除修改時候須要的指定用戶
password 給用戶添加一個祕密
remove 刪除用戶至關於`state=absent',
shell 指定擁護採用的shell格式
state 不管該賬戶是否存在若是該狀態與所述狀態不一樣則採起行動。
system 建立系統用戶
uid 指定擁護UID
update_password 更改祕密
須要特別說明的是password後面指定的密碼不能是明文後面這一串密碼會被直接傳送到被管理主機的/etc/shadow文件中而登錄的時候輸入的密碼會被hash加密之後再去與/etc/shadow中存放的密碼去作對比會出現不一致的現象。因此須要先將密碼字符串進行加密處理openssl passwd -salt -1 "123456"而後將獲得的字符串放到password中便可。
五、group 用戶組管理
gid 指定用戶組GUD
name= 指定用戶組名
state 該組是否應該在遠程主機上
system 建立用戶組
六、cron 遠程客戶端執行任務計劃
backup 在建立新的crontab任務以前對其以前建立的進行備份
cron_file 若是肯定使用這個文件使用使用cron。D而不是單個用戶的crontab。
day # Day of the month the job should run ( 1-31, *, */2, etc )
hour # Hour when the job should run ( 0-23, *, */2, etc )
job # The command to execute. Required if state=present.
minute # Minute when the job should run ( 0-59, *, */2, etc )
month # Month of the year the job should run ( 1-12, *, */2, etc )
name= # Description of a crontab entry.
state # Whether to ensure the job is present or absent.
user # The specific user whose crontab should be modified.
weekday # Day of the week that the job should run ( 0-6 for Sunday-Saturday, *, etc )
例子
[root@wp ~]# ansible all -m cron -a 'name="sync time from ntpserver"state=present minute=*/3 job="/bin/cat /etc/issue &> /dev/null"'
[root@wp ~]# ansible all -m cron -a 'name="sync time from ntpserver"state=absent '
七、copy 複製文件
複製文件到遠程主機
copy模塊包含以下選項
backup在覆蓋以前將原文件備份備份文件包含時間信息。有兩個選項yes|no
content用於替代"src",能夠直接設定指定文件的值
dest必選項。要將源文件複製到的遠程主機的絕對路徑若是源文件是一個目錄那麼該路徑也必須是個目錄
directory_mode遞歸的設定目錄的權限默認爲系統默認權限
force若是目標主機包含該文件但內容不一樣若是設置爲yes則強制覆蓋若是爲no則只有當目標主機的目標位置不存在該文件時才複製。默認爲yes
others全部的file模塊裏的選項均可以在這裏使用
src要複製到遠程主機的文件在本地的地址能夠是絕對路徑也能夠是相對路徑。若是路徑是一個目錄它將遞歸複製。在這種狀況下若是路徑使用"/"來結尾則只複製目錄裏的內容若是沒有使用"/"來結尾則包含目錄在內的整個內容所有複製相似於rsync。
示例
ansible test -m copy -a "src=/etc/issue dest=/tmp/issue owner=root group=root mode=0644"
ansible nginx -m copy -a 'src=/etc/issue dest=/tmp/issue backup=yes'
八、ping 測試網絡使用的
[root@localhost ~]# ansible nginx -m ping
172.16.17.1 | success >> {
"changed": false,
"ping": "pong"
}
172.16.17.22 | success >> {
"changed": false,
"ping": "pong"
}
9.shell
切換到某個shell執行指定的指令參數與command相同。
示例
ansible test -m shell -a "somescript.sh >> somelog.txt"
10.service
用於管理服務
該模塊包含以下選項
arguments給命令行提供一些選項
enabled是否開機啓動 yes|no
name必選項服務名稱
pattern定義一個模式若是經過status指令來查看服務的狀態時沒有響應就會經過ps指令在進程中根據該模式進行查找若是匹配到則認爲該服務依然在運行
runlevel運行級別
sleep若是執行了restarted在則stop和start之間沉睡幾秒鐘
state對當前服務執行啓動中止、重啓、從新加載等操做started,stopped,restarted,reloaded
示例
ansible test -m service -a "name=httpd state=started enabled=yes"
ansible test -m service -a "name=foo pattern=/usr/bin/foo state=started"
ansible test -m service -a "name=network state=restarted args=eth0"
11.filesystem
在塊設備上建立文件系統
選項
dev目標塊設備
force在一個已有文件系統的設備上強制建立
fstype文件系統的類型
opts傳遞給mkfs命令的選項
12.yum
使用yum包管理器來管理軟件包
選項
config_fileyum的配置文件
disable_gpg_check關閉gpg_check
disablerepo不啓用某個源
enablerepo啓用某個源
list
name要進行操做的軟件包的名字也能夠傳遞一個url或者一個本地的rpm包的路徑
state狀態presentabsentlatest
示例
ansible test -m yum -a 'name=httpd state=latest'
ansible test -m yum -a 'name="@Development tools" state=present'
ansible test -m yum -a 'name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present'
13.mount
配置掛載點
選項
dump
fstype必選項掛載文件的類型
name必選項掛載點
opts傳遞給mount命令的參數
passno
src必選項要掛載的文件
state必選項
present只處理fstab中的配置
absent刪除掛載點
mounted自動建立掛載點並掛載之
umounted卸載
示例
name=/mnt/dvd src=/dev/sr0 fstype=iso9660 opts=ro state=present
name=/srv/disk src='LABEL=SOME_LABEL' state=present
name=/home src='UUID=b3e48f45-f933-4c8e-a700-22a159ec9077' opts=noatime state=present
ansible test -a 'dd if=/dev/zero of=/disk.img bs=4k count=1024'
ansible test -a 'losetup /dev/loop0 /disk.img'
ansible test -m filesystem 'fstype=ext4 force=yes opts=-F dev=/dev/loop0'
ansible test -m mount 'name=/mnt src=/dev/loop0 fstype=ext4 state=mounted opts=rw'
第三部分創建一個完整的劇本
一、對於ansible來講有點像現實生活中的編劇同樣。可以爲定義好須要的各類角色每一個角色在所須要的環境中所扮演的的角色及其做用範圍。先說明下一個ansible劇本所須要的劇本以及須要執行的動做
[root@node1 ~]# tree ansible_playbook/
ansible_playbook/——首先須要給整個劇本一個劇本名稱而這個就是劇本的名字
├── pcsd.yml——指定扮演角色的身份及其執行前後順序
└── roles——建立管理全部角色的目錄
├── pacemaker——建立角色一的目錄其中可以定義相對角色可以執行的命令
│ ├── files——存放一些能夠在全部可以扮演相對角色能複製執行的腳步目錄
│ ├── handlers——存放須要可以重啓的文件地
│ ├── meta
│ ├── tasks——這個目錄是最終要的目錄定義角色須要現實的功能以下
│ │ └── main.yml——
│ ├── templates——定義模板的目錄可以在定義全部的host中實現
│ └── vars——定義角色鎖所能使用的變量
└── synctime
├── files
├── handlers
├── meta
├── tasks
│ └── main.yml
├── templates
└── vars
[root@node1 ~]#
二、對單個角色進行分析說明
對於每一個角色都須要上面定義的每一個目錄fileshandlerstemplatestasksvarsmeta。
Handers此目錄中應當包含一個main.yml文件用於定義此角色用到的各handler在handler中使用include包含的其它的handler文件也應該位於此目錄中
Tasks此目錄至少應該包含一個名爲main.yml的文件其定義了此角色的任務列表此文件可使用include包含其它的位於此目錄中的task文件
Files對於此目錄來講主要存放可以copy及其script執行的文件
Templates此目錄定義template模塊可以調用的模板此目錄中的文件以jinjia2格式定義
vars目錄應當包含一個main.yml文件用於定義此角色用到的變量
meta目錄應當包含一個main.yml文件用於定義此角色的特殊設定及其依賴關係ansible 1.3及其之後的版本才支持
三、對於一個角色所能扮演的功能進行說明
對於handers來講須要包含一個main.yml文件主要定義的以下
[root@localhost ansible_playbook]# cat roles/keepalived/handlers/main.yml
- name: restart keepalived相對於來講- name只是書寫的方式是固定的格式主要做用在於標明須要執行的程序名稱及其所要執行的動做
service: name=keepalived state=restarted此命令纔是真正可以執行的動做
[root@localhost ansible_playbook]#
對於tasks來講主要是用來定義當前角色所可以執行的動做以下
[root@localhost ansible_playbook]# cat roles/keepalived/tasks/main.yml
- name: install keepalived——對於name來講在ansible中是啓動一個標識的做用不會被執行。而跟在name下面的命令纔會被執行
yum: name=keepalived state=present——經過yum進行安裝程序
- name: template configure file——
template: src=keepalived.conf.j1 dest=/etc/keepalived/keepalived.conf——定義須要執行的模板及其模板在相對於客戶戶端可以生成的文件
when: ansible_nodename == 'node3.dns.com'——相對於ansible而言還可以在執行劇本的時候進行必定程度上的判斷來對管理主機進行分別的管理
tags: conffile——標明當配置文件若是沒有發生改變即跳過執行
notify: ——通告
- restart keepalived——可以執行相對管理主機上的對於服務須要重啓
- name: template configure file
template: src=keepalived.conf.j2 dest=/etc/keepalived/keepalived.conf
when: ansible_nodename == 'node1.dns.com'
tags: conffile
notify:
- restart keepalived
- name: start keepalived service
service: name=keepalived state=started
四、補充的部分
在tasks中的main.yml中還以使用不少的命令幾乎ansible能操做的命令都能在其中定義
當有須要重複性執行的任務時可使用迭代機制。其使用格式爲將須要迭代的內容定義爲item變量引用並經過with_items語句來指明迭代的元素列表便可。
- name: add system users
user: name={{ item }} state=present groups=test
with_items:
- test1
- test2
五、劇本定義完成以後就能夠去執行劇本猶如演繹出話劇同樣
[root@wp ansible_playbook]# ansible-palybook keepalived.yml
PLAY [keepalived] *************************************************************
GATHERING FACTS ***************************************************************
[0;32mok: [172.16.17.3][0m
[0;32mok: [172.16.17.1][0m
TASK: [synctime | sync time from 172.16.0.1] **********************************
[0;32mok: [172.16.17.1][0m
[0;32mok: [172.16.17.3][0m
TASK: [keepalived | install keepalived] ***************************************
[0;32mok: [172.16.17.3][0m
[0;32mok: [172.16.17.1][0m
TASK: [keepalived | template configure file] **********************************
[0;36mskipping: [172.16.17.1][0m
[0;36mskipping: [172.16.17.3][0m
TASK: [keepalived | template configure file] **********************************
[0;36mskipping: [172.16.17.1][0m
[0;36mskipping: [172.16.17.3][0m
TASK: [keepalived | start keepalived service] *********************************
[0;32mok: [172.16.17.3][0m
[0;32mok: [172.16.17.1][0m
PLAY RECAP ********************************************************************
changed=4 unreachable=0 failed=0
changed=4 unreachable=0 failed=0