Ansible自動化運維介紹

1、Ansible介紹

Ansible 簡單的說是一個配置管理系統(configuration management system)。你只須要可使用 ssh 訪問你的服務器或設備就行。它也不一樣於其餘工具,由於它使用推送的方式,而不是像 puppet 等 那樣使用拉取安裝agent的方式。你能夠將代碼部署到任意數量的服務器上!python

1.一、Ansible能作什麼

ansible能夠幫助咱們完成一些批量任務,或者完成一些須要常常重複的工做。mysql

  • 好比:同時在100臺服務器上安裝nginx服務,並在安裝後啓動它們。
  • 好比:將某個文件一次性拷貝到100臺服務器上。
  • 好比:每當有新服務器加入工做環境時,你都要爲新服務器部署某個服務,也就是說你須要常常重複的完成相同的工做。

這些場景中咱們均可以使用到ansible。nginx

1.二、Ansible特性

  • 模塊化:調用特定的模塊,完成特定任務
  • 有Paramiko,PyYAML,Jinja2(模板語言)三個關鍵模塊
  • 支持自定義模塊
  • 基於Python語言實現
  • 部署簡單,基於python和SSH(默認已安裝),agentless
  • 安全,基於OpenSSH
  • 支持playbook編排任務
  • 冪等性:一個任務執行1遍和執行n遍效果同樣,不因重複執行帶來意外狀況
  • 無需代理不依賴PKI(無需ssl)
  • 可以使用任何編程語言寫模塊
  • YAML格式,編排任務,支持豐富的數據結構
  • 較強大的多層解決方案

1.三、Ansible架構

clip_image0026

Ansible核心組件說明:web

AnsibleAnsible的核心程序
Host Lnventory記錄了每個由Ansible管理的主機信息,信息包括ssh端口,root賬號密碼,ip地址等等。能夠經過file來加載,能夠經過CMDB加載
PlaybooksYAML格式文件,多個任務定義在一個文件中,使用時能夠統一調用,「劇本」用來定義那些主機須要調用那些模塊來完成的功能.
Core ModulesAnsible執行任何管理任務都不是由Ansible本身完成,而是由核心模塊完成;Ansible管理主機以前,先調用core Modules中的模塊,而後指明管理Host Lnventory中的主機,就能夠完成管理主機。
Custom Modules自定義模塊,完成Ansible核心模塊沒法完成的功能,此模塊支持任何語言編寫。
Connection Plugins鏈接插件,Ansible和Host通訊使用sql

2、配置elep源

2.一、RHEL/Centos6

# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpmshell

2.二、RHEL/Centos7

# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm數據庫

3、安裝ansible

# yum install ansible編程

補充、用戶密碼、密鑰登陸

補充一、用戶密碼登陸

1.一、安裝ssh_pass包

Ubuntu安裝方式 apt-get install sshpassvim

Centos 安裝方式 yum install sshpasscentos

1.二、ansible配置文件修改

ansible.cfg配置文件修改

# vim /etc/ansible/ansible.cfg

##資產信息列表文件

inventory = /etc/ansible/hosts

##容許併發的數量爲5個併發,也就是能夠能夠同時進行5個任務

forks = 5

##默認爲root用戶執行

sudo_user = root

##默認端口爲22端口

remote_port = 22

##取消註釋以禁用SSH密鑰主機檢查

host_key_checking = False

##超時時間

timeout = 10

##日誌存放時間

log_path = /var/log/ansible.log

##私鑰的目錄

#private_key_file = /path/to/file

hosts資產信息列表文件修改

# cat /etc/ansible/hosts

[aliyun]

106.14.220.53 ansible_ssh_user=root ansible_ssh_pass='XUchangming1993285'

1.三、測試登陸

# ansible aliyun -a 'ls /etc/ansible'

106.14.220.53 | SUCCESS | rc=0 >>

ansible.cfg

ansible.cfg.bak

hosts

hosts.bak

roles

[root@iZuf6e15robw9amyc9qt1lZ ansible]#

補充二、密鑰登陸

2.一、生成並配置ssh公鑰、私鑰

公鑰文件爲公鑰id_rsa.pub,私鑰文件爲id_rsa

clip_image0046

使用ssh-copy-id IP命令把公鑰發送到指定主機

clip_image0066

測試使用ssh登陸遠程主機看是否能登陸

clip_image0086

2.二、配置ansible的hosts資產列表文件

hosts資產信息列表文件修改

# cat /etc/ansible/hosts

[aliyun]

106.14.220.53 ansible_ssh_user=root ansible_ssh_key_file=/root/.ssh/id_rsa

4、ansible命令

4.1查看ansible幫助文檔

# ansible –h

4.二、格式選項

ansible <host-pattern> [options]

options選項:

選項

註釋

實例

-u

登陸遠程主機用戶名,默認爲root (可省略)

-i

指定用戶清單,對那些清單進行操做,默認爲(/etc/ansible/hosts)文件中的主機 (可省略)

-m

指定模塊的名稱

-a

指定模塊的參數,具體執行的指令

-k

提示輸入遠程主機的密碼

-C

只是測試一下會改變什麼內容,不會真正去執行;相反,試圖預測一些可能發生的變化

--list-hosts

輸出匹配主機的列表

ansible all --list-hosts

--version

顯示程序版本號

-v

輸出執行的詳細信息,使用-vvv得到更多,-vvvv 啓用鏈接調試

5、添加遠程主機

添加遠程主機的配置文件爲/etc/ansible/hosts文件。

添加一個組名稱爲aliyun,添加阿里雲服務器IP,以下:

# vim /etc/ansible/hosts

[aliyun]

106.14.220.53

6、第一個列子

# ansible -i /etc/ansible/hosts aliyun -u root -m command -a 'ls /home' -k

SSH password:

106.14.220.53 | SUCCESS | rc=0 >>

backup.sh

www

xuchangming.txt

7、ansible經常使用模塊

7.一、使用ansible-doc –l查看自己自帶的模塊

7.二、setup模塊

Setup模塊主要用卡查看遠程主機的一些基本信息

# ansible -k aliyun -m setup

clip_image0106

7.三、ping模塊

主要用於ping主機是否能ping通網絡,若是主機在線則返回pong

# ansible -k aliyun -m ping

clip_image0126

7.四、file文件模塊

file模塊主要用於遠程主機上的文件操做,file模塊包含以下選項:
– force:須要在兩種狀況下強制建立軟連接,一種是源文件不存在但以後會創建的狀況下;另外一種是目標軟連接已存在,須要先取消以前的軟鏈,而後建立新的軟鏈,有兩個選項:yes|no

– group:定義文件/目錄的屬組
– mode:定義文件/目錄的權限
– owner:定義文件/目錄的屬主
– path:必選項,定義文件/目錄的路徑
– recurse:遞歸的設置文件的屬性,只對目錄有效
– src:要被連接的源文件的路徑,只應用於state=link的狀況
– dest:被連接到的路徑,只應用於state=link的狀況
– state:
   directory:若是目錄不存在,建立目錄
   file:即便文件不存在,也不會被建立
   link:建立軟連接
   hard:建立硬連接
   touch:若是文件不存在,則會建立一個新的文件,若是文件或目錄已存在,則更新其最後修改時間
   absent:刪除目錄、文件或者取消連接文件

7.4.一、建立軟鏈接

# ansible -k aliyun -m file -a "src=/var/DZWeb dest=/mnt/DZWeb state=link"

clip_image0146

7.4.二、刪除文件

# ansible -k aliyun -m file -a "path=/mnt/DZWeb state=absent"

clip_image0166

7.4.三、建立文件

# ansible -k aliyun -m file -a "path=/mnt/zhangfile state=touch"

clip_image0186

7.4.四、建立目錄
7.4.4.一、建立默認權限,默認屬組屬主的目錄

# ansible -k aliyun -m file -a 'path=/mnt/zhangfile state=directory'

clip_image0206

7.4.4.二、建立權限爲777,屬組屬主爲root的目錄

# ansible -k aliyun -m file -a 'path=/mnt/namedir state=directory group=root owner=root mode=777'

clip_image0226

7.五、copy複製模塊

複製文件到遠程主機,copy模塊包含以下選項:

· backup:在覆蓋以前將原文件備份,備份文件包含時間信息。有兩個選項:yes|no

· content:用於替代"src",能夠直接設定指定文件的值

· dest:必選項。要將源文件複製到的遠程主機的絕對路徑,若是源文件是一個目錄,那麼該路徑也必須是個目錄

· directory_mode:遞歸的設定目錄的權限,默認爲系統默認權限

· -group:定義文件/目錄的屬組
– mode:定義文件/目錄的權限
– owner:定義文件/目錄的屬主

· force:若是目標主機包含該文件,但內容不一樣,若是設置爲yes,則強制覆蓋,若是爲no,則只有當目標主機的目標位置不存在該文件時,才複製。默認爲yes

· others:全部的file模塊裏的選項均可以在這裏使用

· src:要複製到遠程主機的文件在本地的地址,能夠是絕對路徑,也能夠是相對路徑。若是路徑是一個目錄,它將遞歸複製。在這種狀況下,若是路徑使用"/"來結尾,則只複製目錄裏的內容,若是沒有使用"/"來結尾,則包含目錄在內的整個內容所有複製,相似於rsync。

· validate :The validation command to run before copying into place. The path to the file to validate is passed in via '%s' which must be present as in the visudo example below.

· clip_image0246

7.5.一、複製文件

# ansible aliyun -k -m copy -a 'src=/root/buffer.sh dest=/mnt/buffer.sh'

clip_image0266

7.5.二、複製文件並修改屬組屬主和權限

# ansible aliyun -k -m copy -a 'src=/root/buffer.sh dest=/mnt/buffer group=zabbix owner=zabbix mode=777'

clip_image0286

7.5.三、複製相同文件時,覆蓋時並備份

目標主機的源文件

# ansible aliyun -k -m command -a 'cat /mnt/buffer.sh'

clip_image0306

當前主機更改後的源文件

# ansible aliyun -k -m command -a 'cat /root/buffer.sh'

clip_image0326

經過Ansible複製文件到目標主機

# ansible aliyun -k -m copy -a 'src=/root/buffer.sh dest=/mnt/buffer.sh group=zabbix owner=zabbix mode=777 backup=yes'

clip_image0346

查看目標主機的文件目錄和複製後的文件及備份後的文件內容

clip_image0366clip_image0386

7.六、command命令模塊

功能:命令模塊,默認模塊,用於在遠程主機執行命令,缺點:運行的命令中沒法使用變量,管道。變量和操做符號 "<", ">", "|", ";" and "&" 不能正常工做。若是須要使用,請使用 shell 模塊。省略不寫模塊信息名稱則默認爲command模塊

action: command

chdir # 在執行命令以前,先切換到該目錄

creates # 一個文件名,當這個文件存在,則該命令不執行

executable # 切換shell來執行命令,該執行路徑必須是一個絕對路徑

free_form= #要執行的Linux指令,通常使用Ansible的-a參數代替。

removes #一個文件名,這個文件不存在,則該命令不執行

7.6.一、creates使用,當文件存在則該命令不執行,不存在則執行

# ansible aliyun -k -m command -a 'creates=/mnt/aaa.jpg ls /mnt'

clip_image0406

7.6.二、chdir在執行命令以前,先切換到該目錄

ansible aliyun -k -m command -a 'ls /mnt/zhang'

ansible -k aliyun -m command -a 'chdir=/mnt/zhang/ ls'

以上兩條命令是等價的,第一條是經過絕對路徑進行查詢,第二條命令是先進入目錄在進行查詢至關於cd /mnt/zhang 和 ls兩條命令的結合體

clip_image0426

7.七、shell模塊

功能:在遠程節點上執行命令。

與command模快使用一致,可是,變量 和操做符號 "<", ">", "|", ";" and "&" 能正常工做。示例:

ansible test -m shell -a "somescript.sh >> somelog.txt"

我這裏使用通配符,使用command模塊是不行的。

# ansible cluster1 -m command -a 'ls -d /usr/local/tomcat0[1-3]'

10.0.0.4 | FAILED | rc=2 >>

ls: cannot access /usr/local/tomcat0[1-3]: No such file or directorynon-zero return code

10.0.0.9 | FAILED | rc=2 >>

ls: cannot access /usr/local/tomcat0[1-3]: No such file or directorynon-zero return code

改爲shell模塊就能夠。

# ansible cluster1 -m shell -a 'ls -d /usr/local/tomcat0[1-3]'

10.0.0.4 | SUCCESS | rc=0 >>

/usr/local/tomcat01

/usr/local/tomcat02

/usr/local/tomcat03

10.0.0.9 | SUCCESS | rc=0 >>

/usr/local/tomcat01

/usr/local/tomcat02

/usr/local/tomcat03

7.八、service管理服務模塊

用於管理服務
該模塊包含以下選項:

· arguments:給命令行提供一些選項

· name:必選項,服務名稱

· state:對當前服務執行啓動,中止、重啓、從新加載等操做(started,stopped,restarted,reloaded)

· sleep:若是執行了restarted,在則stop和start之間沉睡幾秒鐘

· enabled:是否開機啓動 yes|no

· pattern:定義一個模式,若是經過status指令來查看服務的狀態時,沒有響應,就會經過ps指令在進程中根據該模式進行查找,若是匹配到,則認爲該服務依然在運行

· runlevel:運行級別

7.8.一、啓動vsftpd

# ansible -k aliyun -m service -a 'name=vsftpd state=started'

clip_image0446

7.8.二、中止vsftpd

# ansible -k aliyun -m service -a 'name=vsftpd state=stopped'

clip_image0466

7.九、cron計劃任務模塊

用於管理計劃任務

包含以下選項:

    backup:對遠程主機上的原任務計劃內容修改以前作備份

    cron_file:若是指定該選項,則用該文件替換遠程主機上的cron.d目錄下的用戶的任務計劃

    day:日(1-31,*,*/2,……)

    hour:小時(0-23,*,*/2,……)

    minute:分鐘(0-59,*,*/2,……)

    month:月(1-12,*,*/2,……)

    weekday:周(0-7,*,……)

    job:要執行的任務,依賴於state=present

    name:該任務的描述

    special_time:指定何時執行,參數:reboot,yearly,annually,monthly,weekly,daily,hourly

    state:確認該任務計劃是建立仍是刪除。默認爲建立,刪除爲state=absent

    user:以哪一個用戶的身份執行

7.9.一、添加計劃任務

添加計劃任務天天的2點執行ls命令,註釋爲ls /mnt

# ansible -k aliyun -m cron -a 'name="ls /mnt" hour=2 user=root job="sbin/ls" '

clip_image0486

查看計劃任務

[root@iZuf6e15robw9amyc9qt1lZ zhang]# ansible -k aliyun -m command -a 'crontab -l'

clip_image0506

7.9.二、刪除計劃任務

# ansible -k aliyun -m cron -a 'name="ls /mnt" hour=2 user=root job="sbin/ls" state=absent '

clip_image0526

查看是否被刪掉了

# ansible -k aliyun -m command -a 'crontab -l'

clip_image0546

8.0、filesystem模塊

在塊設備上建立文件系統

選項:

    dev:目標塊設備

   force:在一個已有文件系統的設備上強制建立

    fstype:文件系統的類型

   opts:傳遞給mkfs命令的選項

8.一、yum模塊

使用yum包管理器來管理軟件包

選項:

    config_file:yum的配置文件

    disable_gpg_check:關閉gpg_check

    disablerepo:不啓用某個源

    enablerepo:啓用某個源

    list

    name:要進行操做的軟件包的名字,也能夠傳遞一個url或者一個本地的rpm包的路徑

    state:狀態(absent, installed, latest, present, removed)

8.1.一、yum安裝軟件

# ansible -k aliyun -m yum -a 'name=ftp state=installed'

clip_image0566

8.1.二、使用yum安裝軟件包組

#  ansible test -m yum -a 'name="@Development tools" state=present'

8.1.三、安裝網絡rpm包

# ansible test -m yum -a 'name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present'

8.二、user用戶管理模塊

管理用戶

createhome: 是否建立家目錄

home: 家目錄

groups: 組

uid: uid

password: 登陸密碼

name: 用戶名稱

      system:

remove: 配合state=absent使用,刪除用戶的家目錄->remove=yes

state: present建立,absent刪除

shell: 用戶的shell設定

須要特別說明的是,password後面指定的密碼不能是明文,後面這一串密碼會被直接傳送到被管理主機的/etc/shadow文件中,而登錄的時候輸入的密碼會被hash加密之後再去與/etc/shadow中存放的密碼去作對比,會出現不一致的現象。因此須要先將密碼字符串進行加密處理:openssl passwd -salt -1 "123456",而後將獲得的字符串放到password中便可。

8.2.一、建立用戶

# ansible -k aliyun -m user -a 'createhome=yes home=/home/zhang password=zhang name=zhang state=present shell=/bin/bash'

clip_image0586

clip_image0606

8.2.二、刪除用戶

# ansible -k aliyun -m user -a 'remove=yes state=absent name=zhang' clip_image0626

8.三、synchronize同步文件模塊

使用sync同步文件

src: 源,同步的數據源

dest=: 目標地址

dest_port: 目標接受的端口,ansible配置文件中的ansible_ssh_port變量優先級高於該dest_port變量

group: 文件屬組

owner: 文件屬主

mode:(push, pull): 模式,rsync同步的方式PUSH / PULL,默認都是推送push,若是你在使用拉取pull功能的時候,能夠參考以下來實現mode=pull更改推送模式爲拉取模式

dirs: 以非遞歸的方式傳輸目錄,默認爲no,即進行目錄遞歸

archive: 是否採用歸檔模式同步,即以源文件相同屬性同步到目標地址

checksum: 是否校驗

compress: 開啓壓縮,默認爲開啓

copy_links: 同步的時候是否複製鏈接

delete: 刪除源中沒有而目標存在的文件(即以推送方爲主)

existing_only: skip createing new files on receiver

links

recursive: 是否遞歸yes / no

rsync_path: 服務的路徑,指定rsync命令在遠程服務器上運行。這個參考rsync命令的—sync-path參數,--rsync-path=PATH指定遠程服務器上rsync命令所在的路徑信息

times: 保持時間屬性

8.3.一、同步文件

# ansible -k aliyun -m synchronize -a 'src=/opt/zhang dest=/root'

clip_image0646

8.3.二、同步目錄

# ansible -k aliyun -m synchronize -a 'src=/opt/j dest=/root/ mode=push rsync_path=/usr/bin/rsync'

clip_image0666

8.四、mount分區掛載模塊

配置掛載點

選項:

    dump

    fstype:必選項,掛載文件的類型

    name:必選項,掛載點

    opts:傳遞給mount命令的參數

    passno

    src:必選項,要掛載的文件

    state:必選項

            present:只處理fstab中的配置

            absent:刪除掛載點

            mounted:自動建立掛載點並掛載之

            umounted:卸載

示例:

    name=/mnt/dvd src=/dev/sr0 fstype=iso9660 opts=ro state=present

    name=/srv/disk src='LABEL=SOME_LABEL' state=present

    name=/home src='UUID=b3e48f45-f933-4c8e-a700-22a159ec9077' opts=noatime state=present

    ansible test -a 'dd if=/dev/zero of=/disk.img bs=4k count=1024'

    ansible test -a 'losetup /dev/loop0 /disk.img'

    ansible test -m filesystem 'fstype=ext4 force=yes opts=-F dev=/dev/loop0'

    ansible test -m mount 'name=/mnt src=/dev/loop0 fstype=ext4 state=mounted opts=rw'

8.五、get_url下載模塊

get_url模塊主要用於下載,相似於 shell 命令 curl 或者 wget

參數

必填

默認值

註解

url

yes

url地址

dest

no

下載存放的路徑

8.5.一、下載網絡rpm包並保存在/opt目錄下

# ansible -k aliyun -m get_url -a 'url=http://mirror.centos.org/centos/7/os/x86_64/Packages/apr-1.4.8-3.el7_4.1.x86_64.rpm dest=/opt'

clip_image0686

8、Playbook

8.一、Playbooks 簡介

Playbooks 與 adhoc 相比,是一種徹底不一樣的運用 ansible 的方式,是很是之強大的.

簡單來講,playbooks 是一種簡單的配置管理系統與多機器部署系統的基礎.與現有的其餘系統有不一樣之處,且很是適合於複雜應用的部署.

Playbooks 可用於聲明配置,更強大的地方在於,在 playbooks 中能夠編排有序的執行過程,甚至於作到在多組機器間,來回有序的執行特別指定的步驟.而且能夠同步或異步的發起任務.

咱們使用 adhoc 時,主要是使用 /usr/bin/ansible 程序執行任務.而使用 playbooks 時,更可能是將之放入源碼控制之中,用之推送你的配置或是用於確認你的遠程系統的配置是否符合配置規範.

clip_image0706

8.二、playbook的組成

Paly:定義的是主機的角色

Task:定義的是具體執行的任務

Playboot:由一個或多個play組成,一個play能夠包含多個task

clip_image0726

8.三、playbook的優點

一、功能比abhoc更全

二、控制依賴關係比較好

三、展示更直觀

四、持久使用

8.四、playbook的配置語法

8.4.一、基本使用
一、playbook基礎使用

Playbook的語法格式:ansible-playbook [options] playbook.yml [playbook2 ...]

Options參數:

l -u REMOTE_USER, --user=REMOTE_USER # ssh 鏈接的用戶名

l -k, --ask-pass #ssh登陸認證密碼

l -s, --sudo #sudo 到root用戶,至關於Linux系統下的sudo命令

l -U SUDO_USER, --sudo-user=SUDO_USER #sudo 到對應的用戶

l -K, --ask-sudo-pass #用戶的密碼(—sudo時使用)

l -T TIMEOUT, --timeout=TIMEOUT # ssh 鏈接超時,默認 10 秒

l -C, --check # 指定該參數後,執行 playbook 文件不會真正去執行,而是模擬執行一遍,而後輸出本次執行會對遠程主機形成的修改

l -e EXTRA_VARS, --extra-vars=EXTRA_VARS # 設置額外的變量如:key=value 形式 或者 YAML or JSON,以空格分隔變量,或用多個-e

l -f FORKS, --forks=FORKS # 進程併發處理,默認 5

l -i INVENTORY, --inventory-file=INVENTORY # 指定 hosts 文件路徑,默認 default=/etc/ansible/hosts

l -l SUBSET, --limit=SUBSET #指定一個 pattern,對- hosts:匹配到的主機再過濾一次

l --list-hosts #只打印有哪些主機會執行這個 playbook 文件,不是實際執行該 playbook

l --list-tasks #列出該 playbook 中會被執行的 task

l --private-key=PRIVATE_KEY_FILE # 私鑰路徑

l --step # 同一時間只執行一個 task,每一個 task 執行前都會提示確認一遍

l --syntax-check # 只檢測 playbook 文件語法是否有問題,不會執行該 playbook

l -t TAGS, --tags=TAGS #當 play 和 task 的 tag 爲該參數指定的值時才執行,多個 tag 以逗號分隔

l --skip-tags=SKIP_TAGS #當 play 和 task 的 tag 不匹配該參數指定的值時,才執行

l -v, --verbose #輸出更詳細的執行過程信息,-vvv可獲得全部執行過程信息。

二、使用場景

Ø Playbook的配置

演示列子:

[root@iZuf6e15robw9amyc9qt1lZ ansible]# cat ce.yml

---

- hosts: 106.14.220.53

remote_user: root

vars:

touch_file: zhang.file

tasks:

- name: touch file

# shell: echo hello world `date` by `hostname` >/tmp/hello.log

shell: "touch /opt/{{touch_file}}"clip_image0746

功能爲:在192.168.1.101主機上在tmp目錄下建立一個imoocc.file文件

Ø Playbook命令的執行

# ansible-playbook -i /etc/ansible/hosts --list-hosts ./f1.yml

# ansible-playbook ./f1.yml

Ø 執行結果返回

clip_image0765

#ansible-playbook -i /etc/ansible/hosts --list-hosts ./f1.yml結果爲:

clip_image0785

# ansible-playbook ./f1.yml結果爲:

clip_image0805

8.4.二、yaml語法和變量
8.4.2.一、yaml語法
一、yaml語法注意項

l 大小寫敏感

l 使用縮進表示層級關係(只能使用空格不能使用tab)

l yaml文件以「- - -」做爲文檔的開始

二、支持的數據結構

數據結構能夠爲字典,列表,純量三種

字典 列表 純量:數字、布爾、字符串

{name:jeson} -Aple

-Orange

-strawberry

-Mango

三、yaml變量的應用

myname:jeson

name:「{{myname}}」

8.4.2.二、playbook變量

變量的定義

l playbook的yaml文件中定義變量賦值

列子:

使用# ansible-playbook ./ce.yml命令執行便可

clip_image0815

l --extra-vars執行參數付給變量

使用--extra-vars參數進行賦值變量

列子:

clip_image0835

clip_image0855

l 在文件中定義變量

文件中定義變量是指在hosts資產列表文件中添加變量

clip_image0875

l 註冊變量

register關鍵字能夠存儲指定命令的輸出結果到一個自定義的變量中

-name:get time

command:date

register:date_output

clip_image0895

8.4.三、基本語句

實例請查看本文後面的《playbook基本語句實例

一、條件語句

when語句

列子:

clip_image0915

二、循環語句

循環類型

關鍵字

標準循環

with_items

嵌套循環

with_nested

遍歷字典

with_dict

並行遍歷列表

with_together

遍歷列表和索引

with_indexed_items

遍歷文件列表的內容

with_file

遍歷目錄文件

with_fileglob

重試循環

until

查找第一個匹配文件

with_first_found

隨機選擇

with_random_choice

在序列中循環

with_sequence

三、條件循環語句複用

8.4.四、異常處理和相關操做
一、異常處理

Ø 忽略錯誤

默認會檢查命令和模塊的返回狀態,遇到錯誤就中斷playbook的執行

加入參數:ignore_errors:yes 進行忽略錯誤

例子:

說明:/bin/false返回狀態爲1,即錯誤信息,touch文件命令正常工做

clip_image0935

執行命令以後報錯

clip_image0955

添加忽略錯誤信息並執行clip_image0975

clip_image0995

Ø 自定義錯誤

Ø 自定義change狀態

例子:

不添加changed標籤的狀態

clip_image1015

clip_image1035

添加運行changed標籤的結果

clip_image1055 clip_image1075

二、tags標籤處理

意義:經過tags和任務對象進行捆綁,控制部分或者指定的task執行

Ø 打標籤

對一個對象打一個標籤

對一個對象打多個標籤

打標籤的對象包括:單個task任務、include對象、roles對象等

例子:

clip_image1095

Ø 標籤的使用

-t:執行指定的tag標籤任務

--skip-tags:執行—skip-tags以外的標籤任務

例子:

只執行cfile1標籤,執行結果以下

clip_image1115

只執行除了cfile1以外的標籤,結果以下

clip_image1135

8.4.五、roles角色和場景演練
一、使用roles
a) 、include的用法

include_tasks/include:動態的包含tasks任務列表執行clip_image1155

實例:

添加touchf1.yml文件

clip_image1175

添加touchf2.yml文件

clip_image1195

添加include文件

clip_image1215

執行結果便可

b) 、爲何須要使用到roles
c) 、官方建議的劇本結構
d) 、劇本涉及的思路
二、場景演練

錯誤解決

一、在第一次使用時,報下面錯誤

[root@localhost ~]# ansible -k aliyun -m command -a 'ls'

SSH password:

192.168.1.101 | FAILED | rc=-1 >>

Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host.

[root@localhost ~]#

解決方法:使用ssh 手動鏈接下就能夠

playbook基本語句實例

種類1、標準循環
添加多個用戶

- name: add several users

user: name={{ item }} state=present groups=wheel

with_items:

- testuser1

- testuser2

添加多個用戶,並將用戶加入不一樣的組內。

- name: add several users

user: name={{ item.name }} state=present groups={{ item.groups }}

with_items:

- { name: 'testuser1', groups: 'wheel' }

- { name: 'testuser2', groups: 'root' }

種類2、錨點嵌套循環
分別給用戶授予3個數據庫的全部權限

- name: give users access to multiple databases

mysql_user: name={{ item[0] }} priv={{ item[1] }}.*:ALL append_privs=yes password=foo

with_nested:

- [ 'alice', 'bob' ]

- [ 'clientdb', 'employeedb', 'providerdb' ]

種類3、錨點遍歷字典
輸出用戶的姓名和電話

tasks:

- name: Print phone records

debug: msg="User {{ item.key }} is {{ item.value.name }} ({{ item.value.telephone }})"

with_dict: {'alice':{'name':'Alice Appleworth', 'telephone':'123-456-789'},'bob':{'name':'Bob Bananarama', 'telephone':'987-654-3210'} }

種類4、錨點並行遍歷列表

tasks:

- debug: "msg={{ item.0 }} and {{ item.1 }}"

with_together:

- [ 'a', 'b', 'c', 'd','e' ]

- [ 1, 2, 3, 4 ]

若是列表數目不匹配,用None補全

種類5、錨點遍歷列表和索引

- name: indexed loop demo

debug: "msg='at array position {{ item.0 }} there is a value {{ item.1 }}'"

with_indexed_items: [1,2,3,4]

item.0 爲索引,item.1爲值

種類6、錨點遍歷文件列表的內容

---

- hosts: all

tasks:

- debug: "msg={{ item }}"

with_file:

- first_example_file

- second_example_file

種類7、錨點遍歷目錄文件
with_fileglob匹配單個目錄中的全部文件,非遞歸匹配模式。

---

- hosts: all

tasks:

- file: dest=/etc/fooapp state=directory

- copy: src={{ item }} dest=/etc/fooapp/ owner=root mode=600

with_fileglob:

- /playbooks/files/fooapp/*

當在role中使用with_fileglob的相對路徑時,Ansible解析相對於roles/<rolename>/files目錄的路徑。

種類8、錨點遍歷ini文件
lookup.ini
[section1]
value1=section1/value1
value2=section1/value2

[section2]
value1=section2/value1
value2=section2/value2

- debug: msg="{{ item }}"

with_ini: value[1-2] section=section1 file=lookup.ini re=true

獲取section1 裏的value1和value2的值

種類9、錨點重試循環 until

- action: shell /usr/bin/foo

register: result

until: result.stdout.find("all systems go") != -1

retries: 5

delay: 10

"重試次數retries" 的默認值爲3,"delay"爲5。

錨點查找第一個匹配文件

tasks:

- debug: "msg={{ item }}"

with_first_found:

- "/tmp/a"

- "/tmp/b"

- "/tmp/default.conf"

依次尋找列表中的文件,找到就返回。若是列表中的文件都找不到,任務會報錯。

種類10、錨點隨機選擇with_random_choice
隨機選擇列表中得一個值

- debug: msg={{ item }}

with_random_choice:

- "go through the door"

- "drink from the goblet"

- "press the red button"

- "do nothing"

循環程序的結果
tasks:

· debug: "msg={{ item }}"
with_lines: ps aux
種類11、錨點循環子元素
定義好變量

#varfile

---

users:

- name: alice

authorized:

- /tmp/alice/onekey.pub

- /tmp/alice/twokey.pub

mysql:

password: mysql-password

hosts:

- "%"

- "127.0.0.1"

- "::1"

- "localhost"

privs:

- "*.*:SELECT"

- "DB1.*:ALL"

- name: bob

authorized:

- /tmp/bob/id_rsa.pub

mysql:

password: other-mysql-password

hosts:

- "db1"

privs:

- "*.*:SELECT"

- "DB2.*:ALL"

---

- hosts: web

vars_files: varfile

tasks:

- user: name={{ item.name }} state=present generate_ssh_key=yes

with_items: "{{ users }}"

- authorized_key: "user={{ item.0.name }} key='{{ lookup('file', item.1) }}'"

with_subelements:

- "{{ users }}"

- authorized

- name: Setup MySQL users

mysql_user: name={{ item.0.name }} password={{ item.0.mysql.password }} host={{ item.1 }} priv={{ item.0.mysql.privs | join('/') }}

with_subelements:

- "{{ users }}"

- mysql.hosts

{{ lookup('file', item.1) }} 是查看item.1文件的內容

with_subelements 遍歷哈希列表,而後遍歷列表中的給定(嵌套)的鍵。

種類12、錨點在序列中循環with_sequence
with_sequence以遞增的數字順序生成項序列。 您能夠指定開始,結束和可選步驟值。 參數應在key = value對中指定。 'format'是一個printf風格字符串。

數字值能夠以十進制,十六進制(0x3f8)或八進制(0600)指定。 不支持負數。

---

- hosts: all

tasks:

# 建立組

- group: name=evens state=present

- group: name=odds state=present

# 建立格式爲testuser%02x 的0-32 序列的用戶

- user: name={{ item }} state=present groups=evens

with_sequence: start=0 end=32 format=testuser%02x

# 建立4-16之間得偶數命名的文件

- file: dest=/var/stuff/{{ item }} state=directory

with_sequence: start=4 end=16 stride=2

# 簡單實用序列的方法:建立4 個用戶組分表是組group1 group2 group3 group4

- group: name=group{{ item }} state=present

with_sequence: count=4

種類十3、錨點隨機選擇with_random_choice
隨機選擇列表中得一個值

- debug: msg={{ item }}

with_random_choice:

- "go through the door"

- "drink from the goblet"

- "press the red button"

- "do nothing"

合併列表

安裝全部列表中的軟件

- name: flattened loop demo

yum: name={{ item }} state=installed

with_flattened:

- [ 'foo-package', 'bar-package' ]

- [ ['one-package', 'two-package' ]]

- [ ['red-package'], ['blue-package']]

註冊變量使用循環

- shell: echo "{{ item }}"

with_items:

- one

- two

register: echo

- name: Fail if return code is not 0

fail:

msg: "The command ({{ item.cmd }}) did not have a 0 return code"

when: item.rc != 0

with_items: "{{ echo.results }}"

循環主機清單

輸出全部主機清單裏的主機

- debug: msg={{ item }}

with_items: "{{ groups['all'] }}"

輸出全部執行的主機

- debug: msg={{ item }}

with_items: play_hosts

輸出全部主機清單裏的主機

· debug: msg={{ item }}
with_inventory_hostnames: all

輸出主機清單中不在www中的全部主機

· debug: msg={{ item }}
with_inventory_hostnames: all:!www
改變循環的變量項

# main.yml

- include: inner.yml

with_items:

- 1

- 2

- 3

loop_control:

loop_var: outer_item

# inner.yml

- debug: msg="outer item={{ outer_item }} inner item={{ item }}"

with_items:

- a

- b

- c

相關文章
相關標籤/搜索