ansible基礎(chǔ)知識(shí)

一、ansible簡(jiǎn)介

  • 1贾费、ansible是新出現(xiàn)的自動(dòng)化運(yùn)維工具钦购,基于Python開發(fā),集合了眾多運(yùn)維工具(puppet褂萧、cfengine押桃、chef、func导犹、fabric)的優(yōu)點(diǎn)唱凯,實(shí)現(xiàn)了批量系統(tǒng)配置、批量程序部署谎痢、批量運(yùn)行命令等功能磕昼。

  • 2、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ù)。


    Ansible的架構(gòu)
  • 3缔刹、ansible的安裝
    ansible依賴于Python 2.6或更高的版本球涛、paramiko、PyYAML及Jinja2校镐。

(1)亿扁、編譯安裝

解決依賴關(guān)系

# yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
# 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

(2) 、rpm包安裝

# yum install ansible

注意:不同版本的ansible的功能差異可能較大鸟廓。

二从祝、ansible中的模塊使用和簡(jiǎn)單的格式執(zhí)行

ansible -m MOD_nAME指明模塊
-a MOD_ARGS 向模塊傳遞參數(shù)
-f FORKS 一次可管理多少主機(jī)
-C 預(yù)運(yùn)行襟己,不真正運(yùn)行
--list -host 列出主機(jī)
-u USERNAME 指明用戶名
-c 指明連接方式,默認(rèn)smart
這些命令使用ansible簡(jiǎn)單的格式執(zhí)行

1牍陌、生成安全連接秘鑰

ansible通過ssh實(shí)現(xiàn)配置管理擎浴、應(yīng)用部署、任務(wù)執(zhí)行等功能毒涧,因此贮预,需要事先配置ansible端能基于密鑰認(rèn)證的方式聯(lián)系各被管理節(jié)點(diǎn)。
ansible和目標(biāo)主機(jī)命令執(zhí)行要使用ssh契讲,所以第一步就要生成安全連接秘鑰仿吞。

[root@rs1 ~]# ssh-keygen -t rsa -P ""    #生成安全連接秘鑰

[root@rs1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.6   #使用安全連接秘鑰連接1號(hào)目標(biāo)主機(jī)
 root@192.168.1.6's password: #輸入目標(biāo)主機(jī)密碼

[root@rs1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.12 #使用安全連接秘鑰連接2號(hào)目標(biāo)主機(jī)
root@192.168.1.12's password:  #輸入目標(biāo)主機(jī)密碼

2、添加本地解析

[root@rs1 ~]# vim /etc/hosts 添加本地解析

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.6 vs
192.168.1.12 rs2

3捡偏、定義目標(biāo)主機(jī)組

/etc/ansible/hosts文件支持使用以下變量設(shè)置相關(guān)的遠(yuǎn)程主機(jī)信息:

ansible_ssh_host     #用于指定被管理的主機(jī)的真實(shí)IP
ansible_ssh_port     #用于指定連接到被管理主機(jī)的ssh端口號(hào)茫藏,默認(rèn)是22
ansible_ssh_user     #ssh連接時(shí)默認(rèn)使用的用戶名
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凉当,在 ansible 1.2 之前默認(rèn)是 paramiko 枣申,后來智能選擇,優(yōu)先使用基于 ControlPersist 的 ssh (支持的前提)
ansible_python_interpreter     #用來指定python解釋器的路徑看杭,默認(rèn)為/usr/bin/python 同樣可以指定ruby 忠藤、perl 的路徑
ansible_*_interpreter     #其他解釋器路徑,用法與ansible_python_interpreter類似楼雹,這里"*"可以是ruby或才perl等

目標(biāo)主機(jī)組:

[root@rs1 ~]# cd /etc/ansible
[root@rs1 ansible]# ls
ansible.cfg  hosts  roles
[root@rs1 ansible]# vim hosts#編輯文件
[websrvs]#添加web組
192.168.1.6
192.168.1.12

[dbsrvs] #定義db組
192.168.1.12

 [root@rs1 ansible]# ansible all  --list-hosts#列出目標(biāo)主機(jī)
  hosts (2):
    192.168.1.12
    192.168.1.6
[root@rs1 ansible]# ansible all -m ping  -C# 對(duì)所有目標(biāo)主機(jī)預(yù)運(yùn)行ping測(cè)試
192.168.1.12 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.1.6 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
[root@rs1 ansible]# ansible all -m ping # 對(duì)所有目標(biāo)主機(jī)ping測(cè)試
192.168.1.12 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.1.6 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

4模孩、模塊文檔

[root@rs1 ansible]# ansible-doc -l #列出目標(biāo)主機(jī)模塊文檔
[root@rs1 ansible]# ansible-doc -s group 獲取設(shè)置組命令文檔
1、定義期望的目標(biāo)狀態(tài)
2贮缅、操作必須是冪等的榨咐,操作次數(shù)必須相等

5、group組模塊使用

對(duì)目標(biāo)主機(jī)創(chuàng)建組,并傳遞參數(shù)

[root@rs1 ansible]# ansible all -m group -a "gid=3000 name=mygrp state=present system=no" #對(duì)所有目標(biāo)主機(jī)創(chuàng)建組谴供,m是加載group模塊块茁,a是傳遞參數(shù),state是創(chuàng)建還是刪除
192.168.1.6 | SUCCESS => {
    "changed": true, 
    "gid": 3000, 
    "name": "mygrp", 
    "state": "present", 
    "system": false
}
192.168.1.12 | SUCCESS => {
    "changed": true, 
    "gid": 3000, 
    "name": "mygrp", 
    "state": "present", 
    "system": false
}

6桂肌、user用戶模塊使用

對(duì)目標(biāo)主機(jī)創(chuàng)建用戶,并傳遞參數(shù)

[root@rs1 ansible]# ansible all -m user -a "uid=5000 name=testuser state=present groups=mygrp shell=/bin/tcsh"對(duì)所有目標(biāo)主機(jī)創(chuàng)建用戶数焊,m是加載user模塊,a是傳遞參數(shù)崎场,state是創(chuàng)建還是刪除佩耳,groups是附加組,shell是默認(rèn)shell

192.168.1.6 | SUCCESS => {
    "changed": true, 
    "comment": "", 
    "createhome": true, 
    "group": 5000, 
    "groups": "mygrp", 
    "home": "/home/testuser", 
    "name": "testuser", 
    "shell": "/bin/tcsh", 
    "state": "present", 
    "system": false, 
    "uid": 5000
}
192.168.1.12 | SUCCESS => {
    "changed": true, 
    "comment": "", 
    "createhome": true, 
    "group": 5000, 
    "groups": "mygrp", 
    "home": "/home/testuser", 
    "name": "testuser", 
    "shell": "/bin/tcsh", 
    "state": "present", 
    "system": false, 
    "uid": 5000
}

7谭跨、copy復(fù)制模塊使用

對(duì)目標(biāo)主機(jī)拷貝本地文件,并傳遞參數(shù)干厚,指明src源文件位置和dest目標(biāo)文件位置

[root@rs1 ansible]# ansible-doc -s copy#查詢copy使用文檔
[root@rs1 ansible]# ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=600"
對(duì)所有目標(biāo)主機(jī)拷貝本地文件李滴,m是使用copy模塊,a是傳遞參數(shù)萍诱,src源文件位置悬嗓,dest目標(biāo)文件位置,mode權(quán)限(加了'/'就是目錄)
192.168.1.6 | SUCCESS => {
    "changed": true, 
    "checksum": "4367ba689c50b4ab956ce0704f048f4fb0cc1a28", 
    "dest": "/tmp/fstab.ansible", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "c6ac458a97ee2f7ed913fdc8b17e9394", 
    "mode": "0600", 
    "owner": "root", 
    "size": 465, 
    "src": "/root/.ansible/tmp/ansible-tmp-1534522522.24-76431722279920/source", 
    "state": "file", 
    "uid": 0
}
192.168.1.12 | SUCCESS => {
    "changed": true, 
    "checksum": "4367ba689c50b4ab956ce0704f048f4fb0cc1a28", 
    "dest": "/tmp/fstab.ansible", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "c6ac458a97ee2f7ed913fdc8b17e9394", 
    "mode": "0600", 
    "owner": "root", 
    "size": 465, 
    "src": "/root/.ansible/tmp/ansible-tmp-1534522522.23-209859323698602/source", 
    "state": "file", 
    "uid": 0
}

copy模塊設(shè)置屬主屬組用法

[root@rs1 ansible]# ansible all -m copy -a "content='hi tere\n' dest=/tmp/hi.txt owner=testuser group=mygrp"#對(duì)所有目標(biāo)主機(jī)拷貝本地文件裕坊,m是使用copy模塊包竹,a是傳遞參數(shù),content創(chuàng)建文檔到dest目標(biāo)文件位置籍凝,設(shè)置屬主屬組
192.168.1.6 | SUCCESS => {
    "changed": true, 
    "checksum": "50dbdebeaa8c0f1c3cccfcae54ef71fc2c0e4fa8", 
    "gid": 3000, 
    "group": "mygrp", 
    "mode": "0644", 
    "owner": "testuser", 
    "path": "/tmp/hi.txt", 
    "size": 8, 
    "state": "file", 
    "uid": 5000
}
192.168.1.12 | SUCCESS => {
    "changed": true, 
    "checksum": "50dbdebeaa8c0f1c3cccfcae54ef71fc2c0e4fa8", 
    "gid": 3000, 
    "group": "mygrp", 
    "mode": "0644", 
    "owner": "testuser", 
    "path": "/tmp/hi.txt", 
    "size": 8, 
    "state": "file", 
    "uid": 5000
}

8周瞎、fetch復(fù)制模塊

從遠(yuǎn)程單一主機(jī)復(fù)制到本地主機(jī)
使用文檔:ansibile-doc -s fetch

9、command模塊執(zhí)行命令

對(duì)目標(biāo)主機(jī)執(zhí)行命令

[root@rs1 ansible]# ansible all -m command -a "ifconfig"#對(duì)所有目標(biāo)主機(jī)饵蒂,m使用模塊声诸,command命令模塊,a傳遞參數(shù) 執(zhí)行ifconfig命令
192.168.1.12 | SUCCESS | rc=0 >>
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
.............     
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
.............    

192.168.1.6 | SUCCESS | rc=0 >>
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
............... 
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
...............     

注意:command缺點(diǎn)是無法解析管道命令

10退盯、shell模塊使用

shell模塊解決了command模塊的缺點(diǎn)彼乌,對(duì)傳遞參數(shù)用shell解析并執(zhí)行

[root@rs1 ansible]# ansible all -m shell -a "echo 123 | passwd --stdin testuser"#對(duì)所有目標(biāo)主機(jī)使用shell解析傳遞參數(shù)中的管道命令
192.168.1.6 | SUCCESS | rc=0 >>
更改用戶 testuser 的密碼 。
passwd:所有的身份驗(yàn)證令牌已經(jīng)成功更新渊迁。

192.168.1.12 | SUCCESS | rc=0 >>
更改用戶 testuser 的密碼 慰照。
passwd:所有的身份驗(yàn)證令牌已經(jīng)成功更新。

11琉朽、file模塊文件屬性命令

對(duì)目標(biāo)主機(jī)毒租,傳遞參數(shù),創(chuàng)建文件箱叁、目錄和軟連接

[root@rs1 ansible]# ansible all -m file -a "path=/var/tmp/hello.dir state=directory"#對(duì)所有目標(biāo)主機(jī)使用file模塊創(chuàng)建hello.dir目錄
192.168.1.12 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/var/tmp/hello.dir", 
    "size": 6, 
    "state": "directory", 
    "uid": 0
}
192.168.1.6 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/var/tmp/hello.dir", 
    "size": 6, 
    "state": "directory", 
    "uid": 0
}

[root@rs1 ansible]# ansible all -m file -a"src=/etc/fstab path=/var/tmp/fstab.link state=link"#對(duì)所有目標(biāo)主機(jī)使用file模塊創(chuàng)建fstab文件的符號(hào)連接
192.168.1.12 | SUCCESS => {
    "changed": true, 
    "dest": "/var/tmp/fstab.link", 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "size": 10, 
    "src": "/etc/fstab", 
    "state": "link", 
    "uid": 0
}
192.168.1.6 | SUCCESS => {
    "changed": true, 
    "dest": "/var/tmp/fstab.link", 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "size": 10, 
    "src": "/etc/fstab", 
    "state": "link", 
    "uid": 0
}

12墅垮、cron模塊計(jì)劃任務(wù)

對(duì)目標(biāo)主機(jī),傳遞參數(shù)耕漱,設(shè)置計(jì)劃任務(wù)

[root@rs1 ansible]# ansible all -m crom -a "minute=*/3 job='/usr/sbin/update 192.168.1.1 &> /dev/null' name=none state=present"#對(duì)所有目標(biāo)主機(jī) 算色,m使用模塊,crom計(jì)劃任務(wù)孤个,創(chuàng)建任務(wù)每三分鐘同步時(shí)間

13剃允、yum模塊安裝軟件程序包

rpm軟件的安裝

[root@rs1 ansible]# ansible all -m yum -a "name=ngix state=instlled"#對(duì)所有主機(jī)安裝ngix

14、service模塊管理目標(biāo)服務(wù)

對(duì)目標(biāo)主機(jī)齐鲤,傳遞參數(shù)斥废,管理服務(wù)。

[root@rs1 ansible]# ansible all -m service -a"name=httpd state=started"#對(duì)所有主機(jī)啟動(dòng)httpd服務(wù)
[root@rs1 ansible]# ansible all -m service -a"name=httpd state=stoped"#對(duì)所有主機(jī)停止httpd服務(wù)

15给郊、script模塊腳本管理

[root@rs1 ansible]# vim /tmp/test.sh#編寫一個(gè)測(cè)試腳本
對(duì)目標(biāo)主機(jī)牡肉,傳遞參數(shù),執(zhí)行本地bash腳本

#!binbash
#
echo "ansible script" > /tmp/ansible.txt
[root@rs1 ansible]# ansible all -m script -a "/tmp/test.sh"#所有目標(biāo)主機(jī)執(zhí)行本地bash腳本

注意:ansible普通命令用法很難復(fù)用

三淆九、playbook

  • playbook解決了ansible普通命令難以復(fù)用的缺點(diǎn)统锤,使用yaml格式保存毛俏,所有首先要了解YAML。
  • playbook是由一個(gè)或多個(gè)“play”組成的列表饲窿。play的主要功能在于將事先歸并為一組的主機(jī)裝扮成事先通過ansible中的task定義好的角色煌寇。從根本上來講,所謂task無非是調(diào)用ansible的一個(gè)module逾雄。將多個(gè)play組織在一個(gè)playbook中阀溶,即可以讓它們聯(lián)同起來按事先編排的機(jī)制同唱一臺(tái)大戲。

1鸦泳、YAML介紹

YAML是一個(gè)可讀性高的用來表達(dá)資料序列的格式银锻。YAML參考了其他多種語言,包括:XML做鹰、C語言击纬、Python、Perl以及電子郵件格式RFC2822等钾麸。Clark Evans在2001年在首次發(fā)表了這種語言更振,另外Ingy d?t Net與Oren Ben-Kiki也是這語言的共同設(shè)計(jì)者。

YAML Ain't Markup Language饭尝,即YAML不是XML殃饿。不過,在開發(fā)的這種語言時(shí)芋肠,YAML的意思其實(shí)是:"Yet Another Markup Language"(仍是一種標(biāo)記語言)。其特性:

YAML的可讀性好
YAML和腳本語言的交互性好
YAML使用實(shí)現(xiàn)語言的數(shù)據(jù)類型
YAML有一個(gè)一致的信息模型
YAML易于實(shí)現(xiàn)
YAML可以基于流來處理
YAML表達(dá)能力強(qiáng)遵蚜,擴(kuò)展性好

2帖池、YAML語法

YAML的語法和其他高階語言類似,并且可以簡(jiǎn)單表達(dá)清單吭净、散列表睡汹、標(biāo)量等數(shù)據(jù)結(jié)構(gòu)。其結(jié)構(gòu)(Structure)通過空格來展示寂殉,序列(Sequence)里的項(xiàng)用"-"來代表囚巴,Map里的鍵值對(duì)用":"分隔。

  • 服務(wù)安裝示例(redis服務(wù))
[root@rs1 ~]# mkdir playbooks#創(chuàng)建目錄
[root@rs1 ~]# cd playbooks
[root@rs1 playbooks]# ls
[root@rs1 playbooks]# vim first.yaml#創(chuàng)建一個(gè)新的以.yaml 結(jié)尾的playbooks

- hosts: all #定義目標(biāo)主機(jī)
  remote_user: root#使用用戶
  tasks: #任務(wù)
  - name: install redis#將要執(zhí)行的第一個(gè)任務(wù)
    yum: name=redis state=latest#執(zhí)行任務(wù)的設(shè)置
  - name: name: start redis#將要執(zhí)行的第二個(gè)任務(wù)
    service: name=redis state=started#執(zhí)行任務(wù)的設(shè)置

[root@rs1 playbooks]# ansible-playbook --syntax-check first.yaml#語法檢查

playbook: first.yaml
[root@rs1 playbooks]# ansible-playbook --list-hosts first.yaml#此playbooks涉及到那些主機(jī)

playbook: first.yaml

  play #1 (all): all    TAGS: []
    pattern: [u'all']
    hosts (2):
      192.168.1.12
      192.168.1.6
[root@rs1 playbooks]# ansible-playbook --list-hosts --list-tasks first.yaml#涉及到的主機(jī)上將要執(zhí)行的任務(wù)(標(biāo)簽為空)

playbook: first.yaml

  play #1 (all): all    TAGS: []
    pattern: [u'all']
    hosts (2):
      192.168.1.12
      192.168.1.6
    tasks:
      install redis TAGS: []
      start redis   TAGS: []
      start redis   TAGS: []
[root@rs1 playbooks]# ansible-playbook -C first.yaml #預(yù)執(zhí)行

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.1.6]
ok: [192.168.1.12]

TASK [install redis] ***********************************************************
changed: [192.168.1.12]
changed: [192.168.1.6]

TASK [start redis] *************************************************************
changed: [192.168.1.6]
changed: [192.168.1.12]

PLAY RECAP *********************************************************************
192.168.1.12               : ok=3    changed=2    unreachable=0    failed=0   
192.168.1.6                : ok=3    changed=2    unreachable=0    failed=0   
[root@rs1 playbooks]# ansible-playbook  first.yaml #執(zhí)行

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.1.12]
ok: [192.168.1.6]

TASK [install redis] ***********************************************************
changed: [192.168.1.12]
changed: [192.168.1.6]

TASK [start redis] *************************************************************
changed: [192.168.1.12]
changed: [192.168.1.6]

PLAY RECAP *********************************************************************
192.168.1.12               : ok=3    changed=2    unreachable=0    failed=0   
192.168.1.6                : ok=3    changed=2    unreachable=0    failed=0   
  • 配置文件傳遞示例(redis服務(wù)):
[root@rs1 playbooks]# cp 192.168.1.6/etc/redis.conf  ./
[root@rs1 playbooks]# ls
192.168.1.6  first.yaml  redis.conf
[root@rs1 playbooks]# ansible 192.168.1.6 -m fetch -a "src=/etc/redis.conf dest=./ " #復(fù)制目標(biāo)主機(jī)里面的redis配置文件到本機(jī)
[root@rs1 playbooks]# cp 192.168.1.6/etc/redis.conf  ./#拷貝復(fù)制過來的配置文件到當(dāng)前目錄
[root@rs1 playbooks]# ls
192.168.1.6  first.yaml  redis.conf

[root@rs1 playbooks]# vim redis.conf#編輯
......
bind 0.0.0.0#監(jiān)聽所有端口
.....
requirepass foobared#啟用密碼認(rèn)證功能友扰,密碼是foobared
.....
  • handlers:用特定條件觸發(fā)使用
    用于當(dāng)關(guān)注的資源發(fā)生變化時(shí)采取一定的操作彤叉。

    “notify”這個(gè)action可用于在每個(gè)play的最后被觸發(fā),這樣可以避免多次有改變發(fā)生時(shí)每次都執(zhí)行指定的操作村怪,取而代之秽浇,僅在所有的變化發(fā)生完成后一次性地執(zhí)行指定操作。在notify中列出的操作稱為handler甚负,也即notify中調(diào)用handler中定義的操作柬焕。

[root@rs1 playbooks]# cp first.yaml  second.yaml#備份一下
[root@rs1 playbooks]# vim second.yaml #編輯

- hosts: all
  remote_user: root
  tasks:
  - name: install redis
    yum: name=redis state=latest
  - name: copy config file  #任務(wù)2復(fù)制文件
    copy: src=/root/playbooks/redis.conf dest=/etc/redis.conf owner=r
edis#復(fù)制文件到目標(biāo)主機(jī)目錄下
    notify: restart redis#通知handlers觸發(fā)
  - name: start redis
    service: name=redis state=started
  handlers:#定義觸發(fā)任務(wù)
    - name: restart redis#觸發(fā)任務(wù)一
      service: name=redis state=restarted#重新啟動(dòng)redis
[root@rs1 playbooks]# ansible-playbook --syntax-check second.yaml#語法檢查

playbook: second.yaml
[root@rs1 playbooks]# ansible-playbook  second.yaml

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.1.12]
ok: [192.168.1.6]

TASK [install redis] ***********************************************************
ok: [192.168.1.6]
ok: [192.168.1.12]

TASK [copy config file] ********************************************************
changed: [192.168.1.6]
changed: [192.168.1.12]

TASK [start redis] *************************************************************
ok: [192.168.1.6]
ok: [192.168.1.12]

RUNNING HANDLER [restart redis] ************************************************
changed: [192.168.1.12]
changed: [192.168.1.6]

PLAY RECAP *********************************************************************
192.168.1.12               : ok=5    changed=2    unreachable=0    failed=0   
192.168.1.6                : ok=5    changed=2    unreachable=0    failed=0   
  • tags標(biāo)簽的使用
    只執(zhí)行標(biāo)簽里面的任務(wù)
[root@rs1 playbooks]# vim second.yaml 

- hosts: all
  remote_user: root
  tasks:
  - name: install redis
    yum: name=redis state=latest
  - name: copy config file
    copy: src=/root/playbooks/redis.conf dest=/etc/redis.conf owner=redis
    notify: restart redis
    tags: configfile        #添加任務(wù)標(biāo)簽
  - name: start redis
    service: name=redis state=started
  handlers:
    - name: restart redis
      service: name=redis state=restarted
[root@rs1 playbooks]# ansible-playbook -t configfile  second.yaml #只執(zhí)行標(biāo)簽里面的任務(wù)

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.1.12]
ok: [192.168.1.6]

TASK [copy config file] ********************************************************
ok: [192.168.1.12]
ok: [192.168.1.6]

PLAY RECAP *********************************************************************
192.168.1.12               : ok=2    changed=0    unreachable=0    failed=0   
192.168.1.6                : ok=2    changed=0    unreachable=0    failed=0   

四审残、Ansible基礎(chǔ)元素

1、 變量variables

  • 變量命名:變量名僅能由字母斑举、數(shù)字和下劃線組成搅轿,且只能以字母開頭。
(1)facts可直接調(diào)用
  • facts是由正在通信的遠(yuǎn)程目標(biāo)主機(jī)發(fā)回的信息富玷,這些信息被保存在ansible變量中璧坟。要獲取指定的遠(yuǎn)程主機(jī)所支持的所有facts
[root@rs1 playbooks]# ansible 192.168.1.6 -m setup# setup模塊獲取目標(biāo)主機(jī)信息


[root@rs1 playbooks]# vim thir.yaml#編輯

- hosts: 192.168.1.6
  remote_user: root
  tasks:
  - name: copy file
    copy: content={{ansible_env}} dest=/tmp/ansible.env#指定變量保存到目標(biāo)主機(jī)目錄下
[root@rs1 playbooks]# ansible-playbook --syntax-check thir.yaml#語法檢查
[root@rs1 playbooks]# ansible-playbook  thir.yaml

PLAY [192.168.1.6] *************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.1.6]

TASK [copy file] ***************************************************************
changed: [192.168.1.6]

PLAY RECAP *********************************************************************
192.168.1.6                : ok=2    changed=1    unreachable=0    failed=0   
(2)ansible-playbook命令的命令行自定義變量

在運(yùn)行playbook的時(shí)候也可以傳遞一些變量供playbook使用

[root@rs1 playbooks]# vim forth.yaml

- hosts: all
  remote_user: root
  tesks:
  - name: install package {{pkgname}} #定義安裝程序包任務(wù)
    yum: name={{pkgname}} state=latest#安裝什么包,由自定義變量提供
[root@rs1 playbooks]# ansible-playbook --syntax-check forth.yaml 語法檢查
[root@rs1 playbooks]# ansible-playbook -e pkgname=memcached forth.yaml#指定安裝包安裝

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.1.12]
ok: [192.168.1.6]

TASK [install package] *********************************************************
changed: [192.168.1.6]
changed: [192.168.1.12]

PLAY RECAP *********************************************************************
192.168.1.12               : ok=2    changed=1    unreachable=0    failed=0   
192.168.1.6                : ok=2    changed=1    unreachable=0    failed=0   
(3)Inventory主機(jī)文件清單
  • ansible的主要功用在于批量主機(jī)操作凌彬,為了便捷地使用其中的部分主機(jī)沸柔,可以在inventory file中將其分組命名。默認(rèn)的inventory file為/etc/ansible/hosts铲敛。

  • 主機(jī)文件清單可以有多個(gè)褐澎,且也可以通過Dynamic Inventory來動(dòng)態(tài)生成。

  • inventory文件格式遵循INI文件風(fēng)格伐蒋,中括號(hào)中的字符為組名工三。可以將同一個(gè)主機(jī)同時(shí)歸并到多個(gè)不同的組中先鱼;此外俭正,當(dāng)如若目標(biāo)主機(jī)使用了非默認(rèn)的SSH端口,還可以在主機(jī)名稱之后使用冒號(hào)加端口號(hào)來標(biāo)明焙畔。

ntp.xxx.com
[webservers]
www1.xxx.com:2222
www2.xxx.com
[dbservers]
db1.xxx.com
db2.xxx.com
db3.xxx.com

如果主機(jī)名稱遵循相似的命名模式掸读,還可以使用列表的方式標(biāo)識(shí)各主機(jī),

例如:[webservers]
www[01:50].xxx.com
[databases]
db-[a:f].xxx.com

[root@rs1 ansible]# vim hosts
........
 [websrvs]
www[1:7].hehe.com#定義主機(jī)清單
[root@rs1 ansible]# ansible websrvs --list-host
  hosts (7):
    www1.hehe.com
    www2.hehe.com
    www3.hehe.com
    www4.hehe.com
    www5.hehe.com
    www6.hehe.com
    www7.hehe.com


為目標(biāo)主機(jī)創(chuàng)建用戶
[root@rs1 playbooks]# vim fif.yaml #編輯文件

- hosts: all
  remote_user: root
  tasks:
  - name: add user
    user: name=test system=no state=present
  - name: set password
    shell: echo test | passwd --stdin test
[root@rs1 playbooks]# ansible-playbook --syntax-check fif.yaml#語法檢查
[root@rs1 playbooks]# ansible-playbook --syntax-check fif.yaml

playbook: fif.yaml
[root@rs1 playbooks]# ansible-playbook  fif.yaml

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.1.12]
ok: [192.168.1.6]

TASK [add user] ****************************************************************
changed: [192.168.1.12]
changed: [192.168.1.6]

TASK [set password] ************************************************************
changed: [192.168.1.12]
changed: [192.168.1.6]

PLAY RECAP *********************************************************************
192.168.1.12               : ok=3    changed=2    unreachable=0    failed=0   
192.168.1.6                : ok=3    changed=2    unreachable=0    failed=0  
(4)主機(jī)變量

可以在inventory中定義主機(jī)時(shí)為其添加主機(jī)變量以便于在playbook中使用宏多。

[root@rs1 playbooks]# vim /etc/ansible/hosts 
[websrvs]
192.168.1.6 ansible_ssh_user=test ansible_ssh_pass=test
192.168.1.12 ansible_ssh_user=test ansible_ssh_pass=test

[root@rs1 playbooks]# ansible websrvs -m ping#對(duì)目標(biāo)主機(jī)ping測(cè)試
192.168.1.12 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.1.6 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
[root@rs1 playbooks]# ansible websrvs -m command -a  "whoami"#用戶名返回測(cè)試
192.168.1.12 | SUCCESS | rc=0 >>
test

192.168.1.6 | SUCCESS | rc=0 >>
test
    注意: 一個(gè)組定義了指定用戶 儿惫,將會(huì)影響其他組指定用戶會(huì)變的
(5)組變量

組變量是指賦予給指定組內(nèi)所有主機(jī)上的在playboo中可用的變量。

自定義變量傳遞:
組變量定義方法一:
[websrvs]
192.168.1.6 http_port=8000
192.168.1.12 http_port=10080


組變量定義方法二:

[websrvs]
192.168.1.6 
192.168.1.12 
[websrvs:vars]
http_port=8080


[root@rs1 ~]# cd /root/playbooks/
[root@rs1 playbooks]# vim vars.yaml

- hosts: websrvs
  remote_user: root
  vars:                      
  - pbvar: playbook variable testing   #變量聲明
  tasks:
  - name: command line variables
    copy: content={{ cmdvar }} dest=/tmp/cmd.var   #命令行變量引用伸但,保存到指定文件
  - name: playbook variables
    copy: content={{ pbvar }} dest=/tmp/pb.var   #變量引用肾请,保存到指定文件
  - name: host iventory variables
    copy: content={{ http_port }} dest=/tmp/hi.var  #主機(jī)列表定義引用,保存到指定文件
     [root@rs1 playbooks]# vim /etc/ansible/hosts 
[root@rs1 playbooks]# ansible-playbook -e cmdvar="command line variable testing" vars.yaml     #執(zhí)行命令測(cè)試 
PLAY [websrvs] *****************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.1.12]
ok: [192.168.1.6]

TASK [command line variables] **************************************************
changed: [192.168.1.6]
changed: [192.168.1.12]

TASK [playbook variables] ******************************************************
changed: [192.168.1.12]
changed: [192.168.1.6]

TASK [host iventory variables] *************************************************
changed: [192.168.1.6]
changed: [192.168.1.12]

PLAY RECAP *********************************************************************
192.168.1.12               : ok=4    changed=3    unreachable=0    failed=0   
192.168.1.6                : ok=4    changed=3    unreachable=0    failed=0   

(6)組嵌套

inventory中更胖,組還可以包含其它的組铛铁,并且也可以向組中的主機(jī)指定變量。不過却妨,這些變量只能在ansible-playbook中使用饵逐,而ansible不支持。例如:

[apache]
httpd1.xxx.com
httpd2.xxx.com

[nginx]
ngx1.xxx.com
ngx2.xxx.com

[webservers:children]
apache
nginx

[webservers:vars]
ntp_server=ntp.xxx.com

2彪标、模板模塊template

文本文檔腳本梳毙,使用模板語言編寫,支持Jinja2表達(dá)式語法

[root@rs1 playbooks]# cp redis.conf redis.conf.j2
[root@rs1 playbooks]# vim redis.conf.j2  #編輯文件
....
bind {{ ansible_ens33.ipv4.address }} #編輯模板段變量
.....                         
[root@rs1 playbooks]# vim template.yaml  #編輯playbook

- hosts: 192.168.1.6
  remote_user: root
  tasks:
  - name: install config file
    template: src=/root/playbooks/redis.conf.j2 dest=/tmp/redis.conf
[root@rs1 playbooks]# ansible-playbook template.yaml#執(zhí)行
PLAY [192.168.1.6] *************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.1.6]

TASK [install config file] *****************************************************
changed: [192.168.1.6]

PLAY RECAP *********************************************************************
192.168.1.6                : ok=2    changed=1    unreachable=0    failed=0   

客戶端:

[root@vs ~]# vim /tmp/redis.conf
.......
bind 192.168.1.6    #已把客戶主機(jī)ip寫入redis里面了
........  

示例二:
不同主機(jī)捐下,得到不同的配置

vim listen.conf
listen {{ http_port }}

vim httpd.yaml
- hosts:websrvs
 remote_user: root
 tasks:
   - name: install httpd
    yum: name=httpd state=latest
   - name: install config file
    template: src=/root/playbooks/mylisten.conf dest=/etc/httpd/conf.d/mylinsten.conf
- name: start httpd
service: name=httpd state=started

ansible-playbook --syntax-check httpd.yaml
ansible-playbook httpd.yaml

3账锹、when語句條件測(cè)試語句:

  • 如果需要根據(jù)變量萌业、facts或此前任務(wù)的執(zhí)行結(jié)果來做為某task執(zhí)行與否的前提時(shí)要用到條件測(cè)試。

  • 在task后添加when子句即可使用條件測(cè)試奸柬;when語句支持Jinja2表達(dá)式語法生年。

when:在task中使用,jinja2的語法格式
.- name: install conf file
template:src=files
when:什么時(shí)候執(zhí)行任務(wù)

判斷當(dāng)前系統(tǒng)是debian系統(tǒng)廓奕,就按照Apache2

示例:

vim os.yaml
      - hosts: websrvs
       remote_user: root
       tasks:
       - name: install httpd
        yum: name=httpd state=latest  
        when:ansible_os_family ==" RedHat"#判斷是否是紅帽系統(tǒng)
        - name: install apche2
        apt: name=apache2 state=latest
        when: ansible_os_family == "Debian"#判斷是否是debian系統(tǒng)
ansible-playbook -c os.yaml

when語句中還可以使用Jinja2的大多“filter”抱婉,例如要忽略此前某語句的錯(cuò)誤并基于其結(jié)果(failed或者sucess)運(yùn)行后面指定的語句,可使用類似如下形式:

tasks:
  - command: /bin/false
    register: result
    ignore_errors: True
  - command: /bin/something
    when: result|failed
  - command: /bin/something_else
    when: result|success
  - command: /bin/still/something_else
    when: result|skipped

此外桌粉,when語句中還可以使用facts或playbook中定義的變量

4蒸绩、迭代

  • 當(dāng)有需要重復(fù)性執(zhí)行的任務(wù)時(shí),可以使用迭代機(jī)制铃肯。其使用格式為將需要迭代的內(nèi)容定義為item變量引用患亿,并通過with_items語句來指明迭代的元素列表即可。
示例:安裝多個(gè)程序包
        vim  iter.yaml
        - hosts: websrvs
         remote_user: root
         tasks:
         - name:  instsll {{ item }} package
          yum: name= {{ item }} state=latest#安裝with_items里面的程序包
          with_items:
          - tomcat
          - tomcat-webapps
          - mariadb-server
    ansible-playbook  iter.yaml

5押逼、角色:roles

  • ansilbe自1.2版本引入的新特性步藕,用于層次性、結(jié)構(gòu)化地組織playbook挑格。roles能夠根據(jù)層次型結(jié)構(gòu)自動(dòng)裝載變量文件咙冗、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可漂彤。簡(jiǎn)單來講雾消,roles就是通過分別將變量、文件挫望、任務(wù)仪或、模板及處理器放置于單獨(dú)的目錄中,并可以便捷地include它們的一種機(jī)制士骤。角色一般用于基于主機(jī)構(gòu)建服務(wù)的場(chǎng)景中,但也可以是用于構(gòu)建守護(hù)進(jìn)程等場(chǎng)景中蕾域。

  • 自包含的目錄拷肌,以特定的層級(jí)目錄結(jié)構(gòu)化組織
    mkdir -pv /etc/ansible/roles/nginx/{files,templates,tasks,vars,handlers,meta,default}

示例:利用roles安裝nginx,并配置啟動(dòng)
cd /etc/ansible
vim roles/nginx/templates/vhost1.conf.j2 #編輯模板文件
   server{
           lisen 8080;
           server_name {{ anible_fqdn }}; 獲取主機(jī)名
           location / { 
                    root "/ngxdata/vhost1";
             }
           }
vim roles/nginx/files/index.html#編輯測(cè)試頁
   <h1>vhost</h1>

vim roles/nginx/handers/main.yml #編輯觸發(fā)文件
   - name: restart nginx
    service: name=nginx  state=restarted

vim roles/nginx/vars/main.yml#編輯變量文件
   ngxroot: /ngxdata/vhost1   #這里定義必須是字典模式旨巷,不加'-'

vim /etc/ansible/roles/nginx/tasks/main.yml
    - name:  install nginx
     yum: name=nginx state=latest
     when: ansible_os_family == "RedHat"#檢查是否是紅帽系統(tǒng)
    - name: install conf
     temlate: src=vhost1.conf.j2 dest=/etc/nginx/conf.d/vhost1.conf#傳遞模板文件
     tags: conf  標(biāo)簽
     notify: restart nginx
    -name: install site home directory
     file: path={{ ngxroot }} state=directory
    -name: install index page
     copy: src=index.html dist={{ ngxroot }}/#拷貝本地index測(cè)試頁到目標(biāo)主機(jī)的nginx根目錄
    -name: start nginx
     service:name=nginx state=started#啟動(dòng)nginx

cd   
vim nginx.yml
   - hosts: websrvs
     remote_user: root
    roles:
     - nginx   #調(diào)用角色

ansible-playbook -syntax-check nginx.yml #語法檢查
ansible-playbook nginx.yml #執(zhí)行

四巨缘、配置文件設(shè)置常用設(shè)置

配置文件設(shè)置

vim  ansible.cfg

[defaults]
forks=5  一次管控多少主機(jī)
sudo_user=root  切換到那個(gè)管理員  
ask_pass=true   切換時(shí)候是否需要密碼
remote_port =22 遠(yuǎn)程端口

roles_path  角色存放位置
module_name  不指明時(shí)候 調(diào)用默認(rèn)模塊

客戶端主機(jī)主動(dòng)到ansible服務(wù)器獲取配置用ansible-vcs第三方軟件來實(shí)現(xiàn),實(shí)際應(yīng)用中較少使用。

參考鏈接:http://www.reibang.com/p/3d50899842e2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末采呐,一起剝皮案震驚了整個(gè)濱河市若锁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斧吐,老刑警劉巖又固,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仲器,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡仰冠,警方通過查閱死者的電腦和手機(jī)乏冀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洋只,“玉大人辆沦,你說我怎么就攤上這事∈缎椋” “怎么了肢扯?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)担锤。 經(jīng)常有香客問我蔚晨,道長(zhǎng),這世上最難降的妖魔是什么妻献? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任蛛株,我火速辦了婚禮,結(jié)果婚禮上育拨,老公的妹妹穿的比我還像新娘谨履。我一直安慰自己,他們只是感情好熬丧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布笋粟。 她就那樣靜靜地躺著,像睡著了一般析蝴。 火紅的嫁衣襯著肌膚如雪害捕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天闷畸,我揣著相機(jī)與錄音尝盼,去河邊找鬼。 笑死佑菩,一個(gè)胖子當(dāng)著我的面吹牛盾沫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播殿漠,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼播揪,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼匠楚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤寒跳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帘营,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了琼富。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仪吧。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鞠眉,靈堂內(nèi)的尸體忽然破棺而出薯鼠,到底是詐尸還是另有隱情,我是刑警寧澤械蹋,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布出皇,位于F島的核電站,受9級(jí)特大地震影響哗戈,放射性物質(zhì)發(fā)生泄漏郊艘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一唯咬、第九天 我趴在偏房一處隱蔽的房頂上張望纱注。 院中可真熱鬧,春花似錦胆胰、人聲如沸狞贱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞎嬉。三九已至,卻和暖如春厚柳,著一層夾襖步出監(jiān)牢的瞬間氧枣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工别垮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留便监,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓碳想,卻偏偏與公主長(zhǎng)得像烧董,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子移袍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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

  • 1)安裝2)常用模塊3)inventory4)playbook(role\tag\template)5) yaml...
    秦記閱讀 4,131評(píng)論 2 5
  • 一、簡(jiǎn)介 在Linux自動(dòng)化運(yùn)維中老充,常見的自動(dòng)化運(yùn)維工具可分為需要安裝終端的puppet葡盗、func和不需要安裝終端...
    小尛酒窩閱讀 2,675評(píng)論 0 6
  • Ansible主配置文件:/etc/ansible/ansible.cfgInventory配置文件:/etc/a...
    劍膽琴心python閱讀 1,086評(píng)論 0 2
  • ansible-playbook playbook簡(jiǎn)介 playbook是ansible用于配置,部署,和管理被控...
    bdslinux閱讀 10,852評(píng)論 1 12
  • 簡(jiǎn)介 架構(gòu) 原理 組成 ANSIBLE PLAYBOOKS:任務(wù)劇本(任務(wù)集)觅够,編排定義Ansible任務(wù)集的配置...
    毛利卷卷發(fā)閱讀 1,047評(píng)論 0 2