http://www.tuicool.com/wx/vUfYVfA
一、ansible 安裝
ansible 依賴(lài)于python2.6或更高的版本、paramiko、PyYAML及Jinja2。
https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz
tar xvzf Python-2.7.8.tgz
cd Python-2.7.8
./configure --prefix=/usr/local
make --jobs=grep processor/proc/cpuinfo | wc -l
make install
將python頭文件拷貝到標(biāo)準(zhǔn)目錄,以避免編譯ansible時(shí),找不到所需的頭文件
cd /usr/local/include/python2.7
cp -a ./* /usr/local/include/
備份舊版本的python,并符號(hào)鏈接新版本的python
cd /usr/bin
mv python python2.6
ln -s /usr/local/bin/python
修改yum腳本,使其指向舊版本的python,已避免其無(wú)法運(yùn)行
vim /usr/bin/yum
!/usr/bin/python --> #!/usr/bin/python2.6
1.1 編譯安裝
解決依賴(lài)關(guān)系
yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
解壓安裝包
https://github.com/ansible/ansible/archive/v1.7.2.tar.gz
tar xf ansible-1.5.4.tar.gz # cd ansible-1.5.4
編譯安裝
python setup.py build # python setup.py install
拷貝配置文件
mkdir /etc/ansible # cp -r examples/* /etc/ansible
1.2 rpm包安裝
使用阿里云鏡像源即可,這里為了方便使用,就直接使用yum安裝了。
Fedora 用戶可直接安裝Ansible, 但RHEL或CentOS用戶,需要 配置 EPEL # yum install -y epel-release # yum install -y ansible
注意:不同版本的ansible的功能差異可能較大。
二、配置
配置文件:/etc/ansible/ansible.cfg
hostfile=/etc/ansible/hosts #指定默認(rèn)hosts配置的位置 host_key_checking = False #不進(jìn)行host_key檢查,省去目標(biāo)key發(fā)生變化時(shí)輸入(yes/no)的步驟 ask_pass=True # 每次執(zhí)行ansible命令是否詢問(wèn)ssh密碼 ask_sudo_pass=True # 每次執(zhí)行ansible命令時(shí)是否詢問(wèn)sudo密碼
主機(jī)清單:/etc/ansible/hosts
主程序:ansible、ansible paly-book、ansible-doc
1、將要管理的主機(jī)納入 /etc/ansible/hosts配置文件中,可以填寫(xiě)IP或是主機(jī)名
[WebServers] 10.10.10.3 10.10.10.4
2、.基于ssh的方式與被管理的主機(jī)進(jìn)行通信,在管理的主機(jī)上(部署ansible的主機(jī)上)生成一對(duì)非對(duì)稱(chēng)密鑰,將公鑰發(fā)給被管理的主機(jī)。
a,生成密鑰對(duì):ssh-keygen -t rsa
b,將密鑰發(fā)放到要管理的主機(jī):ssh-copy-id -i 10.10.10.3 或 ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.10.10.3
3、使用ansible命令測(cè)試
ansible all -m ping
[root@wlm yum.repos.d]# ansible all -m ping 10.10.10.4 | SUCCESS => { "changed": false, "ping": "pong" }
三、基本使用
1、常用命令
ansible-doc 命令:獲取模塊列表、模塊使用格式。
ansible-doc -l :獲取列表
ansible-doc -s module_name:獲取指定模塊信息
2、ansible 命令格式
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
<host-pattern> 指明管控主機(jī),以模式表示或者直接指定ip,必須事先指定在文件中;all所有
[-f forks] 指明每批管控多少主機(jī),默認(rèn)是5個(gè)主機(jī)一批次
[-m module_name] 使用何種模塊操作,所有操作都需要通過(guò)模塊指定
[-a args] 指明模塊專(zhuān)用參數(shù);args 一般是 key=value格式。注:command模塊的參數(shù)不是kv模式,而是直接給出要執(zhí)行的命令。
注意:<host-pattern> 默認(rèn)讀取/etc/ansible/hosts,也可以指明自定義文件路徑 -iPATH,--inventory=PATH:指明使用的 host inventory文件路徑;
3、常用模塊介紹
1、command模塊:遠(yuǎn)程主機(jī)上運(yùn)行命令
例:ansible hosts -m command -a "ls /tmp" 注:command模塊也可以省略。
給遠(yuǎn)程主機(jī)添加用戶、設(shè)置密碼:
ansible hosts -a 'useradd user1'
ansible hosts -a 'echo abc | passwd --stdin user1'
直接這樣使用不會(huì)成功,只會(huì)添加用戶密碼不會(huì)設(shè)置成功,不支持管道符,下面介紹shell模塊
2、shell模塊:遠(yuǎn)程主機(jī)在shell進(jìn)程下運(yùn)行命令,支持shell特性,也支持管道符。
ansible hosts -m shell -a 'echo abc | passwd --stdin user1'
10.10.10.4 | SUCCESS | rc=0 >>
3、copy模塊:把當(dāng)前主機(jī)文件復(fù)制到遠(yuǎn)程主機(jī)位置,可以指定mode、own、group
ansible hosts -m copy -a 'src=/tmp/abc.txt dest=/root/ mode=644 owner=ansible group=root'
10.10.10.4 | SUCCESS => { "changed": true, "checksum": "325287cee456533bf76025312e5d05e842cb43a9", "dest": "/root/abc.txt", "gid": 0, "group": "root", "md5sum": "1c6d47c6e4d59c630751b47fff140b89", "mode": "0644", "owner": "ansible", "size": 15, "src": "/root/.ansible/tmp/ansible-tmp-1484639082.19-114656107854348/source", "state": "file", "uid": 0 }
4、cron模塊:在遠(yuǎn)程主機(jī)指定crontab周期性計(jì)劃任務(wù)
minute= hour= day= month= weekday= job= name= (必須填寫(xiě)) state=
ansible all -m cron -a "minute=*/10 job='/sbin/ntpdate 10.10.10.10 & >/dev/null' name=synctime" 可使用crontab -l查看
在管理的主機(jī)上可以刪除制定的計(jì)劃任務(wù)
ansible all -m cron -a 'state=absent name=synctome'
10.10.10.4 | SUCCESS => { "changed": true, "envs": [], "jobs": [] }
5、fetch模塊:和copy相反,從遠(yuǎn)程主機(jī)拷貝文件到本地主機(jī)
ansible all -m fetch -a "src=/root/abc.txt dest=/root/kel/ flat=yes"
可以不要flat=yes參數(shù),但作用:
當(dāng)dest=/root/kel/ ,abc.txt會(huì)保存在/root/kel/目錄下
當(dāng)dest=/root/kel ,會(huì)拷貝abc.txt文件,并命名成kel
6、file模塊:file模塊包含了文件、文件夾、超級(jí)鏈接類(lèi)的創(chuàng)建、拷貝、移動(dòng)、刪除
ansible all -m file -a
修改文件的所有組、人、權(quán)限
path=/etc/foo.conf owner=foo group=foo mode=0644
操作連接的案例
src=/file/to/link/to dest=/path/ro/symlink owner=foo group=foo state=link
參數(shù)化案例
src=/tmp/{{item.path}} dest={{item.dest}} state=link with_items:
- { path: 'x',dest: 'y' } - { path: 'z',dest: 'k' }
使用touch創(chuàng)建一個(gè)空文件并定義權(quán)限
path=/etc/foo.conf state=touch mode="u=rw,g=w,o=r"
touch一個(gè)空文件,并修改權(quán)限
path=/etc/foo.conf state=touch mode="u+w,g-w,o-rw"
7、yum模塊:用于yum安裝安裝和卸載
ansible all -m yum -a "name=httpd"
8、service模塊:服務(wù)管理
ansible all -m service -a "name=httpd state=started/stopped enabled=yes"
9、user/group模塊:user模塊管理用戶;group模塊管理group
ansible all -m user -a 'name=user1 group=root' 添加用戶,更改屬組
ansible all -m user -a 'name=user1 state=absent remove=yes' 刪除用戶
ansible all -m group -a "name=test1 state=absent" 刪除用戶組
四、Playbook劇本
playbook 是ansible更強(qiáng)大的配置管理組件,實(shí)現(xiàn)基于文本文件編排執(zhí)行的多個(gè)任務(wù),且多次重復(fù)執(zhí)行。playbook組織格式為使用YAML語(yǔ)言來(lái)編寫(xiě)的。
playbook 是由一個(gè)或多個(gè)“play”組成的列表。play的主要功能在于將事先歸為一組的主機(jī)裝扮成事先通過(guò)ansible中的task定義好的角色。從根本上講,所謂的task無(wú)非是調(diào)用ansible的一個(gè)module。將多個(gè)play組織在一個(gè)playbook中,即可以讓他們聯(lián)通起來(lái)按事先編排的機(jī)制生效。
1、例子:
在ansible主機(jī)上的root目錄下創(chuàng)建httpd目錄,將本機(jī)的httpd.conf文件拷貝到該目錄下,修改配置文件里的監(jiān)聽(tīng)端口是8081
vim web.yaml
- hosts: webservers
remote_user:root #root前不能有空格
tasks: #任務(wù)列表
- name:install httpd package #設(shè)置任務(wù)名稱(chēng)非必要
yum name=httpd state=present #yum后的: 刪除掉
- name:install configure file
copy src=/root/httpd/httpd.conf dest=/etc/httpd/conf
- name:start httpd service
service name=httpd state=started
注意:yaml文件中支持#;下面的操作要跟上面的name對(duì)齊。
測(cè)試:
ansible-playbook --check playbook :只檢測(cè)可能會(huì)發(fā)生的改變,但不真正執(zhí)行操作
ansible-playbook playbook :直接執(zhí)行
ansible-playbook --list-hosts :列出運(yùn)行任務(wù)的主機(jī)

2、playbook介紹
設(shè)置在特定條件下觸發(fā):
a,某任務(wù)的狀態(tài)在運(yùn)行后為changed時(shí),可通過(guò)“notify”通知給相應(yīng)的handles;
handles:任務(wù)在特定條件下觸發(fā);接收到其他任務(wù)的通知是被觸發(fā);
b,任務(wù)可以通過(guò)“tags”打標(biāo)簽,而后可在ansible-playbook命令上使用-t指定進(jìn)行調(diào)用;