Ansible快速入門

1.什么是Ansible

Ansible是python 中的一套模塊呢灶,系統(tǒng)中的一套自動化工具,只需要使用ssh協(xié)議連接及可用來系統(tǒng)管理、自動化執(zhí)行命令等任務(wù)。

2.Ansible優(yōu)勢

1端铛、ansible不需要單獨(dú)安裝客戶端,也不需要啟動任何服務(wù)
2疲眷、ansible是python中的一套完整的自動化執(zhí)行任務(wù)模塊
3禾蚕、ansible playbook,采用yaml配置狂丝,對于自動化任務(wù)執(zhí)行一目了然
4换淆、ansible 模塊較多,對于自動化的場景支持較豐富

3.Ansible架構(gòu)

Ansible組成結(jié)構(gòu)

  • Ansible
    是Ansible的命令工具几颜,核心執(zhí)行工具产舞;一次性或臨時執(zhí)行的操作都是通過該命令執(zhí)行。
  • Ansible Playbook
    任務(wù)劇本(又稱任務(wù)集)菠剩,編排定義Ansible任務(wù)集的配置文件,由Ansible順序依次執(zhí)行耻煤,yaml格式具壮。
  • Inventory
    Ansible管理主機(jī)的清單,默認(rèn)是/etc/ansible/hosts文件哈蝇。
  • Modules
    Ansible執(zhí)行命令的功能模塊棺妓,Ansible2.3版本為止,共有1039個模塊炮赦。還可以自定義模塊怜跑。
  • Plugins
    插件,模塊功能的補(bǔ)充,常有連接類型插件性芬,循環(huán)插件峡眶,變量插件,過濾插件植锉,插件功能用的較少辫樱。
  • API
    提供給第三方程序調(diào)用的應(yīng)用程序編程接口。
  • custom modules
    自定義模塊 俊庇,根據(jù)自己的需求編寫具體的模塊
    最重要的一點(diǎn)是 ansible是模塊化的 它所有的操作都依賴于模塊

4.為什么使用Ansible

批量管理功能

1.批量命令執(zhí)行
2.批量安裝服務(wù)
3.批量配置同步
4.批量任務(wù)執(zhí)行
5.批量代碼部署
6.批量系統(tǒng)操作配置
7.批量文件數(shù)據(jù)分發(fā)
8.批量系統(tǒng)信息收集

5.Ansible安裝

[root@m01 ~]# yum install ansible -y
[root@m01 ~]# ansible --version
ansible 2.9.6
  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
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

ansible配置文件存在優(yōu)先級的問題

        ANSIBLE_CONFIG                       #環(huán)境變量
        ansible.cfg                       #項目目錄
        .ansible.cfg                      #當(dāng)前用戶的家目錄
        /etc/ansible/ansible.cfg                 #默認(rèn)配置文件 
#由上到下優(yōu)先級逐漸降低

配置文件詳解

[root@m01 ~]# cat /etc/ansible/ansible.cfg 
#inventory      = /etc/ansible/hosts      #主機(jī)列表配置文件
#library        = /usr/share/my_modules/  #庫文件存放目錄
#remote_tmp     = ~/.ansible/tmp          #臨時py文件存放在遠(yuǎn)程主機(jī)目錄
#local_tmp      = ~/.ansible/tmp          #本機(jī)的臨時執(zhí)行目錄
#forks          = 5                       #默認(rèn)并發(fā)數(shù)
#sudo_user      = root                    #默認(rèn)sudo用戶
#ask_sudo_pass = True                     #每次執(zhí)行是否詢問sudo的ssh密碼
#ask_pass      = True                     #每次執(zhí)行是否詢問ssh密碼
#remote_port    = 22                      #遠(yuǎn)程主機(jī)端口
host_key_checking = False                 #跳過檢查主機(jī)指紋
log_path = /var/log/ansible.log           #ansible日志


[privilege_escalation]   #如果是普通用戶則需要配置提權(quán)
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False

6.Ansible inventory

/etc/ansible/hosts主機(jī)資產(chǎn)清單文件狮暑,用于定義被管理主機(jī)的認(rèn)證信息, 例如ssh登錄用戶名辉饱、密碼以及key相關(guān)信息搬男。如何配置Inventory文件

1.主機(jī)支持主機(jī)名通配以及正則表達(dá)式,例如web[1:3].test.com代表三臺主機(jī)
2.主機(jī)支持基于非標(biāo)準(zhǔn)的ssh端口彭沼,例如web1.test.com:6666
3.主機(jī)支持指定變量缔逛,可對個別主機(jī)的特殊配置,如登陸用戶溜腐,密碼
4.主機(jī)組支持指定變量[group_name:vars]译株,同時支持嵌套組[game:children]

場景一、基于密碼連接

[root@m01 ~]# cat /etc/ansible/hosts

#方式一挺益、主機(jī)+端口+密碼
[webservers]
10.0.0.31 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
10.0.0.41 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'

#方式二歉糜、主機(jī)+端口+密碼
[webservers]
web[1:2].yuntaoshu.com ansible_ssh_pass='123456'

#方式三、主機(jī)+端口+密碼
[webservers]
web[1:2].yutaoshu.com
[webservers:vars]
ansible_ssh_pass='123456'

場景二望众、基于密鑰連接匪补,需要先創(chuàng)建公鑰和私鑰,并下發(fā)公鑰至被控端

 利用非交換式工具實(shí)現(xiàn)批量分發(fā)公鑰與批量管理服務(wù)器
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.41
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.31

#方式一烂翰、主機(jī)+端口+密鑰
[group_name]
10.0.0.31:22
10.0.0.41

#方式二夯缺、別名+主機(jī)+端口+密鑰
[group_name]
nfs-node1 ansible_ssh_host=10.0.0.31 ansible_ssh_port=22

場景三、主機(jī)組使用方式

#方式一甘耿、主機(jī)組變量+主機(jī)+密碼
[group_name1]
10.0.0.31
10.0.0.41
[group_name1:vars]
ansible_ssh_pass='123456'

#方式二踊兜、主機(jī)組變量+主機(jī)+密鑰
[group_name2]
10.0.0.7
10.0.0.8

#定義多組,多組匯總整合
# webservers組包括兩個子組[apapche,nginx]
[webservers:children]
[group_name1]
[group_name2]

查看主機(jī)清單

#查看所有
[root@m01 ~]# ansible all --list-hosts
  hosts (1):
    172.16.1.7
#查看某個組內(nèi)的主機(jī)數(shù)
[root@client ~]# ansible web --list-hosts
  hosts (1):
    172.16.1.7
#查看非默認(rèn)配置主機(jī)清單的
[root@m01 /project1]# ansible web -i hosts --list-hosts
  hosts (1):
    172.16.1.7

inventory內(nèi)置參數(shù)


被控端首次連接容易出現(xiàn)問題
解決方案1
如果控制端和被控制端第一次通訊佳恬,需要確認(rèn)指紋信息捏境,如果機(jī)器特別多少的情況下怎么辦?
將 Ansible 配置文件中的 host_key_checking = False 參數(shù)注釋打開即可毁葱。
但要注意ansible.cfg文件的讀取順序垫言。
解決方案2

通過腳本來實(shí)現(xiàn)
[root@ansible ~]# vim /server/scripts/fenfa.sh
#!/bin/bash 

if [ -f /root/.ssh/id_rsa ];then
   echo "----------密鑰對已經(jīng)存在---------------"
else
   echo "----------正在生成密鑰對---------------"
   ssh-keygen -f /root/.ssh/id_rsa -N '' > /dev/null 2>&1
fi

for i in {5,6,7,8,9,31,41,51,52}
do
    echo "正在操作:172.16.1.${i}"
    echo "----------正在分發(fā)--------"
    sshpass -p123456 ssh-copy-id -i /root/.ssh/id_rsa.pub 172.16.1.${i} -o StrictHostKeyChecking=no > /tmp/ssh
.log 2>&1
done

7.Ansible Ad-Hoc

1.什么是ad-hoc模式

ad-hoc簡而言之,就是“臨時命令”倾剿,不會保存
ansible中有兩種模式, 分別是ad-hoc模式和playbook模式

2.ad-hoc模式的使用場景

場景一筷频,在多臺機(jī)器上,查看某個進(jìn)程是否啟動
場景二,在多臺機(jī)器上凛捏,拷貝指定日志文件到本地担忧,等等

3.ad-hoc模式的命令使用
4.ad-hoc模式的常用模塊

Ansible執(zhí)行返回->顏色信息說明

黃色:對遠(yuǎn)程節(jié)點(diǎn)進(jìn)行相應(yīng)修改
綠色:對遠(yuǎn)程節(jié)點(diǎn)不進(jìn)行相應(yīng)修改,或者只是對遠(yuǎn)程節(jié)點(diǎn)信息進(jìn)行查看
紅色:操作執(zhí)行命令有異常
紫色:表示對命令執(zhí)行發(fā)出警告信息(可能存在的問題葵袭,給你一下建議)

1.command命令模塊

# 默認(rèn)模塊, 執(zhí)行命令
[root@m01 ~]# ansible test  -a "hostname"

# 如果需要一些管道操作涵妥,則使用shell
[root@m01 ~]# ansible test -m shell -a "ifconfig|grep eth0" -f 50

-f =forks /etc/ansible/ansible.cfg #結(jié)果返回的數(shù)量

2.script腳本模塊

# 編寫腳本
[root@m01 ~]# mkdir -p /server/scripts
[root@m01 ~]# cat /server/scripts/yum.sh
#!/usr/bin/bash
yum install -y iftop

#在本地運(yùn)行模塊,等同于在遠(yuǎn)程執(zhí)行坡锡,不需要將腳本文件進(jìn)行推送目標(biāo)主機(jī)執(zhí)行
[root@m01 ~]# ansible test -m script -a "/server/scripts/yum.sh"

3.yum安裝軟件模塊

[root@m01 ~]# ansible test -m yum -a "name=httpd state=installed"
name        #指定要安裝的軟件包名稱
state       #指定使用yum的方法
    installed蓬网,present   #安裝軟件包
    removed,absent      #移除軟件包
    latest              #安裝最新軟件包 

4.copy文件拷貝模塊

# 推送文件模塊
[root@m01 ~]# ansible test -m copy -a "src=/etc/hosts dest=/tmp/test.txt"

# 在推送覆蓋遠(yuǎn)程端文件前鹉勒,對遠(yuǎn)端已有文件進(jìn)行備份帆锋,按照時間信息備份
[root@m01 ~]# ansible test -m copy -a "src=/etc/hosts dest=/tmp/test.txt backup=yes"

# 直接向遠(yuǎn)端文件內(nèi)寫入數(shù)據(jù)信息,并且會覆蓋遠(yuǎn)端文件內(nèi)原有數(shù)據(jù)信息
[root@m01 ~]# ansible test -m copy -a "content='bgx' dest=/tmp/test"
src             #推送數(shù)據(jù)的源文件信息
dest            #推送數(shù)據(jù)的目標(biāo)路徑
backup          #對推送傳輸過去的文件禽额,進(jìn)行備份
content         #直接批量在被管理端文件中添加內(nèi)容
group           #將本地文件推送到遠(yuǎn)端锯厢,指定文件屬組信息
owner           #將本地文件推送到遠(yuǎn)端,指定文件屬主信息
mode            #將本地文件推送到遠(yuǎn)端脯倒,指定文件權(quán)限信息

5.file文件配置模塊

[root@m01 ~]# ansible test -m file -a "path=/tmp/oldboy state=directory"
[root@m01 ~]# ansible test -m file -a "path=/tmp/tt state=touch mode=555 owner=root group=root"
[root@m01 ~]# ansible test -m file -a "src=/tmp/tt path=/tmp/tt_link state=link"

path            #指定遠(yuǎn)程主機(jī)目錄或文件信息
recurse         #遞歸授權(quán)
state 
    directory   #在遠(yuǎn)端創(chuàng)建目錄
    touch       #在遠(yuǎn)端創(chuàng)建文件
    link        #link或hard表示創(chuàng)建鏈接文件
    absent      #表示刪除文件或目錄
    mode        #設(shè)置文件或目錄權(quán)限
    owner       #設(shè)置文件或目錄屬主信息
    group       #設(shè)置文件或目錄屬組信息

6.service服務(wù)模塊

[root@m01 ~]# ansible test -m service -a "name=crond state=stopped enabled=yes"

name        # 定義要啟動服務(wù)的名稱
state       # 指定服務(wù)狀態(tài)
    started     #啟動服務(wù)
    stopped     #停止服務(wù)
    restarted   #重啟服務(wù)
    reloaded    #重載服務(wù)
enabled         #開機(jī)自啟

7.group組模塊

[root@m01 ~]# ansible test -m group -a "name=oldgirl gid=888"

name            #指定創(chuàng)建的組名
gid             #指定組的gid
state
    absent      #移除遠(yuǎn)端主機(jī)的組
    present     #創(chuàng)建遠(yuǎn)端主機(jī)的組(默認(rèn))

8.user模塊

#創(chuàng)建用戶指定uid和gid实辑,不創(chuàng)建家目錄也不允許登陸
[root@m01 ~]# ansible test -m user -a "name=oldgirl uid=888 group=888 shell=/sbin/nologin create_home=no"

#將明文密碼進(jìn)行hash加密,然后進(jìn)行用戶創(chuàng)建
[root@m01 ~]# ansible localhost -m debug -a "msg={{ 'bgx' | password_hash('sha512', 'salt') }}"
localhost | SUCCESS => {
    "msg": "$6$salt$WP.Kb1hMfqJG7dtlBltkj4Um4rVhch54R5JCi6oP73MXzGhDWqqIY.JkSOnIsBSOeXpKglY7gUhHzY4ZtySm41"
}
[root@m01 ~]# ansible test -m user -a 'name=xlw password=$6$salt$WP.Kb1hMfqJG7dtlBltkj4Um4rVhch54R5JCi6oP73MXzGhDWqqIY.JkSOnIsBSOeXpKglY7gUhHzY4ZtySm41 create_home=yes shell=/bin/bash'

uid             #指定用戶的uid
group           #指定用戶組名稱
groups          #指定附加組名稱
password        #給用戶添加密碼
shell           #指定用戶登錄shell
create_home     #是否創(chuàng)建家目錄

8.crond定時任務(wù)模塊

# 正常使用crond服務(wù)
[root@m01 ~]# crontab -l
* * * * *  /bin/sh /server/scripts/yum.sh

# 使用ansible添加一條定時任務(wù)
[root@m01 ~]# ansible test -m cron -a "minute=* hour=* day=* month=* weekday=*  job='/bin/sh /server/scripts/test.sh'"
[root@m01 ~]# ansible test -m cron -a "job='/bin/sh /server/scripts/test.sh'"

# 設(shè)置定時任務(wù)注釋信息藻丢,防止重復(fù)剪撬,name設(shè)定
[root@m01 ~]# ansible test -m cron -a "name='cron01' job='/bin/sh /server/scripts/test.sh'"

# 刪除相應(yīng)定時任務(wù)
[root@m01 ~]# ansible test -m cron -a "name='ansible cron02' minute=0 hour=0 job='/bin/sh /server/scripts/test.sh' state=absent"
 
# 注釋相應(yīng)定時任務(wù),使定時任務(wù)失效
[root@m01 scripts]# ansible test -m cron -a "name='ansible cron01' minute=0 hour=0 job='/bin/sh /server/scripts/test.sh' disabled=no"

9.mount模塊

[root@m01 ~]# ansible test -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=present"
[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=mounted"
[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=unmounted"
[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=absent"

present     # 開機(jī)掛載悠反,僅將掛載配置寫入/etc/fstab
mounted     # 掛載設(shè)備残黑,并將配置寫入/etc/fstab
unmounted   # 卸載設(shè)備党瓮,不會清除/etc/fstab寫入的配置
absent      # 卸載設(shè)備俗冻,會清理/etc/fstab寫入的配置

10.setup用于獲取系統(tǒng)信息的一個模塊

# 查看模塊參數(shù)
[root@m01 ~]# ansible-doc -s setup

# 查看系統(tǒng)所有信息
[root@m01 ~]# ansible 192.16 1.31-m setup

# filter 對系統(tǒng)信息進(jìn)行過濾
[root@m01 ~]# ansible 192.168.1.31 -m setup -a 'filter=ansible_all_ipv4_addresses' # 常用的過濾選項
ansible_all_ipv4_addresses         所有的ipv4地址
ansible_all_ipv6_addresses         所有的ipv6地址
ansible_architecture               系統(tǒng)的架構(gòu)
ansible_date_time                  系統(tǒng)時間
ansible_default_ipv4               系統(tǒng)的默認(rèn)ipv4地址
ansible_distribution               系統(tǒng)名稱
ansible_distribution_file_variety  系統(tǒng)的家族
ansible_distribution_major_version 系統(tǒng)的版本
ansible_domain                     系統(tǒng)所在的域
ansible_fqdn                       系統(tǒng)的主機(jī)名
ansible_hostname                   系統(tǒng)的主機(jī)名,簡寫
ansible_os_family                  系統(tǒng)的家族
ansible_processor_cores            cpu的核數(shù)
ansible_processor_count            cpu的顆數(shù)
ansible_processor_vcpus            cpu的個數(shù)

11.unarchive解壓模塊

01.解壓遠(yuǎn)程服務(wù)器的壓縮包到指定目錄
創(chuàng)建壓縮包:

cd /etc && tar zxvf /opt/sys.tar.gz etc/fstab etc/hosts  
執(zhí)行命令:

[root@m01 ~]# ansible 172.16.1.31 -m unarchive -a "src=/opt/sys.tar.gz dest=/opt/ remote_src=yes"
02.把本地文件解壓到目標(biāo)機(jī)器指定目錄
創(chuàng)建命令

cd / && tar zcvf /opt/log.tar.gz var/log/messages
[root@m01 ~]# ansible 172.16.1.31 -m unarchive -a "src=/opt/log.tar.gz dest=/opt/" 

12.archive壓縮模塊

01.壓縮單個文件

[root@m01 ~]# ansible 172.16.1.31 -m archive -a "path=/var/log/message dest=/tmp/log.tar.gz format=gz force_archi

13.ansible查看幫助方法

[root@m01 ~]# ansible-doc -l    --- 查看所有模塊說明信息
[root@m01 ~]# ansible-doc copy  --- 表示指定查看某個模塊參數(shù)用法信息
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者僚饭。
  • 序言:七十年代末茵臭,一起剝皮案震驚了整個濱河市疫诽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旦委,老刑警劉巖奇徒,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異社证,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)评凝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門追葡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事宜肉≡染” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵谬返,是天一觀的道長之斯。 經(jīng)常有香客問我,道長遣铝,這世上最難降的妖魔是什么佑刷? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮酿炸,結(jié)果婚禮上瘫絮,老公的妹妹穿的比我還像新娘。我一直安慰自己填硕,他們只是感情好麦萤,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扁眯,像睡著了一般壮莹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姻檀,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天命满,我揣著相機(jī)與錄音,去河邊找鬼施敢。 笑死周荐,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的僵娃。 我是一名探鬼主播概作,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼默怨!你這毒婦竟也來了讯榕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤匙睹,失蹤者是張志新(化名)和其女友劉穎愚屁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痕檬,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡霎槐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了梦谜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丘跌。...
    茶點(diǎn)故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡袭景,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出闭树,到底是詐尸還是另有隱情耸棒,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布报辱,位于F島的核電站与殃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碍现。R本人自食惡果不足惜幅疼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鸵赫。 院中可真熱鬧衣屏,春花似錦、人聲如沸辩棒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽一睁。三九已至钻弄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間者吁,已是汗流浹背窘俺。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留复凳,地道東北人瘤泪。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像育八,于是被迫代替她去往敵國和親对途。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評論 2 359

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