Ansible配置使用詳解和用例 - 草稿

一、簡單介紹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腳本開發(fā)指導(dǎo)

二、安裝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)換成雙引號后成功了,看來@#¥%這些

#符號必須加雙引號才可以。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容