Ansible 簡單的說是一個配置管理系統(configuration management system)。你只須要可使用 ssh 訪問你的服務器或設備就行。它也不一樣於其餘工具,由於它使用推送的方式,而不是像 puppet 等 那樣使用拉取安裝agent的方式。你能夠將代碼部署到任意數量的服務器上!python
ansible能夠幫助咱們完成一些批量任務,或者完成一些須要常常重複的工做。mysql
這些場景中咱們均可以使用到ansible。nginx
Ansible核心組件說明:web
Ansible:Ansible的核心程序
Host Lnventory:記錄了每個由Ansible管理的主機信息,信息包括ssh端口,root賬號密碼,ip地址等等。能夠經過file來加載,能夠經過CMDB加載
Playbooks:YAML格式文件,多個任務定義在一個文件中,使用時能夠統一調用,「劇本」用來定義那些主機須要調用那些模塊來完成的功能.
Core Modules:Ansible執行任何管理任務都不是由Ansible本身完成,而是由核心模塊完成;Ansible管理主機以前,先調用core Modules中的模塊,而後指明管理Host Lnventory中的主機,就能夠完成管理主機。
Custom Modules:自定義模塊,完成Ansible核心模塊沒法完成的功能,此模塊支持任何語言編寫。
Connection Plugins:鏈接插件,Ansible和Host通訊使用sql
# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpmshell
# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm數據庫
# yum install ansible編程
Ubuntu安裝方式 apt-get install sshpassvim
Centos 安裝方式 yum install sshpasscentos
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'
# 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]#
公鑰文件爲公鑰id_rsa.pub,私鑰文件爲id_rsa
使用ssh-copy-id IP命令把公鑰發送到指定主機
測試使用ssh登陸遠程主機看是否能登陸
hosts資產信息列表文件修改
# cat /etc/ansible/hosts
[aliyun]
106.14.220.53 ansible_ssh_user=root ansible_ssh_key_file=/root/.ssh/id_rsa
# ansible –h
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 啓用鏈接調試 |
添加遠程主機的配置文件爲/etc/ansible/hosts文件。
添加一個組名稱爲aliyun,添加阿里雲服務器IP,以下:
# vim /etc/ansible/hosts
[aliyun]
106.14.220.53
# 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
Setup模塊主要用卡查看遠程主機的一些基本信息
# ansible -k aliyun -m setup
主要用於ping主機是否能ping通網絡,若是主機在線則返回pong
# ansible -k aliyun -m ping
file模塊主要用於遠程主機上的文件操做,file模塊包含以下選項:
– force:須要在兩種狀況下強制建立軟連接,一種是源文件不存在但以後會創建的狀況下;另外一種是目標軟連接已存在,須要先取消以前的軟鏈,而後建立新的軟鏈,有兩個選項:yes|no
– group:定義文件/目錄的屬組
– mode:定義文件/目錄的權限
– owner:定義文件/目錄的屬主
– path:必選項,定義文件/目錄的路徑
– recurse:遞歸的設置文件的屬性,只對目錄有效
– src:要被連接的源文件的路徑,只應用於state=link的狀況
– dest:被連接到的路徑,只應用於state=link的狀況
– state:
directory:若是目錄不存在,建立目錄
file:即便文件不存在,也不會被建立
link:建立軟連接
hard:建立硬連接
touch:若是文件不存在,則會建立一個新的文件,若是文件或目錄已存在,則更新其最後修改時間
absent:刪除目錄、文件或者取消連接文件
# ansible -k aliyun -m file -a "src=/var/DZWeb dest=/mnt/DZWeb state=link"
# ansible -k aliyun -m file -a "path=/mnt/DZWeb state=absent"
# ansible -k aliyun -m file -a "path=/mnt/zhangfile state=touch"
# ansible -k aliyun -m file -a 'path=/mnt/zhangfile state=directory'
# ansible -k aliyun -m file -a 'path=/mnt/namedir state=directory group=root owner=root mode=777'
複製文件到遠程主機,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.
# ansible aliyun -k -m copy -a 'src=/root/buffer.sh dest=/mnt/buffer.sh'
# ansible aliyun -k -m copy -a 'src=/root/buffer.sh dest=/mnt/buffer group=zabbix owner=zabbix mode=777'
目標主機的源文件
# ansible aliyun -k -m command -a 'cat /mnt/buffer.sh'
當前主機更改後的源文件
# ansible aliyun -k -m command -a 'cat /root/buffer.sh'
經過Ansible複製文件到目標主機
# ansible aliyun -k -m copy -a 'src=/root/buffer.sh dest=/mnt/buffer.sh group=zabbix owner=zabbix mode=777 backup=yes'
查看目標主機的文件目錄和複製後的文件及備份後的文件內容
功能:命令模塊,默認模塊,用於在遠程主機執行命令,缺點:運行的命令中沒法使用變量,管道。變量和操做符號 "<", ">", "|", ";" and "&" 不能正常工做。若是須要使用,請使用 shell 模塊。省略不寫模塊信息名稱則默認爲command模塊
action: command
chdir # 在執行命令以前,先切換到該目錄
creates # 一個文件名,當這個文件存在,則該命令不執行
executable # 切換shell來執行命令,該執行路徑必須是一個絕對路徑
free_form= #要執行的Linux指令,通常使用Ansible的-a參數代替。
removes #一個文件名,這個文件不存在,則該命令不執行
# ansible aliyun -k -m command -a 'creates=/mnt/aaa.jpg ls /mnt'
ansible aliyun -k -m command -a 'ls /mnt/zhang'
ansible -k aliyun -m command -a 'chdir=/mnt/zhang/ ls'
以上兩條命令是等價的,第一條是經過絕對路徑進行查詢,第二條命令是先進入目錄在進行查詢至關於cd /mnt/zhang 和 ls兩條命令的結合體
功能:在遠程節點上執行命令。
與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
用於管理服務
該模塊包含以下選項:
· arguments:給命令行提供一些選項
· name:必選項,服務名稱
· state:對當前服務執行啓動,中止、重啓、從新加載等操做(started,stopped,restarted,reloaded)
· sleep:若是執行了restarted,在則stop和start之間沉睡幾秒鐘
· enabled:是否開機啓動 yes|no
· pattern:定義一個模式,若是經過status指令來查看服務的狀態時,沒有響應,就會經過ps指令在進程中根據該模式進行查找,若是匹配到,則認爲該服務依然在運行
· runlevel:運行級別
# ansible -k aliyun -m service -a 'name=vsftpd state=started'
# ansible -k aliyun -m service -a 'name=vsftpd state=stopped'
用於管理計劃任務
包含以下選項:
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:以哪一個用戶的身份執行
添加計劃任務天天的2點執行ls命令,註釋爲ls /mnt
# ansible -k aliyun -m cron -a 'name="ls /mnt" hour=2 user=root job="sbin/ls" '
查看計劃任務
[root@iZuf6e15robw9amyc9qt1lZ zhang]# ansible -k aliyun -m command -a 'crontab -l'
# ansible -k aliyun -m cron -a 'name="ls /mnt" hour=2 user=root job="sbin/ls" state=absent '
查看是否被刪掉了
# ansible -k aliyun -m command -a 'crontab -l'
在塊設備上建立文件系統
選項:
dev:目標塊設備
force:在一個已有文件系統的設備上強制建立
fstype:文件系統的類型
opts:傳遞給mkfs命令的選項
使用yum包管理器來管理軟件包
選項:
config_file:yum的配置文件
disable_gpg_check:關閉gpg_check
disablerepo:不啓用某個源
enablerepo:啓用某個源
list
name:要進行操做的軟件包的名字,也能夠傳遞一個url或者一個本地的rpm包的路徑
state:狀態(absent, installed, latest, present, removed)
# ansible -k aliyun -m yum -a 'name=ftp state=installed'
# ansible test -m yum -a 'name="@Development tools" state=present'
# 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'
管理用戶
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中便可。
# ansible -k aliyun -m user -a 'createhome=yes home=/home/zhang password=zhang name=zhang state=present shell=/bin/bash'
# ansible -k aliyun -m user -a 'remove=yes state=absent name=zhang'
使用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: 保持時間屬性
# ansible -k aliyun -m synchronize -a 'src=/opt/zhang dest=/root'
# ansible -k aliyun -m synchronize -a 'src=/opt/j dest=/root/ mode=push rsync_path=/usr/bin/rsync'
配置掛載點
選項:
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'
get_url模塊主要用於下載,相似於 shell 命令 curl 或者 wget
參數 |
必填 |
默認值 |
註解 |
url |
yes |
url地址 |
|
dest |
no |
下載存放的路徑 |
# 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'
Playbooks 與 adhoc 相比,是一種徹底不一樣的運用 ansible 的方式,是很是之強大的.
簡單來講,playbooks 是一種簡單的配置管理系統與多機器部署系統的基礎.與現有的其餘系統有不一樣之處,且很是適合於複雜應用的部署.
Playbooks 可用於聲明配置,更強大的地方在於,在 playbooks 中能夠編排有序的執行過程,甚至於作到在多組機器間,來回有序的執行特別指定的步驟.而且能夠同步或異步的發起任務.
咱們使用 adhoc 時,主要是使用 /usr/bin/ansible 程序執行任務.而使用 playbooks 時,更可能是將之放入源碼控制之中,用之推送你的配置或是用於確認你的遠程系統的配置是否符合配置規範.
Paly:定義的是主機的角色
Task:定義的是具體執行的任務
Playboot:由一個或多個play組成,一個play能夠包含多個task
一、功能比abhoc更全
二、控制依賴關係比較好
三、展示更直觀
四、持久使用
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}}"
功能爲:在192.168.1.101主機上在tmp目錄下建立一個imoocc.file文件
Ø Playbook命令的執行
# ansible-playbook -i /etc/ansible/hosts --list-hosts ./f1.yml
# ansible-playbook ./f1.yml
Ø 執行結果返回
#ansible-playbook -i /etc/ansible/hosts --list-hosts ./f1.yml結果爲:
# ansible-playbook ./f1.yml結果爲:
l 大小寫敏感
l 使用縮進表示層級關係(只能使用空格不能使用tab)
l yaml文件以「- - -」做爲文檔的開始
數據結構能夠爲字典,列表,純量三種
字典 列表 純量:數字、布爾、字符串
{name:jeson} -Aple
-Orange
-strawberry
-Mango
myname:jeson
name:「{{myname}}」
變量的定義
l playbook的yaml文件中定義變量賦值
列子:
使用# ansible-playbook ./ce.yml命令執行便可
l --extra-vars執行參數付給變量
使用--extra-vars參數進行賦值變量
列子:
l 在文件中定義變量
文件中定義變量是指在hosts資產列表文件中添加變量
l 註冊變量
register關鍵字能夠存儲指定命令的輸出結果到一個自定義的變量中
-name:get time
command:date
register:date_output
實例請查看本文後面的《playbook基本語句實例》
when語句
列子:
循環類型 |
關鍵字 |
標準循環 |
with_items |
嵌套循環 |
with_nested |
遍歷字典 |
with_dict |
並行遍歷列表 |
with_together |
遍歷列表和索引 |
with_indexed_items |
遍歷文件列表的內容 |
with_file |
遍歷目錄文件 |
with_fileglob |
重試循環 |
until |
查找第一個匹配文件 |
with_first_found |
隨機選擇 |
with_random_choice |
在序列中循環 |
with_sequence |
三、條件循環語句複用
Ø 忽略錯誤
默認會檢查命令和模塊的返回狀態,遇到錯誤就中斷playbook的執行
加入參數:ignore_errors:yes 進行忽略錯誤
例子:
說明:/bin/false返回狀態爲1,即錯誤信息,touch文件命令正常工做
執行命令以後報錯
Ø 自定義錯誤
Ø 自定義change狀態
例子:
不添加changed標籤的狀態
添加運行changed標籤的結果
意義:經過tags和任務對象進行捆綁,控制部分或者指定的task執行
Ø 打標籤
對一個對象打一個標籤
對一個對象打多個標籤
打標籤的對象包括:單個task任務、include對象、roles對象等
例子:
Ø 標籤的使用
-t:執行指定的tag標籤任務
--skip-tags:執行—skip-tags以外的標籤任務
例子:
只執行cfile1標籤,執行結果以下
只執行除了cfile1以外的標籤,結果以下
include_tasks/include:動態的包含tasks任務列表執行
實例:
添加touchf1.yml文件
添加touchf2.yml文件
添加include文件
執行結果便可
一、在第一次使用時,報下面錯誤
[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 手動鏈接下就能夠
種類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
· 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