目錄
Playbooks中tasks語法使用
1、file
創建文件:touch
創建目錄:directory
2、lineinfile
修改文件某一行文本
3、replace
根據正則表達式替換文件內容(指定換字符串)
5、template/copy
模板作用類似于copy,可將文件分發到不同節點上,可以在模板文件中引入變量
?8、wait_for
等待某些操作完成以后再進行后續操作
9、when
條件判斷,滿足后再執行任務
環境準備:
? ? ? ? 下載ansible
? ? ? ? 配置兩臺web主機,一臺ansible服務器
? ? ? ? ansible主機ip:192.168.158.150
? ? ? ? web1主機IP:192.168.158.158
? ? ? ? web2主機IP:192.168.158.161
? ? ? ? 修改好配置文件
? ? ? ? 關閉防火墻和安全上下文
[root@bogon ~]# hostnamectl set-hostname ansible
[root@bogon ~]# setenforce 0
ansible主機
創建playbook,編輯yml文件
[root@bogon ~]# mkdir playbook
[root@bogon ~]# cd playbook/
[root@bogon playbook]# vim test.yml
操作如下
Playbooks中tasks語法使用
1、file
操作文件,比如創建文件或目錄、刪除文件或目錄、修改文件權限等
常用參數:
-
path:指定要操作的文件或目錄
-
state:參數非常靈活,可以包含的值及含義如下
-
directory - 與path結合說明我們要操作的是一個目錄
-
touch - 與path結合說明我們要操作的是一個文件
-
link - 創建軟連接
-
hard - 創建硬鏈接
-
absent - 刪除目標
-
-
src:當state設置為link或hard創建鏈接時,用于說明鏈接哪個文件,指定鏈接源
-
force:值為yes表示強制創建
-
owner:指定被操作文件的屬主
-
group:指定被操作文件的屬組
-
mode:指定被操作文件的權限
示例:
- name: 創建一個testfile文件file: path=/tmp/testfile state=touch - name: 創建一個目錄,并指定目錄權限file: path=/tmp/data state=directory mode=0755 - name: 刪除一個目錄file: path=/tmp/data state=absent ? - name: recurse默認為no,指定為yes代表以遞歸方式指定文件權限file: dest=/user/bin mode=0755 recurse=yes
示例:
創建文件:touch
vim test.yml
?測試成功
[root@bogon playbook]# ansible-playbook -C test.yml
PLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.161]
ok: [192.168.158.158]TASK [在/opt/目錄下創建文件f1.txt文件] *******************************************
changed: [192.168.158.161]
changed: [192.168.158.158]PLAY RECAP ***********************************************************************
192.168.158.158 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.158.161 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
翻譯:
執行結果匯總 ***********************************************************************
192.168.158.158 : 成功=2 已變更=1 不可達=0 失敗=0 跳過=0 救援=0 忽略=0
各字段含義詳解:
?ok=2? (成功=2)
該主機上成功完成了2個任務(無論是否產生變更)
?changed=1? (已變更=1)
其中有1個任務實際修改了系統狀態(例如:創建了文件/安裝了軟件)
?unreachable=0? (不可達=0)
主機連接正常(SSH/WinRM等連接成功)
?failed=0? (失敗=0)
沒有任務執行失敗
?skipped=0? (跳過=0)
沒有任務因條件不滿足而被跳過
?rescued=0? (救援=0)
沒有觸發任何錯誤恢復機制(block-rescue結構)
?ignored=0? (忽略=0)
沒有主動忽略任何錯誤
執行成功:
[root@bogon playbook]# ansible-playbook test.yml PLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.161]
ok: [192.168.158.158]TASK [在/opt/目錄下創建文件f1.txt文件] *******************************************
changed: [192.168.158.158]
changed: [192.168.158.161]PLAY RECAP ***********************************************************************
192.168.158.158 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.158.161 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
查驗:已成功創建
? ? ? ? web主機
[root@web1 ~]# cd /opt/
[root@web1 opt]# ls
f1.txt
創建目錄:directory
[root@bogon playbook]# vim test.yml---
- name: addahosts: alltasks:- name: 在/opt/目錄下創建文件f1.txt文件file:path: /opt/f1.txtstate: touch- name: 在/opt/目錄下創建dir目錄file:path: /opt/dir/state: directory
?測試:
[root@bogon playbook]# ansible-playbook -C test.yml PLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.161]
ok: [192.168.158.158]TASK [在/opt/目錄下創建文件f1.txt文件] *******************************************
changed: [192.168.158.161]
changed: [192.168.158.158]TASK [在/opt/目錄下創建dir目錄] **************************************************
changed: [192.168.158.158]
changed: [192.168.158.161]PLAY RECAP ***********************************************************************
192.168.158.158 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.158.161 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
執行
[root@bogon playbook]# ansible-playbook test.yml PLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.161]
ok: [192.168.158.158]TASK [在/opt/目錄下創建文件f1.txt文件] *******************************************
changed: [192.168.158.161]
changed: [192.168.158.158]TASK [在/opt/目錄下創建dir目錄] **************************************************
changed: [192.168.158.158]
changed: [192.168.158.161]PLAY RECAP ***********************************************************************
192.168.158.158 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.158.161 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
?查驗:
[root@web1 opt]# ls
dir f1.txt
2、lineinfile
修改文件某一行文本
常用參數:
* ? path:操作的文件路徑
* ? regexp:正則表達式,要替換的內容
* ? line:指定修改后的文本內容
* ? state:當設置為absent代表刪除匹配的行
* ? backrefs:默認為no,當未匹配到時line對應的內容會被插入到文本的末尾,為yes表示不插入
* ? insertafter:借助insertafter參數可以將文本插入到“指定的行”之后
* ? insertbefore:借助insertbefore參數可以將文本插入到“指定的行”之前
* ? backup:是否進行備份
* ? create:操作的文件不存在時是否創建
示例:
- name: 替換文件中包含line123的行為testlinelineinfile: path=/tmp/test regexp="^line" line="testline"
?vim? test.yml? ? ? ? ?(注意縮進)
---
- name: addagather_facts: nohosts: alltasks:- name: 在/opt/目錄下創建文件f1.txt文件file:path: /opt/f1.txtstate: touch- name: 在/opt/目錄下創建dir目錄file:path: /opt/dir/state: directory- name: 精確替換包含line123的行lineinfile:path: /opt/f1.txtregexp: "^line"line: "test"tags: t1
[root@web1 opt]# cat f1.txt
line1231
lineoqoweiqwe
opoiline
?
測試:? ? ?只在web1上f1.txt有內容
[root@ansible playbook]# ansible-playbook -C -t t1 test.ymlPLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.158]
ok: [192.168.158.161]TASK [精確替換包含line123的行] ***************************************************
changed: [192.168.158.158]
ok: [192.168.158.161]PLAY RECAP ***********************************************************************
192.168.158.158 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.158.161 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
?
執行成功
[root@ansible playbook]# ansible-playbook -t t1 test.ymlPLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.158]
ok: [192.168.158.161]TASK [精確替換包含line123的行] ***************************************************
ok: [192.168.158.161]
changed: [192.168.158.158]PLAY RECAP ***********************************************************************
192.168.158.158 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.158.161 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
查驗:?
? ? ? ? 因為沒有循環,一次只能執行一個
[root@web1 opt]# cat f1.txt
line1231
test
opoiline
[root@web1 opt]# cat f1.txt
test
test
opoiline
?第二次
?
??
3、replace
根據正則表達式替換文件內容(指定換字符串)
常用參數:
-
path:操作文件的路徑
-
regexp:正則表達式
-
replace:指定最終要替換的字符串
-
backup:是否在修改文件之前對文件進行備份,yes是進行備份
?vim test.yml?
- name: 將/opt/f1.txt文件中的test替換為linereplace:path: /opt/f1.txtregexp: "test"replace: linetags: t2
?測試:
[root@ansible playbook]# ansible-playbook -C -t t2 test.ymlPLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.158]
ok: [192.168.158.161]TASK [將/opt/f1.txt文件中的test替換為line] ***************************************
changed: [192.168.158.161]
changed: [192.168.158.158]PLAY RECAP ***********************************************************************
192.168.158.158 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.158.161 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
執行
[root@ansible playbook]# ansible-playbook -t t2 test.ymlPLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.161]
ok: [192.168.158.158]TASK [將/opt/f1.txt文件中的test替換為line] ***************************************
changed: [192.168.158.158]
changed: [192.168.158.161]PLAY RECAP ***********************************************************************
192.168.158.158 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.158.161 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
查驗
?
?
5、template/copy
模板作用類似于copy,可將文件分發到不同節點上,可以在模板文件中引入變量
常用參數:
-
src: 源文件路徑
-
dest:目標文件路徑
-
group:目標文件屬組
-
mode:目標文件權限
-
backup:如果目標文件存在,則先備份目標文件
-
force:是否強制覆蓋,默認為yes
-
validate:在復制之前通過命令驗證目標文件,如果驗證通過則復制
示例:
- template: src=/mytemplates/tt.j2 dest=/etc/file.conf - template: src=/mytemplates/tt.j2 dest=/etc/file.conf group=wheel mode=0644 - template: src=/mytemplates/suzuka.j2 dest=/etc/suzuka validate='visudo -cf %s'
示例:
第一步:先從遠程主機拷貝一份nginx配置文件
[root@ansible playbook]# scp 192.168.158.158:/etc/nginx/nginx.conf ./
nginx.conf 100% 2334 1.0MB/s 00:00
第二步:編輯yml文件
?mag(輸出文本)
vim? test.yml????????
- name: print facts variabledebug:msg: "The {{ ansible_default_ipv4.interface }} IPV4 address is {{ ansible_default_ipv4.address }}"
?第三步:執行
[root@ansible playbook]# ansible-playbook -t t3 test.ymlPLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.158]
ok: [192.168.158.161]TASK [print facts variable] ******************************************************
ok: [192.168.158.158] => {"msg": "The default IPV4 address is 192.168.158.158"
}
ok: [192.168.158.161] => {"msg": "The default IPV4 address is 192.168.158.161"
}PLAY RECAP ***********************************************************************
192.168.158.158 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.158.161 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
?我們可以將default改為變量
第四步:過濾之后拷貝到一個文件里
[root@ansible playbook]# ansible 192.168.158.158 -m setup | grep -n ansible_default_ipv4
57: "ansible_default_ipv4": {
?
[root@ansible playbook]# ansible 192.168.158.158 -m setup > facts.txt
?interface是ens33
?第五步:將變量引用到文本里
- name: print facts variabledebug:msg: "The {{ ansible_default_ipv4.interface }} IPV4 address is {{ ansible_default_ipv4.address }}"tags: t3- name: 拷貝nginx配置文件template: src=./nginx.j2 dest=/etc/nginx/nginx.conftags: t4
?執行看一下
? ? ? ? 變量引用了
[root@ansible playbook]# ansible-playbook -t t3 test.ymlPLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.158]
ok: [192.168.158.161]TASK [print facts variable] ******************************************************
ok: [192.168.158.158] => {"msg": "The ens33 IPV4 address is 192.168.158.158"
}
ok: [192.168.158.161] => {"msg": "The ens33 IPV4 address is 192.168.158.161"
}PLAY RECAP ***********************************************************************
192.168.158.158 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.158.161 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
?將變量引用到nginx配置文件里
[root@ansible playbook]# ls
facts.txt nginx.conf test.yml
[root@ansible playbook]# vim nginx.conf ----------------------server {listen {{ ansible_default_ipv4.address }}:80;listen [::]:80;server_name _;root /usr/share/nginx/html;
-------------------------
?修改文件后綴
[root@ansible playbook]# mv nginx.conf nginx.j2
[root@ansible playbook]# ls
facts.txt nginx.j2 test.yml
?執行成功
[root@ansible playbook]# ansible-playbook -t t4 test.ymlPLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.158]
ok: [192.168.158.161]TASK [拷貝nginx配置文件] *********************************************************
changed: [192.168.158.161]
changed: [192.168.158.158]PLAY RECAP ***********************************************************************
192.168.158.158 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.158.161 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
去web主機上查驗nginx配置文件
成功引用
?
?8、wait_for
等待某些操作完成以后再進行后續操作
**常用參數:**
* ? connect\_timeout:在下一個任務執行之前等待連接的超時時間
* ? delay:指在等待過程中輪詢的時間間隔
* ? host:等待的主機地址,默認是127.0.0.1
* ? port:等待的主機端口
* ? path:文件路徑,只有當這個文件存在時才開始執行下一個任務
* ? state:等待的狀態,值可以為started/stoped/absent/present
* ? timeout:等待的超時時間,默認300秒
**示例:**
- name: 每隔10s檢查一次,等待8080端口正常監聽,才開始下一個任務,直到超時
? wait_for: port=8080 state=started delay=10
- name: 等待文件創建
? wait_for: path=/tmp/tt
?
?示例
此時web兩臺主機都是啟用nginx了的,此時80號端口已被監聽
vim test.yml
- name: 每隔10s檢查一次,等待80端口正常監聽,才開始下一個任務,直到超時wait_for: port=80 state=started delay=10- name: 如果上個任務為真執行下一個,創建文件file:path: /opt/1.txtstate: touch
?當80號端口被監聽后,才執行下一個任務創建文件
?執行
[root@ansible playbook]# ansible-playbook test.yml PLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.158]
ok: [192.168.158.161]TASK [每隔10s檢查一次,等待80端口正常監聽,才開始下一個任務,直到超時] ***********
ok: [192.168.158.158]
ok: [192.168.158.161]TASK [如果上個任務為真執行下一個,創建文件] ***************************************
changed: [192.168.158.161]
changed: [192.168.158.158]PLAY RECAP ***********************************************************************
192.168.158.158 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.158.161 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
?查驗:成功執行
9、when
條件判斷,滿足后再執行任務
示例: when是條件
- name: 判斷變量tt是否定義shell: echo "I've got {{ tt }}"when: tt is defined
?當主機名是web1時,下載httpd軟件包 (此時只有一臺web1,另一臺web2)
vim test.yml
- name: outputdebug:msg: "{{ ansible_hostname }}"- name: 條件任務yum:name: httpdstate: present when: ansible_hostname == "web1"
?
執行成功
[root@ansible playbook]# ansible-playbook test.yml PLAY [adda] *************************************************************************************************TASK [Gathering Facts] **************************************************************************************
ok: [192.168.158.158]
ok: [192.168.158.161]TASK [output] ***********************************************************************************************
ok: [192.168.158.158] => {"msg": "web1"
}
ok: [192.168.158.161] => {"msg": "agent2"
}TASK [條件任務] *********************************************************************************************
skipping: [192.168.158.161]
changed: [192.168.158.158]PLAY RECAP **************************************************************************************************
192.168.158.158 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.158.161 : ok=2 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
?
?去web主機查驗
hostname為web1的主機安裝了httpd軟件包
?