一、簡單介紹Ansible
ansible是一個(gè)基于Python開發(fā)的自動(dòng)化運(yùn)維工具!其功能實(shí)現(xiàn)基于SSH遠(yuǎn)程連接服務(wù)!ansible可以實(shí)現(xiàn)批量系統(tǒng)配置、批量軟件部署、批量文件拷貝、批量運(yùn)行命令等功能。批量運(yùn)行命令等功能。ansible是基于模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運(yùn)行的模塊,ansible只是提供一種框架。主要包括:
(1)、連接插件connection plugins:負(fù)責(zé)和被監(jiān)控端實(shí)現(xiàn)通信;
(2)、host inventory:指定操作的主機(jī),是一個(gè)配置文件里面定義監(jiān)控的主機(jī);
(3)、各種模塊核心模塊、command模塊、自定義模塊;
(4)、借助于插件完成記錄日志郵件等功能;
(5)、playbook:劇本執(zhí)行多個(gè)任務(wù)時(shí),非必需可以讓節(jié)點(diǎn)一次性運(yùn)行多個(gè)任務(wù)。
特點(diǎn):
1、不需要單獨(dú)安裝客戶端,基于系統(tǒng)自帶的sshd服務(wù),sshd就相當(dāng)于ansible的客戶端。
2、不需要服務(wù)端。
3、需要依靠大量的模塊實(shí)現(xiàn)批量管理。
4、配置文件/etc/ansible/ansible.cfg。
特性
(1)、no agents:不需要在被管控主機(jī)上安裝任何客戶端;
(2)、no server:無服務(wù)器端,使用時(shí)直接運(yùn)行命令即可;
(3)、modules in any languages:基于模塊工作,可使用任意語言開發(fā)模塊;
(4)、yaml,not code:使用yaml語言定制劇本playbook;
(5)、ssh by default:基于SSH工作;
(6)、strong multi-tier solution:可實(shí)現(xiàn)多級指揮。
優(yōu)點(diǎn)
(1)、輕量級,無需在客戶端安裝agent,更新時(shí),只需在操作機(jī)上進(jìn)行一次更新即可;
(2)、批量任務(wù)執(zhí)行可以寫成腳本,而且不用分發(fā)到遠(yuǎn)程就可以執(zhí)行;
(3)、使用python編寫,維護(hù)更簡單,ruby語法過于復(fù)雜;
(4)、支持sudo。
中文手冊參考地址:http://www.ansible.com.cn/docs/intro.html
官方文檔參考地址:http://docs.ansible.com/
二、安裝Ansible管理端
Ansible安裝的方式很多,可以是源碼、APT、PIP、YUM等方式安裝。
RPM適用于 EPEL6/7, 以及仍在支持中的Fedora發(fā)行版。托管節(jié)點(diǎn)的操作系統(tǒng)版本可以是更早的版本(如 EL5), 但必須安裝 Python 2.4 或更高版本的Python。Fedora 用戶可直接安裝Ansible, 但RHEL或CentOS用戶,需要配置EPEL。
PIP安裝方式
步驟1:CentOS/Rhel都需要安裝epel源,有的系統(tǒng)是自帶epel源的,不同的版本請看情況而設(shè)置。
rpm -ivh https://mirrors.aliyun.com/epel/6/x86_64/epel-release-6-8.noarch.rpm
步驟2:安裝python-pip及python-devel程序包
yum install python-pip python-devel -y
步驟3:安裝Ansible服務(wù)。
安裝請前確保服務(wù)器的gcc、glibc開發(fā)環(huán)境均已安裝,系統(tǒng)幾乎所有的軟件包編譯環(huán)境均基于gcc,如不確認(rèn)可先執(zhí)行如下命令:
yum install gcc glibc-devel zlib-devel rpm-build openssl-devel -y
升級本地PIP至最新版本
pip install --upgrade pip
安裝Ansible服務(wù)
pip install ansible --upgrade
執(zhí)行命令ansible --version,有類似如下返回結(jié)果則表示Ansible安裝成功并可正常使用。
[root@aa-77-0001 ~]# ansible --version
ansible 2.3.0.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
python version = 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) [GCC 4.4.7 20120313 (Red Hat 4.4.7-17)]
|
YUM安裝方式
YUM(Yellow dog Updater,Modified)是一個(gè)在Fedora和RedHat以及CentOS中的Shell前端軟件包管理器。基于RPM包管理,能夠從指定的服務(wù)器自動(dòng)下載RPM包并且安裝,可以自動(dòng)處理依賴性關(guān)系,并且一次安裝所有依賴的軟件包,無需煩瑣地一次次下載、安裝。YUM安裝Ansible過程如下:
步驟1:CentOS/Rhel都需要安裝epel源,有的系統(tǒng)是自帶epel源的,不同的版本請看情況而設(shè)置。
rpm -ivh https://mirrors.aliyun.com/epel/6/x86_64/epel-release-6-8.noarch.rpm
安裝absible
yum install ansible -y
安裝速度視網(wǎng)絡(luò)情況而定,因?yàn)榘惭b過程會安裝非常多的依賴包,又因各系統(tǒng)環(huán)境的差異性,如返回類似如下結(jié)果則表示安裝成功:
Installed:
ansible.noarch 0:2.3.0.0-3.el6
Dependency Installed:
python-babel.noarch 0:0.9.4-5.1.el6 python-crypto2.6.x86_64 0:2.6.1-2.el6 python-httplib2.noarch 0:0.7.7-1.el6
python-jinja2-26.noarch 0:2.6-3.el6 python-keyczar.noarch 0:0.71c-1.el6 python-markupsafe.x86_64 0:0.9.2-4.el6
python-simplejson.x86_64 0:2.0.9-3.1.el6 sshpass.x86_64 0:1.06-1.el6
Complete!
執(zhí)行命令ansible --version,有類似如下返回結(jié)果則表示Ansible安裝成功并可正常使用。
[root@aa-66-0001 ~]# ansible --version
ansible 2.3.0.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
python version = 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) [GCC 4.4.7 20120313 (Red Hat 4.4.7-17)]
APT-GET安裝方式
Apt-get全稱是Advanced Package Tool,是一款適用于UNIX和Linux系統(tǒng)的應(yīng)用程序管理器,適用于Ubuntu、Debian等deb包管理式的操作系統(tǒng),主要用于自動(dòng)地從互聯(lián)網(wǎng)的軟件倉庫中搜索、安裝、升級、卸載軟件或操作系統(tǒng)。
演示ubuntu16.04
安裝software-properties-common,舊的ubuntu為python-software-propertiesa
apt-get install software-properties-common
添加Ansible源,用于2.0版本,2.0以前ppa:ansible / ansible - 1.9
apt-add-repository ppa:ansible/ansible
升級庫文件
apt-get update
安裝ansible
apt-get install ansible
源碼安裝方式
安裝git
yum -y install git
安裝ansible
git clone git://github.com/ansible/ansible.git --recursive
切換到程序目錄
cd ./ansible
執(zhí)行env_setup腳本安裝ansible
source ./hacking/env-setup
如上列舉了互聯(lián)網(wǎng)主流系統(tǒng)的Ansible安裝方式,如整個(gè)過程均無報(bào)錯(cuò),則執(zhí)行如下命令應(yīng)有類似結(jié)果返回:
[root@ansible ~]# ansible --version
ansible 2.3.0.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
python version = 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) [GCC 4.4.7 20120313 (Red Hat 4.4.7-17)]
如上述命令能正常執(zhí)行,表示Ansible安裝成功,并可正常使用。通常情況下,Ansible的安裝簡單順利,但確實(shí)會有安裝報(bào)錯(cuò)的情況發(fā)生,多數(shù)情況是由本地復(fù)雜的系統(tǒng)環(huán)境導(dǎo)致的。
本人是yum安裝,且基于CentOS7.3系統(tǒng)。
rpm -ivhU https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm
yum -y install ansible
[root@ansible ~]# ansible --version
ansible 2.3.0.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
python version = 2.7.5 (default, Nov 6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
三、Ansible環(huán)境配置
修改Ansible配置文件
ansible默認(rèn)配置文件為/etc/ansible/ansible.cfg,如果不存在ansible目錄,需要自己創(chuàng)建
vim /etc/ansible/ansible.cfg
inventory = /etc/ansible/hosts #默認(rèn)主機(jī)清單配置文件
private_key_file = /root/.ssh/id_rsa #指定默認(rèn)驗(yàn)證key。可以使用--private-key指定其他key
sudo_user = root #sudo使用的默認(rèn)用戶 ,默認(rèn)是root
remote_user = fsp #指定遠(yuǎn)端登錄用戶為fsp,默認(rèn)是root
module_name = command #執(zhí)行命令時(shí)候的默認(rèn)模塊,建議改成shell模塊
forks = 20 #默認(rèn)5個(gè)進(jìn)程并行處理操作,可以設(shè)置為20個(gè)
log_path = /var/log/ansible.log #執(zhí)行命令的log記錄
......
更多配置參數(shù)和說明參見官方文檔
當(dāng)你主機(jī)數(shù)量很多時(shí)候,期初應(yīng)該是可以使用root和密碼來登錄,我們可以配置一個(gè)主機(jī)組來檢測這些主機(jī)存活狀態(tài),配置如下:
/etc/ansible/hosts這個(gè)是默認(rèn)的主機(jī)組配置文件,默認(rèn)不需要在命令中指定。
當(dāng)然,也可以是別的文件,但是使用時(shí)候需用-i參數(shù)指定你的這個(gè)文件。
這里配置一個(gè)cnagroup的組,組包含了主機(jī)的ip地址,且配置文件單獨(dú)創(chuàng)建
vim /etc/ansible/hosts_cna
[cnagroup]
192.168.1.80
使用如下命令就可以檢測主機(jī)存活,輸入root密碼。需要注意,比較適用于root密碼一致的主機(jī)來批量操作。
[root@ansible ~]# ansible all -i /etc/ansible/hosts_cna -u root -k -m ping
SSH password:
192.168.1.80 | SUCCESS => {
"changed": false,
"ping": "pong"
}
參數(shù):
-i INVENTORY, --inventory-file=INVENTORY,default=/etc/ansible/hosts
-k --ask-pass ask for connection password
-u REMOTE_USER, --user=REMOTE_USER,default root
-m MODULE_NAME, --module-name=MODULE_NAME,(default=command)
-a MODULE_ARGS, --args=MODULE_ARGS
查看當(dāng)前用戶
[root@ansible ~]# ansible all -i /etc/ansible/hosts_cna -u root -k -m shell -a 'whoami'
SSH password:
192.168.1.80 | SUCCESS | rc=0 >>
root
需要注意,如果所有主機(jī)都是root,但是密碼不一樣話。就需要指定密碼、用戶等信息以下是Hosts部分中經(jīng)常用到的變量部分
參數(shù)解釋:
ansible_host #指定被管理的主機(jī)的真實(shí)IP,用于指定別名時(shí)候使用(2.0以前ansible_ssh_host)
ansible_port #指定被管理主機(jī)的ssh端口號,默認(rèn)是22(2.0以前ansible_ssh_port)
ansible_user #ssh連接時(shí)默認(rèn)使用的用戶名(2.0以前ansible_ssh_user)
ansible_ssh_pass #ssh連接時(shí)的密碼
ansible_sudo_pass #使用sudo連接用戶時(shí)的密碼
ansible_sudo_exec #如果sudo命令不在默認(rèn)路徑,需要指定sudo命令路徑
ansible_ssh_private_key_file #秘鑰文件路徑,秘鑰文件如果不想使用ssh-agent管理時(shí)可以使用此選項(xiàng)
ansible_shell_type #目標(biāo)系統(tǒng)的shell的類型,默認(rèn)sh
ansible_connection #SSH連接的類型:local,ssh,paramiko, 1.2之前默認(rèn)paramiko(若要用則跟ansible_connection=paramiko),后來智能選擇,優(yōu)先使用基于ControlPersist的ssh(支持的前提)
ansible_python_interpreter #用來指定python解釋器的路徑,默認(rèn)為/usr/bin/python 同樣可以指定ruby 、perl 的路徑
.......
后續(xù)都會用到,其中ansible_ssh_pass密碼是明文,不安全。ansible 極力推薦使用 --ask-pass 選項(xiàng)或使用 SSH keys.
這個(gè)時(shí)候可以將密碼配置好之后使用shell模塊檢測當(dāng)前登錄用戶
配置主機(jī)配置文件,指定默認(rèn)root用戶的密碼,第一條是指定了root的密碼。
第二條指定了連接remote的用戶,如果默認(rèn)使用root用戶話可以不寫,因?yàn)閐efault is root。
[cnagroup]
192.168.1.80 ansible_ssh_pass=123.comA
#192.168.1.80 ansible_user=root ansible_ssh_pass=123.comA
#檢測
ansible all -i /etc/ansible/hosts_cna -m ping
#也可以執(zhí)行簡單的命令
[root@ansible ~]# ansible all -i /etc/ansible/hosts_cna -m command -a 'whoami'
192.168.1.80 | SUCCESS | rc=0 >>
root
下面進(jìn)行簡單安全配置,步驟如下:
#在客戶端上創(chuàng)建普通用戶fsp,且具有su權(quán)限。并設(shè)置fsp用戶密碼。可以批量執(zhí)行。
ansible all -i /etc/ansible/hosts_cna -m shell -a '/usr/sbin/useradd -G wheel fsp && /bin/echo 123.comAB|passwd --stdin fsp'
#查詢用戶是否存在和所在的wheel組
ansible all -i /etc/ansible/hosts_cna -m command -a 'id fsp'
#同時(shí)root禁止遠(yuǎn)程登錄,只能fsp登錄之后再su - root。
ansible all -i /etc/ansible/hosts_cna -m command -a 'sed -i "s/^#PermitRootLogin.*/PermitRootLogin no/g" /etc/ssh/sshd_config'
#確認(rèn)是否拒絕root遠(yuǎn)程登錄
ansible all -i /etc/ansible/hosts_cna -m shell -a 'grep -i PermitRootLogin.* /etc/ssh/sshd_config'
#重啟sshd服務(wù)
ansible all -i /etc/ansible/hosts_cna -m command -a '/etc/init.d/sshd restart'
#這時(shí)候root登錄就被拒絕,即Ansible管理端也使用不了,這時(shí)候需要命令指定普通用戶和密碼,su切換到root等參數(shù),注意清單中無需指定主機(jī)變量。
在2.0以前版本方法如下(普通用戶和提權(quán)root用戶):
ansible all -i /etc/ansible/hosts_cna -u fsp -k -m shell -a 'whoami'
ansible all -i /etc/ansible/hosts_cna -u fsp -k --su --su-user=root --ask-su-pass -m shell -a 'whoami'
在2.0以后版本方法如下,僅僅是提權(quán)不一樣,1.9命令會被棄用:
ansible all -i /etc/ansible/hosts_cna -u fsp -k -b --become-method=su --become-user=root --ask-become-pass -m shell -a 'whoami'
普通用戶使用key驗(yàn)證,禁止密碼登錄:
#在這之前,需要考慮如何將公鑰一次性分發(fā)到所有客戶端。可以使用expect、sshpass寫循環(huán)分發(fā)或ansible等工具,這里使用后者。
#如何分發(fā)公鑰呢?首先以root登陸ansible,在上執(zhí)行如下命令生成空密碼的私鑰和公鑰的密鑰對
[root@ansible ~]# ssh-keygen -t rsa -P ''
#這時(shí)候在root目錄下生成.ssh目錄,.ssh下有id_rsa和id_rsa.pub文件。
#使用如下命令將公鑰id_rsa.pub復(fù)制到客戶端/home/fsp/.ssh目錄下即可。可以批量操作。
#創(chuàng)建/home/fsp/.ssh,且.ssh權(quán)限為700
ansible all -i /etc/ansible/hosts_cna -u fsp -k -m shell -a 'mkdir -m 700 -p /home/fsp/.ssh'
#創(chuàng)建文件authorized_keys且權(quán)限改為600
ansible all -i /etc/ansible/hosts_cna -u fsp -k -m shell -a 'touch /home/fsp/.ssh/authorized_keys && chmod 600 /home/fsp/.ssh/authorized_keys'
#追加公鑰到authorized_keys文件中,$key為公鑰,復(fù)制粘貼即可,注意不能引用變量。
ansible all -i /etc/ansible/hosts_cna -u fsp -k -m shell -a 'echo "$key" >/home/fsp/.ssh/authorized_keys'
#需要注意,scp等操作,這樣復(fù)制過去還得需要在客戶端上改名為authorized_keys,權(quán)限還得設(shè)置600。這些上面已經(jīng)做了操作。如果么有.ssh目錄還得創(chuàng)建且權(quán)限為700
#如果使用ssh-copy-id命令復(fù)制不需要操作。
#使用key指定驗(yàn)證,看是否OK
ansible all -i /etc/ansible/hosts_cna -u fsp --private-key=/root/.ssh/id_rsa -m shell -a 'whoami'
#如果上面都回顯OK,那么就可以批量配置所有主機(jī)不接受密碼驗(yàn)證登錄。注意,先配置好普通用戶key。在做這個(gè)操作。
ansible all -i /etc/ansible/hosts_cna -u fsp --private-key=/root/.ssh/id_rsa --su --su-user=root --ask-su-pass -m shell -a 'sed -i "s/^PasswordAuthentication.*/PasswordAuthentication no/g" /etc/ssh/sshd_config'
#檢查和加載
ansible all -i /etc/ansible/hosts_cna -u fsp --private-key=/root/.ssh/id_rsa --su --su-user=root --ask-su-pass -m shell -a 'grep -i "^PasswordAuthentication.*" /etc/ssh/sshd_config'
ansible all -i /etc/ansible/hosts_cna -u fsp --private-key=/root/.ssh/id_rsa --su --su-user=root --ask-su-pass -m shell -a '/etc/init.d/sshd reload'
#優(yōu)化命令使用,比較簡短
private_key_file = /root/.ssh/id_rsa #在ansible.cfg中指定key,
sudo_user = root #sudo使用的默認(rèn)用戶 ,默認(rèn)是root
remote_user = fsp #指定遠(yuǎn)端登錄用戶為fsp,默認(rèn)是root
#最后可以使用如下命令
ansible all -i /etc/ansible/hosts_cna --su --ask-su-pass -m shell -a 'whoami'
四、Ansible常用模塊
幫助信息說明,其中ansible-doc -l是查看所有自帶的模塊,ansible-doc shell查看模塊具體用法和參數(shù)等
ansible-doc
-h, --help show this help message and exit
-l, --list List available modules
-M MODULE_PATH, --module-path=MODULE_PATH
-s, --snippet #搜索
-v, --verbose verbose mode (-vvv for more, -vvvv to enable connection debugging)
--version show program's version number and exit
執(zhí)行ping模塊:ping
#ping模塊的參數(shù):
#該模塊并無參數(shù),僅僅是檢查主機(jī)是否存活
#用于檢測主機(jī)是否存活
[root@ansible ~]# ansible all -i /etc/ansible/hosts_cna --su --ask-su-pass -m ping
SU password:
192.168.1.182 | SUCCESS => {
"changed": false,
"ping": "pong"
}
執(zhí)行命令模塊:command
#需要注意,此模塊不支持 "<",">","|","&"等復(fù)雜的參數(shù),需要支持該參數(shù)的話,請使用shell模塊。由于默認(rèn)是command模塊,所以不需要指定 -m command參數(shù)
#command模塊參數(shù):
chdir 運(yùn)行這個(gè)命令之前先進(jìn)入到目錄
creates 如果這個(gè)參數(shù)對應(yīng)的文件存在,就不運(yùn)行command
executable 將shell切換為command執(zhí)行,這里的所有命令需要使用絕對路徑
removes 如果這個(gè)參數(shù)對應(yīng)的文件不存在,就不運(yùn)行command
#例如當(dāng)前登錄用戶
[root@ansible ~]# ansible all -i /etc/ansible/hosts_cna --su --ask-su-pass -a 'id'
SU password:
192.168.1.105 | SUCCESS | rc=0 >>
uid=0(root) gid=0(root) groups=0(root)
執(zhí)行Shell模塊:shell
shell模塊參數(shù):
chdir 運(yùn)行這個(gè)命令之前先進(jìn)入到目錄
creates 如果這個(gè)參數(shù)對應(yīng)的文件存在,就不運(yùn)行command
executable 將shell切換為command執(zhí)行,這里的所有命令需要使用絕對路徑
removes 如果這個(gè)參數(shù)對應(yīng)的文件不存在,就不運(yùn)行command
#比如過濾一個(gè)進(jìn)程號
[root@ansible ~]# ansible all -i /etc/ansible/hosts_cna --su --ask-su-pass -m shell -a "ps -ef|grep sshd"
SU password:
192.168.1.160 | SUCCESS | rc=0 >>
root 22102 1 0 15:52 ? 00:00:00 /usr/sbin/sshd
root 27027 22102 0 22:40 ? 00:00:00 sshd: fsp [priv]
fsp 27029 27027 0 22:40 ? 00:00:00 sshd: fsp@pts/0
root 27097 27096 0 22:40 pts/0 00:00:00 /bin/sh -c ps -ef|grep sshd
root 27099 27097 0 22:40 pts/0 00:00:00 grep sshd
#先進(jìn)入tmp/ ,在tmp/目錄下讓所有節(jié)點(diǎn)運(yùn)行ss.sh并把log輸出到logs.txt
ansible all -i /etc/ansible/hosts_cna --su --ask-su-pass -m shell -a "sh ss.sh >> logs.txt chdir=/tmp/"
執(zhí)行copy模塊:copy
copy模塊參數(shù):
src 被復(fù)制到遠(yuǎn)程主機(jī)的本地文件,可以是絕對路徑,也可以是相對路徑,如果路徑是一個(gè)目錄,它將遞歸復(fù)制,在這種情況下,如果路徑使用"/"結(jié)尾,則只復(fù)制目錄里的內(nèi)容,如果沒有使用"/"結(jié)尾,則包含目錄在內(nèi)的整個(gè)內(nèi)容全部復(fù)制,類似rsync。
content 用于替代src,可以直接設(shè)定指定文件的內(nèi)容,拷貝到遠(yuǎn)程文件內(nèi)
dest 必選項(xiàng),絕對路徑,如果源文件是一個(gè)目錄,那么dest也必須是一個(gè)目錄
backup 在覆蓋前將源文件備份,備份文件包含時(shí)間信息,有兩個(gè)選項(xiàng)yes/no
directory_mode 遞歸設(shè)定目錄的權(quán)限,默認(rèn)為系統(tǒng)默認(rèn)權(quán)限
force 如果目錄主機(jī)包含該文件,但內(nèi)容不同,如果設(shè)置為yes,則強(qiáng)制覆蓋,如果為no,則只有當(dāng)目標(biāo)主機(jī)的目錄位置不存在該文件時(shí),才復(fù)制。默認(rèn)為yes
group 設(shè)定一個(gè)群組擁有拷貝到遠(yuǎn)程節(jié)點(diǎn)的文件權(quán)限
mode 等同于chmod,參數(shù)可以為“u+rwx or u=rw,g=r,o=r”
owner 設(shè)定一個(gè)用戶擁有拷貝到遠(yuǎn)程節(jié)點(diǎn)的文件權(quán)限
others 所有的file模塊里的選項(xiàng)都可以在這里使用
#把/root/fsp.conf文件拷貝到遠(yuǎn)程節(jié)點(diǎn)/tmp/fsp.conf,擁有者fsp,群組fsp,權(quán)限是0644
ansible all -i /etc/ansible/hosts_cna --su --ask-su-pass -m copy -a "src=/root/fsp.conf dest=/tmp/fsp.conf owner=fsp group=fsp mode=0700"
#復(fù)制本地ss.sh腳本到遠(yuǎn)端/tmp/目錄下
ansible all -i /etc/ansible/hosts_cna --su --ask-su-pass -m copy -a "src=/root/ss.sh dest=/tmp/ owner=root group=root mode=0700"
#過濾出IP地址信息
ansible all -i /etc/ansible/hosts_cna --su --ask-su-pass -m shell -a "source /etc/profile;ifconfig eth0|grep -Po '(?<=addr:)\S+'"
執(zhí)行file模塊:file
file模塊參數(shù):
force 需要在兩種情況下強(qiáng)制創(chuàng)建鏈接,一種是源文件不存在,但之后會建立的情況;另一種是目錄軟件鏈接已存在,需要先取消之前的軟鏈接,然后創(chuàng)建新的軟鏈接,有兩個(gè)選項(xiàng):yes/no
owner 定義文件/目錄的所有者
group 定義文件/目錄的歸屬組
mode 定義文件/目錄的權(quán)限
path 必選項(xiàng),定義文件/目錄的路徑
recurse 遞歸設(shè)置文件的屬性,只對目錄有效
src 被鏈接的源文件路徑,只應(yīng)用于state=link的情況
dest 補(bǔ)鏈接到的路徑,只應(yīng)用于state=link的情況
state:
directory 如果目錄不存在,就創(chuàng)建目錄
file 即使文件不存在,也不會被創(chuàng)建
link 創(chuàng)建軟鏈接
hard 創(chuàng)建硬鏈接
touch 如果文件不存在,則會創(chuàng)建一個(gè)新的文件,哪果文件或目錄已存在,則更新其最后的修改時(shí)間
absent 刪除目錄、文件或取消鏈接文件
#修改文件權(quán)限,所有者,分組(這些參數(shù)可以用在copy模塊中
ansible all -i /etc/ansible/hosts_cna --su --ask-su-pass -m file -a "dest=/tmp/ss.sh mode=0777 owner=root group=fsp"
#創(chuàng)建文件夾和刪除文件夾psswd
ansible all -i /etc/ansible/hosts_cna --su --ask-su-pass -m file -a "dest=/tmp/psswd mode=0755 owner=root group=root state=directory"
ansible all -i /etc/ansible/hosts_cna --su --ask-su-pass -m file -a "dest=/tmp/psswd state=absent"
執(zhí)行user模塊:user
user模塊參數(shù):
home 指定用戶的家目錄,需要與createhome配合使用
groups 指定用戶的屬組
uid 指定用戶的uid
password 指定用戶的密碼
name 指定用戶名
createhome 是否創(chuàng)建家目錄 yes|no
system 是否為系統(tǒng)用戶
remove 當(dāng)state=absent時(shí),remove=yes則表示連同家目錄一起刪除,等價(jià)于userdel -r
state 是創(chuàng)建還是刪除
shell 指定用戶的shell環(huán)境
#創(chuàng)建一個(gè)test用戶,注意用戶設(shè)置密碼話需要將密碼進(jìn)行加密處理,否則密碼明文過去在/etc/shadow中
ansible all -i /etc/ansible/hosts_cna1 --su --ask-su-pass -m user -a "name=test password=$1$XHdqEQxr$UWpgwPBpo/U95SWqH4wAx1"
echo "123.comA" |openssl passwd -1 -salt $(< /dev/urandom tr -dc '[:alnum:]' | head -c 32) -stdin
或
openssl passwd -1 123.comA
#備注,感覺不是很好使用,暫時(shí)濾過
執(zhí)行yum模塊:yum
yum模塊參數(shù):
config_file yum的配置文件
disable_gpg_check: 關(guān)閉gpg_check
disablerepo 不啟用某個(gè)源
enablerepo 啟用某個(gè)源
name 要進(jìn)行操作的軟件包的名字,也可以傳遞一個(gè)url或者一個(gè)本地的rpm包的路徑
state Whether to install (`present' or `installed', `latest'), or remove (`absent' or `removed') a package.
present:如果有就不進(jìn)行安裝
latest:安裝最新
absent:刪除
latest:更新
#安裝httpd
ansible all -i /etc/ansible/hosts_cna1 --su --ask-su-pass -m yum -a "state=present name=httpd"
執(zhí)行service模塊:service
該模塊包含如下選項(xiàng):
enabled: 是否開機(jī)啟動(dòng) yes|no
name: 必選項(xiàng),服務(wù)名稱
state: 對當(dāng)前服務(wù)執(zhí)行啟動(dòng),停止、重啟、重新加載等操作(started,stopped,restarted,reloaded)
pattern: 定義一個(gè)模式,如果通過status指令來查看服務(wù)的狀態(tài)時(shí),沒有響應(yīng),就會通過ps指令在進(jìn)程中根據(jù)該模式進(jìn)行查找,如果匹配到,則認(rèn)為該服務(wù)依然在運(yùn)行
runlevel:運(yùn)行級別
sleep: 如果執(zhí)行了restarted,在則stop和start之間沉睡幾秒鐘
還有很多模塊,比較常用如下,后期工作中按需求更新使用方法:
cron模塊
group模塊
script模塊
raw模塊
get_url模塊
synchronize模塊
五、Playbooks簡單配置使用
像很多其它配置文件管理方法一樣,Ansible使用一種比較直白的方法來描述自己的任務(wù)配置文件。Ansible 的任務(wù)配置文件被稱之為“playbook”,我們可以稱之為“劇本”。每一出劇本(playbook)中都包含一系列的任務(wù),這每個(gè)任務(wù)在ansible中又被稱為一出“戲劇”(play)。一個(gè)劇本(playbook)中包含多出戲劇(play),這很容易理解。
在Ansible中,我們就充當(dāng)編劇的角色,親自編寫劇本(一系列的服務(wù)器操作),讓一出出精彩的戲劇(play)巧妙配合,完成對服務(wù)器的一系列精確控制。
Playbook語法簡介
Playbook采用一種可讀性很高的且容易被人類閱讀的語法的YAML語法編寫,YAML: “YAML Ain’t a Markup Language”(YAML不是一種置標(biāo)語言)。該語言在被開發(fā)時(shí),YAML 的意思其實(shí)是:”Yet Another Markup Language”(仍是一種置標(biāo)語言),格式如下所示:
YAML
house:
family:
name: Doe
parents:
- John
- Jane
children:
- Paul
- Mark
- Simone
address:
number: 34
street: Main Street
city: Nowheretown
zipcode: 12345
對于 Ansible, 每一個(gè) YAML 文件都是從一個(gè)列表開始. 列表中的每一項(xiàng)都是一個(gè)鍵值對, 通常它們被稱為一個(gè) “哈希” 或 “字典”. 所以, 我們需要知道如何在 YAML 中編寫列表和字典.
YAML 還有一個(gè)小的怪癖. 所有的 YAML 文件(無論和 Ansible 有沒有關(guān)系)開始行都應(yīng)該是 ---
. 這是 YAML 格式的一部分, 表明一個(gè)文件的開始.
列表中的所有成員都開始于相同的縮進(jìn)級別, 并且使用一個(gè) "- "
作為開頭(一個(gè)橫杠和一個(gè)空格):
YAML特性
YAML的可讀性好
YAML和腳本語言的交互性好
YAML使用實(shí)現(xiàn)語言的數(shù)據(jù)類型
YAML有一個(gè)一致的信息模型
YAML易于實(shí)現(xiàn)
YAML語法
1 YAML使用可打印的Unicode字符,可使用UTF-8或UTF-16。
2 使用空白字符未文件縮排來表示結(jié)構(gòu);不過不能使用跳格字符。
3 注解由井字號( # )開始,可以出現(xiàn)在一行中的任何位置,而且范圍只有一行(也就是一般所謂的單行注解)
4 每個(gè)清單成員以單行表示,并用短杠+空白( - )起始。或使用方括號( [ ] ),并用逗號+空白( , )分開成員。
5 每個(gè)雜湊表的成員用冒號+空白( : )分開鍵值和內(nèi)容。或使用大括號( { } ),并用逗號+空白( , )分開。 雜湊表的鍵值可以用問號 ( ? )起始,用來明確的表示多個(gè)詞匯組成的鍵值。
6 字串平常并不使用引號,但必要的時(shí)候可以用雙引號 ( " )或單引號 ( ' )框住。使用雙引號表示字串時(shí),可用倒斜線( \ )開始的跳脫字符(這跟C語言類似)表示特殊字符。
7 區(qū)塊的字串用縮排和修飾詞(非必要)來和其他資料分隔,有新行保留(preserve)(使用符號 | )或新行折疊(flod)(使用符號 > )兩種方式。
8 在單一檔案中,可用連續(xù)三個(gè)連字號(——)區(qū)分多個(gè)檔案。另外,還有選擇性的連續(xù)三個(gè)點(diǎn)號( ... )用來表示檔案結(jié)尾。
9 重復(fù)的內(nèi)容可使從參考標(biāo)記星號 ( * )復(fù)制到錨點(diǎn)標(biāo)記( & )。
10 指定格式可以使用兩個(gè)驚嘆號 ( !! ),后面接上名稱。
11 檔案中的單一文件可以使用指導(dǎo)指令,使用方法是百分比符號( % )。有兩個(gè)指導(dǎo)指令
shell腳本與Playbook的轉(zhuǎn)換
現(xiàn)在越來越多的DevOPS也開始將目光移向了Ansible,因?yàn)锳nsible可以輕松的將shell腳本或簡單的shell命令轉(zhuǎn)換為Ansible plays。下面有一個(gè)安裝apache的shell腳本,大家來感受一下:
#!/bin/bash
#安裝Apache
yum -y install httpd httpd-devel
#備份配置文件
/bin/cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf_back
#啟動(dòng)Apache,并設(shè)置開機(jī)啟動(dòng)
service httpd start
chkconfig httpd on
將其轉(zhuǎn)換為一個(gè)完整的playbook后:
#表示指定主機(jī)清單中的所有主機(jī),也可以指定具體的主機(jī)組
- hosts: all
#指定登陸遠(yuǎn)程的用戶
remote_user: fsp
#啟用使用提權(quán)
become: yes
#提權(quán)用戶為root
become_user: root
#提權(quán)的方式為su
become_method: su
tasks:
- name: install apache server
yum: name=httpd name=httpd-devel state=latest
- name: backup httpd.conf
command: cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf_back
- name: start apache, auto start apache
service: name=httpd state=restarted enabled=yes
#執(zhí)行時(shí)候需要-i指定主機(jī)清單信息,-K指定切換root的密碼。普通用戶是key驗(yàn)證登陸的。已經(jīng)在配置文件中指定。命令如下:
[root@ansible roles]# ansible-playbook command.yml -i /etc/ansible/hosts_cna1 -K
SUDO password:
PLAY [all] ************************************************************************************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************************************************************************************
ok: [192.168.1.80]
TASK [install apache server] ******************************************************************************************************************************************************************
changed: [192.168.1.80]
TASK [backup httpd.conf] **********************************************************************************************************************************************************************
changed: [192.168.1.80]
TASK [start apache, auto start apache] ********************************************************************************************************************************************************
changed: [192.168.1.80]
PLAY RECAP ************************************************************************************************************************************************************************************
192.168.1.80 : ok=4 changed=3 unreachable=0 failed=0
由于目前暫時(shí)不使用,暫不測試。后續(xù)工作需要在添加,以上內(nèi)容來自:http://www.lxweimin.com/p/41c4ed3ce779
參考文檔:http://www.ansible.com.cn/docs/playbooks_intro.html
六、工作中的案例記錄
七、Ansible FAQ
故障1:
如果客戶端不在know_hosts里可能提示
[root@ansible ~]# vim /etc/ansible/hosts_cna
[root@ansible ~]# ansible all -i /etc/ansible/hosts_cna -m ping
The authenticity of host '192.168.1.80 (192.168.1.80)' can't be established.
RSA key fingerprint is 3b:30:3c:94:59:dc:23:64:ea:20:14:11:3b:73:7d:55.
Are you sure you want to continue connecting (yes/no)?
解決方法:
編輯/etc/ansible/ansible.cfg文件,取消注釋以禁用SSH密鑰主機(jī)檢查
host_key_checking = False
故障2:
在Ansible2.0.0-2.3.0的版本(我是2.3.0版本測試出來的)。
執(zhí)行su提權(quán)的時(shí)候總是報(bào)錯(cuò)Timeout (12s) waiting for privilege escalation prompt。當(dāng)然,無論是2.0以后的提權(quán)命令,還是2.0以前提權(quán)都報(bào)錯(cuò)。在經(jīng)過一天查看和翻閱之后,原來是bug導(dǎo)致。證明:https://github.com/ansible/ansible/issues/13278
錯(cuò)誤提示:
root@ansible:/etc/ansible# ansible all -i /etc/ansible/hosts_cna -u fsp -k --su --su-user=root --ask-su-pass -m shell -a 'whoami'
SSH password:
SU password[defaults to SSH password]:
192.168.1.42 | FAILED | rc=-1 >>
Timeout (12s) waiting for privilege escalation prompt:
root@ansible:/etc/ansible# ansible all -i /etc/ansible/hosts_cna -m shell -a 'whoami' -u fsp -k --become-user=root --become-method=su -K --become
SSH password:
SU password[defaults to SSH password]:
192.168.1.42 | FAILED | rc=-1 >>
Timeout (12s) waiting for privilege escalation prompt:
解決方法:
既然想解決,肯定是看有沒有最新版本,安裝試一下,下載2.3.1版本,地址如下。
http://dl.fedoraproject.org/pub/epel/testing/7/x86_64/a/ansible-2.3.1.0-1.el7.noarch.rpm
然后(Cent0S7.3系統(tǒng))在系統(tǒng)wget下。在wget到系統(tǒng)。執(zhí)行yum -y install ansible-2.3.1.0-1.el7.noarch.rpm。這樣就會安裝新版本,自動(dòng)解決依賴。需要有epel源。
故障3:
[root@ansible ~]# ansible all -i /etc/ansible/hosts_cna --su --ask-su-pass -m shell -a 'ip a'
SU password:
192.168.1.168 | FAILED | rc=127 >>
/bin/sh: ip: command not found
解決方法:
加載source /etc/profile環(huán)境變量
ansible all -i /etc/ansible/hosts_cna --su --ask-su-pass -m shell -a 'source /etc/profile;ip a'
故障4:
在執(zhí)行ansible-playbook -i /etc/ansible/hosts_cna1 command.yml -K。有如下警告:
[WARNING]: Consider using file module with state=touch rather than running touch
解決方法:
上面的命令其實(shí)是執(zhí)行成功了,但是有一個(gè)Warning,提示我們可以用Ansible的file模塊來替代我們寫的touch命令,于是我們把YAML改成下面的這樣:
old:
tasks:
- name: touch files
command: touch /root/123.txt
new:
tasks:
- name: touch files
file: path=/root/123.txt state=touch
故障5:
在主機(jī)清單中定義了10.252.143.38 ansible_ssh_user=root ansible_ssh_pass=DSD@#hw5,報(bào)錯(cuò)認(rèn)證失敗
SUSE操作系統(tǒng)
ansible 2.4.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible-2.4.1.0-py2.7.egg/ansible
executable location = /usr/bin/ansible
python version = 2.7.9 (default, Dec 21 2014, 11:02:59) [GCC]
localhost:/etc/ansible # ansible all -i /etc/ansible/test -m command -a 'id'
s192.168.99.12 | UNREACHABLE! => {
"changed": false,
"msg": "Authentication failure.",
"unreachable": true
}
#同時(shí)messages和warn都是認(rèn)證失敗,初步以為是bug,但是使用123.aaA就可以成功。看來是變量傳的有
#問題,通過單引號ansible_ssh_pass='I0T@#hw5',依然如此。當(dāng)換成雙引號后成功了,看來@#¥%這些
#符號必須加雙引號才可以。