更多內容請點擊:html
Linux學習從入門到打死也不放棄,徹底筆記整理(持續更新,求收藏,求點贊~~~~)
java
https://blog.51cto.com/13683480/2095439python
第20章,運維自動化之ansiblelinux
本章內容:nginx
運維自動化發展歷程及技術應用git
ansible 命令使用github
ansible 經常使用模塊使用web
YAML語法簡介正則表達式
ansible playbook基礎shell
playbook 變量,tags,handlers使用
playbook模板templates
playbook 條件判斷 when
playbook 字典 with_items
ansible roles
雲計算,運維自動化發展歷程及技術應用
IaaS: Intrastructure as a Service 基礎設施即服務
提供給消費者的服務時對多有計算機基礎設施的利用,包括處理CPU,內存,存儲
和其餘基本的計算資源,用戶可以部署和運行任意軟件,包括操做系統和應用程序。
消費者無論理或控制任何雲計算基礎設施,但能控制操做系統的選擇,存儲空間,部署
的應用,也有可能得到有限制的網絡組件,例如路由器、防火牆、負載均衡器等,的控制
PaaS:Platform as a Service 平臺即服務
提供給消費者的服務是把客戶採用提供的開發語言和工具(如java,python,.net等)
開發的或收購的應用程序部署到供應商的雲計算基礎設施上去。客戶不須要管理或者控制底層
的雲基礎設施,包括網絡,服務器,操做系統,存儲等,但客戶能控制部署的應用程序,也可能
控制運行應用程序的託管環境配置
SaaS:Software as a Serveice 軟件即服務
提供給客戶的服務時運營商運行在雲計算基礎設施上的應用程序,用戶能夠在各類
設備上經過客戶端界面訪問,如瀏覽器,消費者不須要管理或控制任何雲計算基礎設施,
包括網絡,服務器,操做系統,存儲等;
經常使用自動化運維工具
ansible:python Agentless中小型應用環境,經過ssh實現,無需部署代理程序
Saltstack:python 通常需部署agent,執行效率更高
Puppet:ruby 功能強大,配置複雜,適合大型環境
Fabric:python agentless
chef:ruby
cfengine
func
ansible特性:----------------------------------------------------------------------
模塊化:調用特定的模塊,完成特定任務
有Paramiko(基於ssh的python實現),pyYAML,jinja2 三個關鍵模塊
支持自定義模塊
基於python語言實現
部署簡單,基於python和ssh,
安全,基於openssh
支持playbook 編排任務
具備冪等性,一個任務執行1遍和執行n遍效果同樣,不因重複執行帶來意外狀況
無需代理,不依賴PKI(無需ssl)
可以使用任務編程語言寫模塊
YAML格式,編排任務,支持豐富的數據結構
交強大的多層解決方案
ansible主要組成部分:
invenroty: ansible管理主機的清單,存放於/etc/ancible/hosts
modules: ansible執行命令的功能模塊,多數爲內置核心模塊,也能夠自定義
ansible playbook: 任務劇本,編排定義ansible任務集合的配置文件,由ansible順序
執行,一般是JSON格式的YML文件
plugins: 模塊功能的補充,如鏈接類型插件,循環插件,變量插件,過濾插件等
API: 供第三方程序調用的應用程序編程接口
ansible: 組合Inventory api modules plugins 的綠框,能夠理解爲是ansible的命令工具
其爲核心執行工具
ansible命令執行來源:
USER 普通用戶,即system administrator
CMDB(配置管理數據庫)API調用
Public/private cloud API調用
user -> ansible playbook -> ansible
利用ansible實現管理的方式:
ad-hoc 即ansible命令,用戶臨時命令使用場景
ansible-playbook 主要用於長期規劃好的,大型項目的場景,須要由前提的規劃
absible-playbook 執行過程:
將已有編排好的任務集寫入ansible-palybook
經過ansible-playbook 命令分拆任務逐條ansible命令,按預約規則逐條執行
ansible主要操做對象:
host主機
network網路設備
注意事項:
執行ansible的主機通常稱爲主控端,中控,master或堡壘機
主控端python版本須要2.6或以上
被控端python版本小於2.4須要安裝python-simplejson
被控端如開啓selinux,須要安裝libselinex-python
windows不能做爲主控端
ansible安裝:
1 rpm包安裝,epel源
yum install ansible
2 編譯安裝:
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
3 git方式:
git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup
4 pip安裝: pip是安裝Python包的管理器,相似yum
yum install python-pip python-devel
yum install gcc glibc-devel zibl-devel rpm-bulid openssl-devel
pip install --upgrade pip
pip install ansible --upgrade
5 確認安裝版本:
ansible --version
相關文件:
配置文件:
/etc/ansible/ansible.cfg 主配置文件,配置ansible工做特性
/etc/ansible/hosts 主機清單
/etc/ansible/roles/ 存放roles的目錄
程序:
/usr/bin/ansible 主程序,臨時命令執行工具
/usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具
/usr/bin/ansible-galaxy 下載、上傳優秀代碼或roles模塊的官網平臺
/usr/bin/ansible-playbook 定製自動化任務,編排劇本工具
/usr/bin/ansible-pull 遠程執行命令的工具
/usr/bin/ansible-vault 文件機密工具
/usr/bin/ansible-console 基於console界面與用戶交互的執行工具
主機清單:
Inventory :主機清單
默認的Inventory file爲: /etc/ansible/hosts
inventory file能夠有多個,且也能夠經過dynamic inventory 來動態生成
主機清單:Inventory
/etc/ansible/hosts文件格式:
inventory文件遵循INI文件風格,中括號中的字符爲組名。能夠將同一個主機同時
歸併到多個不一樣的組中;此外,若是目標主機使用了非默認的ssh端口,還能夠在主機名
以後使用 :端口號 來標明
例如:
[webservers]
192.168.65.128
192.168.65.132
www.test1.com
www.test2.com
[dbservers]
192.168.65.150:2222
192.168.65.160
db1.test.com
db2.test.com
注意: 若是使用name來標明主機,那麼就必須提供能供解析的name-server,或者修改
本地host文件。/etc/hosts
若是主機名稱遵循類似的命名模式,還可使用列表的方式標識各主機
例如:
[webs]
www.test[1:100].com 1-100
ca.test[a:f].com a-f
ansible配置文件:
/etc/ansible/ansible.cfg 通常保持默認
[defaults]
#inventory = /etc/ansible/hosts 主機列表配置文件
#library = /usr/share/my_modules/ 庫文件存放目錄
#remote_tmp = $HOME/.ansible/tmp 臨時py命令文件存放的遠程主機目錄
#local_tmp = $HOME/.ansible/tmp 本機的臨時命令執行目錄
#forks = 5 默認併發數
#sudo_user = root 默認sudo用戶
#ask_sudo_pass = True 每次執行ansible命令是否詢問ssh密碼
#ask_pass = True
#remote_port = 22
#host_key_checking = False 檢查對應服務器的host_key,建議取消註釋
#log_path = /var/log/ansible.log 日誌文件
ansible-doc 顯示模塊幫助
ansible-doc [options][modules]
-a 顯示全部模塊的文檔
-l --list 列出可用模塊
-s --snippet 顯示指定模塊的playbook片斷
示例:
ansible-doc -l
ansible-doc ping
ansible-doc -s ping
ansible命令:---------------------------------------------------------------------
經過ssh實現配置管理,應用部署,任務執行等功能,建議配置ansible端能基於祕鑰
認證的方式聯繫各被管理節點
ansible <host-pattern> [-m module_name] [-a 'args']
--version 顯示版本
-m module 指定模塊,默認爲command
-v -vv -vvv 顯示詳細過程
-list-hosts 顯示主機列表,可簡寫 --list
-k --ask-pass 提示鏈接密碼,默認key驗證
-K --ask-become-pass 提示輸入sudo密碼
-C --check 檢查,並不執行
-T --timeout= 執行命令的超時時間,默認10s
-u --user=REMOTE_USER 執行遠程命令執行的用戶
-b --bacome 代替舊版的sudo 切換
示例:
ansible centos6 -m shell -u hello -k -a 'ls -l /data/f1'
ansible all -m command -u wang --become-user=root -a 'ls /root' -b –k -K
host-pattern 匹配主機的列表
all 表示全部inventory中的全部主機
ansible all -m ping
* 通配符,任意長度任意字符
ansible "*" -m ping
ansible 192.168.65.* -m ping
ansible 1* -m ping
ansible "c*" -m ping
如單獨使用或者使用時字符串較短 如1-2個字符,建議使用""
不然容易語法錯誤
: 或
ansible "centos6:centos7" -m ping
ansible "centos6:192.168.65.132" -m ping
ansible "centos6:192.168.65.132:centos7" -m ping
:& 邏輯與
ansible "webs:&dbs" -m ping
表示在webs組裏,而且在dbs組裏的主機
:! 邏輯非
ansible 'webs:!centos6' -m shell -a 'echo hello'
表示在webs組中,但不在centos6中的主機
注意: :& 用"" '' 均可以
:! 只能使用''
綜合邏輯:
ansible 'webs:dbs:¢os6:!centos7' -m ping
正則表達式:
ansible '~centos(6|7)' -m ping
ansible '~(web|db).*\.magedu\.com' -m ping
ansible命令的執行過程:
1 加載本身的配置文件 默認/etc/ansible/ansible.cfg
2 加載本身對應的模塊文件,如shell、 copy
3 經過ansible將模塊或命令生成對應的臨時py文件,並將該文件傳輸至遠程服務器
的對應執行用戶$HOME/.ansible/tmp/ansible-tmp-數字/xxx.Py文件
4 給文件+x 執行權限
5 執行並返回結果
6 刪除臨時py文件,sleep 0 退出
執行狀態:
綠色: 執行成功而且不須要作改變的操做
×××: 執行成功而且對目標主機作變動
紅色: 執行失敗
ansible 經常使用模塊:------------------------------------------------------------------
command:默認模塊,可忽略 -m 選項,在遠程主機上執行命令,
ansible webs -a 'rpm -q httpd'
ansible webs -m command -a 'rm -f /data/*'
經常使用選項:
chdir=/DIR cd到/DIR目錄下執行
creates=filename 若是filename文件存在,將不執行 不存在--> 執行
removes=filename 若是filename文件不存在,將不執行 存在_--> 執行
注意:command模塊不支持 $name < > | ; & 等特殊用法,用shell模塊實現
shell: 和command 類似,用shell執行命令,支持 $name < > | ; & 等特殊用法
ansible webs -m shell -a 'echo magedu | passwd --stdin hello'
調用bash執行命令
可是相似 cat /tmp/stanley.md |awk -F'|' '{print $1 $2}' &>/tmp/example.txt
這樣的複雜命令就算使用shell模塊也可能失敗,並且存在引號衝突問題,
解決辦法:寫到腳本中,copy到遠程,執行,再把須要的結果拉回執行命令的機器
經常使用選項:
chdir
creates
removes
script:運行腳本
ansible webs -m script -a f1.sh
經常使用選項: chdir
creates
removes
--some-arguments 1234 提供運行參數
copy: 從本地複製文件到遠程主機
經常使用選項:
backup=yes|no 若是目標存在,是否備份
src= 源文件,本地
dest= 目標路徑,遠程主機
group= 所屬組
owner= 全部者
mode= 設置權限
ansible webs -m copy -a 'src=/etc/fstab dest=f2 backup=yes'
ansible webs -m shell -a 'ls /root'
若是不指明路徑,默認複製到家目錄下
ansible dbs -m copy -a 'src=/root/f2 dest=/data/cat backup=yes mode=000'
fetch: 從遠程主機複製文件到本地主機,與copy相反
只能複製單個文件,目錄可先tar在fetch
選項:
src=
dest=
會在dest目錄下生成多個主機名命名的目錄,且會將源文件的路徑一併生成
如:
ansible dbs -m fetch -a 'src=/etc/passwd dest=/data/bak'
[root@Centos6 /data]#tree
.
└── bak
├── 192.168.65.150
│ └── etc
│ └── passwd
└── 192.168.65.160
└── etc
└── passwd
5 directories, 2 files
file: 設置文件屬性
選項:
path= dest= name= 等價,指明文件路徑
state
=derictory 若是不存在則建立目錄
=file 若是不存在默認不建立
=touch 默認,建立文件或目錄
=absent 遞歸刪除
=link 軟連接
=hard 硬連接
group= 所屬組
owner= 全部者
src= 源,建立連接文件需指明
mod= 權限
示例:
建立文件:
ansible dbs -m file -a 'path=/data/f1 state=touch'
建立目錄:
ansible dbs -m file -a 'path=/data/dir1 state=directory'
刪除文件或目錄
ansible dbs -m file -a 'path=/data/dir1 state=absent'
建立連接
ansible dbs -m file -a 'src=/data/f1 path=/data/f1.link state=touch'
注意:不支持通配符*操做,一次只能操做一個文件或目錄
hostname: 管理主機名
ansible 192.168.65.150 -m hostname -a 'name=NAME'
yum: 管理程序包
經常使用選項:
name= 包名
state=
present installed latest 安裝
absent removed 卸載
list= installed name
disable_gpg_check=yes|no 禁用gpgcheck 默認no
update_cache=yes|no 是否清楚緩存默認no
安裝程序包:
ansible dbs -m yum -a 'name=vsftpd,httpd'
卸載程序包
ansible dbs -m yum -a 'name=vsftpd,httpd state=absent'
查看包列表:
ansible dbs -m yum -a 'list=NAME or intalled'
rpm包直接使用yum安裝:
ansible dbs -m copy -a 'src=rpmfile dest=/path/'
ansible dbs -m yum -a 'name=/path/rpmfile disable_gpg_check=yes'
cron: 計劃任務
時間格式選項:minute hour day month weekday
選項: job= 做業內容
name= 做業標籤
user= 用戶
disabled=true|false yes|no 禁用或者啓用
state= 默認present 啓用
absent 刪除
示例:
新建計劃任務:
ansible dbs -m cron -a 'minute=* job="wall hello there" name=wall'
禁用計劃任務
ansible dbs -m cron -a 'disabled=yes job="wall hello there" name=wall'
啓用:
disabled=no或false
刪除:
ansible dbs -m cron -a 'job="wall hello there" name=wall state=absent'
service:服務管理
經常使用選項:
name= 服務名
state=
reloaded
restarted
running
started
stopped
enabled=yes|no 開機啓動
示例:
啓動並設置開機啓動服務
ansible dbs -m service -a 'name=httpd state=started enabled=yes'
關閉:
ansible dbs -m service -a 'name=httpd state=stopped enabled=no'
user: 用戶管理模塊
經常使用選項:
create_home=no 不建立家目錄,默認yes
comment="" 描述信息
group= 主組
groups= 附加組
home= 手工設置家目錄位子
name= 用戶名
password= 密碼
shell= shell類型
system=yes|no 是不是系統該用戶
uid= uid
state=absent 刪除用戶,默認present
remove=yes 刪除家目錄,state=absent時使用
示例:
新建帳號:
ansible dbs -m user -a 'name=lily uid=1080 home=/data/home/ comment="a beauty girl" groups=root'
刪除帳號:
ansible dbs -m user -a 'name=lily state=absent remove=yes'
group: 組管理模塊
經常使用選項:
gid= gid
name= 組名
state=absent 刪除 默認present
system=yes|no 是否系統帳號,默認no
ansible系列命令:----------------------------------------------------------------
ansible
ansible-doc
ansible-playbook
ansible-vault
ansible-console
ansible-galaxy
ansible-pull
ansible-galaxy:
鏈接https://galaxy.ansible.com 下載相應的roles
查看已安裝的galaxy
ansible-galaxy list [role_name]
ansible-galaxy list "Stouts grafana"
安裝roles
ansible-galaxy install "Stouts grafana"
刪除roles
ansible-galaxy remove "Stouts grafana"
ansible-pull:
推送命令至遠程,效率無限提高,對運維要求較高
ansible-playbook:
相似shell,用來解釋執行編寫playbook文件,一般是yml後綴,如:
ansible-playbook hello.yml
[root@Centos6 ~]#cat hello.yml
---
- hosts: dbs
remote_user: root
tasks:
- name: hello
command: /usr/bin/wall hello there
ansible-vault:
功能:加密解密yml文件
ansible-vault [create|encrypt|decrypt|edit|view|rekey]
ansible-vault encrypt hello.yml 加密
ansible-vault view hello.yml 能夠查看加密文件,須要輸入密碼
ansible-vault decrypt hello.yml 解密
ansible-vault edit hello.yml 編輯加密文件
ansible-vault rekey hello.yml 修改口令
ansible-vault create new.yml 建立新文件
ansible-console:2.0+新增,可交互執行命令,支持tab
工做臺介紹:
[root@Centos6 ~]#ansible-console
Welcome to the ansible console.
Type help or ? to list commands.
root@all (5)[f:5]$
執行用戶@當前操做的主機組(當前組的主機數量)[f:併發數]$
設置併發數: forks n 例如:forks 10
切換組: cd 主機組 例如:cd webs
列出當前組主機列表:list
列出全部的內置命令:?或help
退出: exit
示例:
root@dbs (2)[f:5]$ shell ls /data
root@dbs (2)[f:5]$ yum name=htop state=present
palybook:------------------------------------------------------------------------
playbook示例: 安裝並啓動httpd服務
---
- hosts: dbs
remote_user: root
tasks:
- name: install package
yum: name=httpd
- name: tempalte conf6
template: src=httpd.conf6.j2 dest=/etc/httpd/conf/httpd.conf
when: ansible_distribution_major_version == "6"
notify: reload conf
- name: tempalte conf7
template: src=httpd.conf7.j2 dest=/etc/httpd/conf/httpd.conf
when: ansible_distribution_major_version == "7"
notify: reload conf
- name: test web6
when: ansible_distribution_major_version == "6"
shell: echo "welcome to web centos6" > /var/www/html/index.html
- name: test web7
when: ansible_distribution_major_version == "7"
shell: echo "welcome to web centos7" > /var/www/html/index.html
- name: start service
service: name=httpd state=started
- name: testnet
shell: ping -c2 -w2 172.20.0.1
tags: testnet
handlers:
- name: reload conf
service: name=httpd state=reloaded
palybook:
一組ansible指令的集合,相似shell腳本
採用YAML語言編寫
通常使用.yml 後綴 如:hello.yml
經過ansible-playbook解釋執行,如ansible-playbook hello.yml
YAML語言:
可讀性好
和腳本語言的交互性好
使用實現語言的數據模型
有一個一致的信息模型
易於實現
能夠基於流來處理
表達能力強,擴展性好
官方地址:http://www.yaml.org
YAML語法簡介:
在單一檔案中,可用連續三個連字號(---)區分多個檔案。另外,還有選擇性的
連續三個點號(...)來表示檔案結尾
次行開始正常些playbook的內容,通常建議寫明該playbook的功能
使用#號註釋代碼
縮進必須是統一的,不能空格和tab混用
縮進的級別必須一致,一樣的縮進表示一樣的級別,程序判斷配置的級別是經過縮進
結合換行來實現
k/v(鍵值對)的值可同行寫也能夠換行些,同行使用: 分隔
v能夠是個字符串,也能夠是另外一個列表
一個完整的代碼塊功能須要最少元素包括name:task
一個name只能包括一個task
文件後綴一般爲yml或yaml
YAML列表:
list:列表,其全部元素均使用 - 打頭
列表的每一項能夠有多行,如
- name:
yum:
notify:
when:
YAML字典:
dictionary:字典,一般由多個key與value構成
如:
- { name: install httpd,yum: name=httpd }
playbook核心元素:
hosts: 執行的遠程主機列表
remote_user:指定用戶身份
tasks: 任務集
varniables:內置變量或自定義變量在playbook中調用
templates: 模板,能夠替換模板文件中的變量並實現一些簡單邏輯的文件
handlers: 和notify結合使用,若是notify:A當前task執行發生修改操做,
則觸發執行handlers中定義的A操做
tags: 標籤,指定某條任務執行,用於選擇運行playbook中的部分代碼。
如:
ansible-playbook -t install httpd.yml
注意: 多個task可使用同一個tags
hosts: 列表必須事先定義在主機清單中
可使用 *,:,:&,:!來定義列表
如:
webs:dbs
webs:!dbs
remote_user:
指明執行命令的用戶身份
且支持在task中以sudo方式執行
例如:
- host: webs
remote_user: root
tasks:
- name: test ping
ping:
remote_user: hello
sudu: yes
sudu_user: lily 如不知指明,默認sudo爲root
task列表和action:
play的主體部分是task list,task list 中的各任務按次序逐個在host中指定
的全部主機上執行,即在全部主機上完成第一個任務後在開始第二個。在運行自上
而下某playbook時,若是中途發生錯誤,多有已執行任務都會回滾,所以,在更正
playbook後從新執行一次便可
task的目的是使用指定的參數執行模塊,而在模塊參數中可使用變量,模塊執行是
冪等的,這意味着屢次執行是安全的,由於其結果均一致
每一個task都應該有其name,用於playbook的執行結果輸出
若是未提供name,則action的結果將用於輸出
格式:
1 action: module arguments
2 module: arguments
某任務的狀態在運行後衛changed時,可經過notify通知給相應的handlers任務。
任務可經過tags打標籤,然後可在ansible-playbook命令中使用 -t 選項指定執行
若是命令或腳本的退出碼不爲零,可使用下方方式使整個playbook繼續執行,而不是回滾
tasks:
- name: test
shell: false ||/bin/true
或者:
tasks:
- name: test
shell: false
ignore_error: true
運行playbook:
ansible-playbook name.yml
經常使用選項:
--check|-C 只檢測可能發生的改變,不真正執行
--list-hosts 列出運行任務的主機
--limit 主機列表,只針對主機列表中的主機執行
-v -vv -vvv 顯示詳細信息
-t tags 只執行tags標記的task
playbook變量:
變量名:僅能由字母、數字和下劃線組成,且只能以字母開通
變量來源:
1 ansible setup facts 遠程主機的全部變量均可直接調用
ansible all -m setup list
ansible webs -m setup |grep cpu
"ansible_processor_vcpus": 1, cpu數量
ansible all -m setup|grep distribution
ansible_distribution_major_version 主版本號
ansible all -m setup |grep os_family
"ansible_os_family": "RedHat", 版本體系
ansible all -m setup |grep memtotal
"ansible_memtotal_mb": 980, 內存大小
2 在/etc/ansible/hosts中定義
普通變量:主機組中主機單獨定義,優先級高於公共變量
[websrvs]
192.168.99.101 http_port=8080 hname=www1
192.168.99.102 http_port=80 hname=www2
公共(組)變量:針對主機組中全部主機定義統一變量:
[websvrs:vars]
http_port=808
mark=「_」
[websrvs]
192.168.99.101 http_port=8080 hname=www1
192.168.99.102 http_port=80 hname=www2
3 經過命令行指定變量,優先級最高
ansible-playbook -e varname=VALUE
4 在playbook中定義
vars:
- var1: value1
- var2: value2
5 在role中定義
6 使用專用變量文件:
vars.yml
var1: httpd
var2: vsftpd
test.yml
---
- host: webs
remote_user: root
vars_files:
- vars.yml
ansible變量優先級:
命令行 -e --> playbook定義的變量 -->主機清單中定義的變量
變量定義:
key=value1
http_port=80
變量調用方式:
經過{{ variable_name }}調用變量,且變量名先後必須有空格,有時用
"{{ variable_name }}" 才生效
示例:
vim testvar.yml
---
- hosts: dbs
remote_user: root
vars:
- var1: httpd
- var2: vsftpd
tasks:
- name: status
service: name={{ var1 }} state=reloaded
- name: rpm status
shell: rpm -q "{{ var2 }}"
ansible-playbook -e 'var1=dhcp var2=tftp' testvar.yml
在配置文件中指定變量
ansible websvrs –m hostname –a ‘name={{ hname }}{{ mark }}{{ http_port }}’
在命令行執行變量
ansible websvrs –e http_port=8000 –m hostname –a ‘name={{ hname }}{{ mark }}{{ http_port }}’
templates:
文本文件,嵌套有腳本
使用jinja2語言,使用字面量,有下面形式:
字符串:使用單引號或雙引號
數字:整數,浮點數
列表:[item1,item2..]
元組:(item1,item2,...)
字典:{key1:value1,key2:value2,..}
布爾型:true/false
算術運算:+,-,*,/,//,%,**
比較操做:==,!=,>,>=,<,<=
邏輯運算:and or not
流表達式: for if when
根據模塊文件動態生成對應的配置文件
mkdir ansible/templates
在playbook同級的目錄中創建templates目錄,模板文件必須位於templates目錄下,後綴爲.j2
使用時src就可使用默認路徑,src=文件名,
template模塊只能在playbook使用,不能在ansible命令行使用
使用template同步配置文件,在.j2 文件中支持使用ansible setup模塊中的全部變量
且支持算術運算
例如:
Listen {{ ansible_memtotal_mb//7 }}
Listen {{ ansible_memtotal_mb+6 }}
注意:不支持兩個變量之間的算術運算:
例如:
Listen {{ ansible_memtotal_mb//ansible_distribution_major_version }}
Listen {{ ansible_memtotal_mb+ansible_distribution_major_version }}
when:
when語句使用jinja2表達式語法
用在playbook中,只有當when:語句爲真時,此task才執行
例如:
- name: tempalte conf7
template: src=httpd.conf7.j2 dest=/etc/httpd/conf/httpd.conf
when: ansible_distribution_major_version == "7"
with_items: 迭代
當有須要重複性執行的任務時,可使用迭代機制
對迭代項的引用,固定變量名爲"item"
要在task中使用with_items給定要迭代的元素列表
列表格式
字符串
字典
示例:
[root@Centos6 ~/ansible]#vim createuser.yml
---
- hosts: dbs
remote_user: root
tasks:
- name: create user
user: name={{ item }}
tags: create
with_items:
- user1
- user2
- user3
- name: delete user
user: name={{ item }} state=absent remove=yes
tags: delete
with_items:
- user1
- user2
- user3
示例2:
vim test_item1.yml
---
- hosts: dbs
remote_user: root
tasks:
- name: touch some file
file: name=/data/{{ item }} state=touch
with_items:
- file1
- file2
- file3
tags: touch
- name: delete some files
file: name=/data/{{ item }} state=absent
with_items:
- file1
- file2
- file3
tags: del
item 嵌套:
例如: 要求新建3個目錄dir1,dir2,dir3
而且新建3個空文件,file1,file2,file3分別位於對應的目錄
vim test_items2.yml
---
- hosts: dbs
remote_user: root
tasks:
- name: mkdir
file: name=/data/{{ item }} state=directory
with_items:
- dir1
- dir2
- dir3
- name: touch file
file: name=/data/{{ item.dir }}/{{ item.file }} state=touch
with_items:
- { dir: dir1,file: file1 }
- { dir: dir2,file: file2 }
- { dir: dir3,file: file3 }
playbook中的for和if:
說明: 使用jinja2 語法:
僅適合.j2 文件
{% for p in ports %}
代碼段
{% endfor %}
{% if p is defined %}
代碼段
{% endif %}
相似shell中的for使用,其中p能夠任意指定, ports 表明變量,須要與playbook主
腳本中的vars:下的變量一致
if 爲真 代碼段執行,反之不執行 defined :被定義
示例1:
yml vim for1.yml
---
- hosts: dbs
remote_user: root
vars:
- ports:
- 1001
- 1002
- 1003
tasks:
- name: copy file
template: src=for1.j2 dest=/data/for1.conf
j2 vim templates/for1.j2
{% for p in ports %}
server {
listen {{ p }}
}
{% endfor%}
結果: [root@2-centos6 /data]#cat for1.conf
server {
listen 1001
}
server {
listen 1002
}
server {
listen 1003
}
示例2:
yml vim for2.yml
---
- hosts: dbs
remote_user: root
vars:
- infos:
- group: boy
name: tom
age: 18
likes: read
- group: girl
name: lily
age: 19
likes: boy
- group: man
name: big dog
age: 35
likes: girl
- group: women
name: cherry
age: 41
likes: monny
tasks:
- name: copy file
template: src=for2.j2 dest=/data/for2.conf
j2 vim tempaltes/for2.conf
{% for p in infos %}
group: {{ p.group }}
the winner is:
name: {{ p.name }}
age: {{ p.age }}
likes: {{ p.likes }}
{% endfor %}
結果: [root@2-centos6 /data]#cat for2.conf
group: boy
the winner is:
name: tom
age: 18
likes: read
group: girl
the winner is:
name: lily
age: 19
likes: boy
group: man
the winner is:
name: big dog
age: 35
likes: girl
group: women
the winner is:
name: cherry
age: 41
likes: monny
示例3:
yml: vim for3.yml
---
- hosts: dbs
remote_user: root
vars:
- webs:
- addr: 10.magedu.com
port: 810
- addr: 20.magedu.com
port: 820
rootdir: /data/root20/
- addr: 30.magedu.com
port: 830
rootdir: /data/root30/
tasks:
- name: copy file
template: src=for3.j2 dest=/data/for3.conf
j2: vim templates/for3.j2
website list:
{% for p in webs %}
website: {{ p.addr }}
port: {{ p.port }}
{% if p.rootdir is defined %}
rootdir: {{ p.rootdir }}
{% endif%}
{% endfor%}
結果: [root@2-centos6 /data]#cat for3.conf
website list:
website: 10.magedu.com
port: 810
website: 20.magedu.com
port: 820
rootdir: /data/root20/
website: 30.magedu.com
port: 830
rootdir: /data/root30/
roles:---------------------------------------------------------------------------
將本來playbook中的各個tasks,handlers,vars,拆分紅單獨的小模塊
而playbook主文件:
main.yml中使用
- include:(舊)
- import_tasks: (新)
調用模塊
目錄編排:
[root@Centos6 ~/ansible/roles]#tree
.
└── nginx
├── files
├── handlers
├── tasks
├── templates
└── vars
roles下新建目錄即爲項目名稱:需包含如下子目錄
files/: 存放copy或script模塊等調用的文件
templates/: template模塊查找所須要的模板文件的目錄
tasks/: 定義task,role的基本元素,至少應該包含一個名爲main.yml的文件,
其餘的文件須要在此文件中經過include包含
handlers/: 至少應該包含一個名爲main.yml的文件,其餘的文件須要在此文件中經過include包含
vars/: 定義變量。至少應該包含一個名爲main.yml的文件
其餘的文件須要在此文件中經過include包含
meta/: 定義當前角色的特殊設定及其依賴關係,至少應該包含一個名爲main.yml的文件
其它文件需在此文件中經過include進行包含
default/: 設定默認變量時使用此目錄中的main.yml文件
建立role的步驟:
1 建立以roles命名的目錄
2 在roles目錄中分別建立以各角色名稱命名的目錄,如nginx
3 在每一個角色命名的目錄中分別建立files,handlers,meta,tasks,templates和vars目錄
如用不到的空目錄,也不可不用建立
4 角色編輯
5 在playbook文件中,調用各角色
role建立示例:
[root@Centos6 ~/ansible/roles]#tree
.
└── nginx
├── files
│ └── f1
├── handlers
│ └── main.yml
├── tasks
│ ├── copyfile.yml
│ ├── groupadd.yml
│ ├── main.yml
│ ├── start.yml
│ ├── templ.yml
│ ├── useradd.yml
│ └── yum.yml
├── templates
│ └── nginx.conf.j2
└── vars
role建立:
cd roles/nginx
cd tasks/
vim groupadd.yml
- name: create group nginx
group: name=nginx system=yes gid=80
vim useradd.yml
- name: add user nginx
user: name=nginx uid=80 system=yes shell=/sbin/nologin
vim yum.yml
- name: install package
yum: name=nginx
vim templ.yml
- name: copy conf
template: src=nginx.conf.j2 dest=
when: ansible_distribution_major_version == "6"
notify: reload conf
vim copyfile.yml
- name: copy file
copy: src=f1 dest=/var/lib/nginx
vim start.yml
- name: start service
service: name=nginx state=started enabled=yes
vim main.yml
- import_tasks: groupadd.yml
- import_tasks: useradd.yml
- import_tasks: yum.yml
- import_tasks: templ.yml
- import_tasks: copyfile.yml
- import_tasks: start.yml
cd handlers/
vim mian.yml
- name: reload conf
service: name=nginx state=reloaded
cp /etc/nginx/nginx.conf templates/nginx.conf.j2
vim templates/nginx.conf.j2
worker_processes {{ ansible_processor_vcpus*10 }};
touch files/f1
role調用:調用roles的playbook 要與roles目錄在一個目錄中
vim nginx.role.yml
---
- hosts: dbs
remote_user: root
roles:
- role: nginx
引用另一個role中的單個任務,以下,使用完整路徑引用便可
vim main.yml
- include: group.yml
- include: user.yml
- include: yum.yml
- include: templ.yml
- include: start.yml
- include: roles/httpd/tasks/copyfile.yml
role調用中的tags使用:
vim some_role.yml
- hosts: webs
remote_user: root
roles:
- { role: nginx,tags: ['web','nginx'] }
- { role: httpd,tags: ['web','httpd'],when: ansible_distribution_major_version == "7" }
- { role: app,tags: ['app'] }
ansible-playbook -t web some_role.yml 挑標籤執行
推薦資料:
http://galaxy.ansible.com
https://galaxy.ansible.com/explore#/
http://github.com/
http://ansible.com.cn/
https://github.com/ansible/ansible
https://github.com/ansible/ansible-examples
筆記整理完成時間:2018年5月31日20:33:43