一、常用文件模塊
模塊名稱 | 釋義 |
---|---|
blockinfile | 插入、更新或刪除由可自定義標記線包圍的多行文本塊 |
copy | 將文件從本地或遠程計算機復制到受管主機上的某個位置。類似于file模塊,copy模塊還可以設置文件屬性,包括SELinux上下文件。 |
fetch | 此模塊的作用和copy模塊類似,但以相反方式工作。此模塊用于從遠程計算機獲取文件到控制節(jié)點,并將它們存儲在按主機名組織的文件樹中。 |
file | 設置權限、所有權、SELinux上下文以及常規(guī)文件、符號鏈接、硬鏈接和目錄的時間戳等屬性。此模塊還可以創(chuàng)建刪除常規(guī)文件、符號鏈接、硬鏈接和目錄。其他多個與文件相關的模塊支持與file模塊相同的屬性設置選項,包括copy模塊。 |
lineinfile | 確保特定行位于某文件中,或使用反向引用正則表達式來替換現(xiàn)有行。此模塊主要在用戶想要更改文件的某一行時使用。 |
stat | 檢索文件的狀態(tài)信息,類似于Linux中的stat命令。 |
synchronize | 圍繞rsync命令的一個打包程序,可加快和簡化常見任務。synchronize模塊無法提供對rsync命令的完整功能的訪問權限,但確實最常見的調用更容易實施。用戶可能仍需通過run command模塊直接調用rsync命令。 |
1.1 blockinfile模塊
- 模塊連接
- 可以判斷受控機上的文件內(nèi)容,前提是受控機上有這個文件。
1.判斷受控機上的文件里是否存在某行內(nèi)容。
[root@localhost playbook]# cat qingjun.yml
---
- name: 判斷文件內(nèi)容是否存在
hosts: 192.168.130.161
gather_facts: no
tasks:
- name: 判斷文件內(nèi)容是否存在
blockinfile:
path: /opt/qingjun
block: |
Are you like study ##判斷受控機上的/opt/qingjun文件是否存在此行內(nèi)容,不存在則添加此行。
2.更新ansible追加進去的文本內(nèi)容。
[root@localhost playbook]# cat qingjun.yml
---
- name: 判斷文件內(nèi)容是否存在
hosts: 192.168.130.161
gather_facts: no
tasks:
- name: 判斷文件內(nèi)容是否存在
blockinfile:
path: /opt/qingjun
block: |
大好河山 ##將之前添加進去的內(nèi)容換成此行,代表之前添加內(nèi)容會被刪除,再在文件里添加此行。
3.追加新文件內(nèi)容。
[root@localhost playbook]# cat qingjun.yml
---
- name: 判斷文件內(nèi)容是否存在
hosts: 192.168.130.161
gather_facts: no
tasks:
- name: 判斷文件內(nèi)容是否存在
blockinfile:
path: /opt/qingjun
block: |
大好河山
華夏九州 ##追加此行內(nèi)容。
1.2 file模塊
- 模塊連接
- 功能較多,常用模塊,可以創(chuàng)建文件,創(chuàng)建目錄,創(chuàng)建軟連接,并能添加屬主屬組和相關權限。
1.2.1 創(chuàng)建文件并賦予權限
1.創(chuàng)建文件,屬主屬組為qingjun,并添加權限。
[root@localhost playbook]# cat qingjun.yml
---
- name: 創(chuàng)建文件
hosts: 192.168.130.161
gather_facts: no
tasks:
- name: 添加權限創(chuàng)建文件
file:
name: /opt/qingjun.txt
owner: qingjun
group: qingjun
mode: '644'
state: touch
2.使用符號指定權限創(chuàng)建文件。
[root@localhost playbook]# cat qingjun.yml
---
- name: 創(chuàng)建文件
hosts: 192.168.130.161
gather_facts: no
tasks:
- name: 添加權限創(chuàng)建文件
file:
name: /opt/qingjun.txt
owner: qingjun
group: qingjun
mode: u-w,o+w,a+w
state: touch
1.2.2 創(chuàng)建目錄并賦予權限
1.創(chuàng)建目錄,不指定權限就賦予默認權限。
[root@localhost playbook]# cat qingjun.yml
---
- name: 創(chuàng)建文件
hosts: 192.168.130.161
gather_facts: no
tasks:
- name: 添加權限創(chuàng)建文件
file:
name: /opt/baimu
owner: qingjun
group: qingjun
state: directory
2.指定目錄權限創(chuàng)建。
[root@localhost playbook]# cat qingjun.yml
---
- name: 創(chuàng)建文件
hosts: 192.168.130.161
gather_facts: no
tasks:
- name: 添加權限創(chuàng)建文件
file:
name: /opt/baimu
owner: qingjun
group: qingjun
mode: '0777' ##指定目錄權限創(chuàng)建。
state: directory
1.2.3 創(chuàng)建軟連接
1.對文件軟連接。
[root@localhost playbook]# cat qingjun.yml
---
- name: 創(chuàng)建文件
hosts: 192.168.130.161
gather_facts: no
tasks:
- name: 添加權限創(chuàng)建文件
file:
src: /opt/qingjun.txt ##源文件。
dest: /opt/baimu/link_qingjun.txt ##目的地址,自定義連接連接名。
owner: qingjun
group: qingjun
state: link
2.對目錄軟連接。
[root@localhost playbook]# cat qingjun.yml
---
- name: 創(chuàng)建文件
hosts: 192.168.130.161
gather_facts: no
tasks:
- name: 添加權限創(chuàng)建文件
file:
src: /opt/baimu ##源目錄。
dest: /tmp/link_baimu ##目標地址,自定義連接目錄名稱,進入連接目錄相當于進入源目錄。
owner: qingjun
group: qingjun
state: link
1.2.4 刪除文件或目錄
1.刪除文件。
[root@localhost playbook]# cat qingjun.yml
---
- name: 創(chuàng)建文件
hosts: 192.168.130.161
gather_facts: no
tasks:
- name: 添加權限創(chuàng)建文件
file:
name: /opt/qingjun.txt ##刪除/opt/qingjun.txt文件。
state: absent
2.刪除目錄。
[root@localhost playbook]# cat qingjun.yml
---
- name: 創(chuàng)建文件
hosts: 192.168.130.161
gather_facts: no
tasks:
- name: 添加權限創(chuàng)建文件
file:
name: /opt/baimu ##刪除/opt/baimu目錄。
state: absent
1.3 fetch模塊
- 模塊連接
- 使用fetch模塊從受控機上索取文件到本地。
1.將受控機上家目錄下的文件傳到主控機本地目錄。
[root@localhost playbook]# cat qingjun.yml
---
- name: 創(chuàng)建文件
hosts: 192.168.130.161
gather_facts: no
tasks:
- name: 添加權限創(chuàng)建文件
fetch:
src: /root/anaconda-ks.cfg
dest: /opt
1.4 lineinfile模塊
- 模塊連接
- lineinfile模塊可以確保某一行是否存在文件里,若存在則返回ok,若不存在則文件末尾追加。
1.判斷受控機上的/opt/qingjun文件里否存在“baimu"這一行。若存在,則返回ok;若不存在,則在文件末行追加。
[root@localhost playbook]# cat qingjun.yml
---
- name: 創(chuàng)建文件
hosts: 192.168.130.161
gather_facts: no
tasks:
- name: 添加權限創(chuàng)建文件
lineinfile:
path: /opt/qingjun
line: baimu
state: present
1.5 stat模塊
- 模塊連接
- 可以查看受管主機的文件狀態(tài)。
1.查看受控機/opt/qingjun文件狀態(tài)。
[root@localhost playbook]# cat qingjun.yml
---
- name: 創(chuàng)建文件
hosts: 192.168.130.161
gather_facts: no
tasks:
- name: 添加權限創(chuàng)建文件
stat:
path: /opt/qingjun
checksum_algorithm: md5
register: qingjun
- debug:
var: qingjun
2.獲取文件的md5值,若值發(fā)生改變,則說明文件內(nèi)容已被更改過。
[root@localhost playbook]# cat qingjun.yml
---
- name: 創(chuàng)建文件
hosts: 192.168.130.161
gather_facts: no
tasks:
- name: 添加權限創(chuàng)建文件
stat:
path: /opt/qingjun
checksum_algorithm: md5
register: qingjun
- debug:
msg: "該文件當前md5值為:{{ qingjun.stat.checksum }}" ##指定msg參數(shù)自定義打印信息。
1.6 synchronize模塊
- 模塊連接
- synchronize模塊需要提前安裝rsync工具,主控機和受控機都要安裝
1.把主控機上的目錄一次性同步到所有受控機。
[root@localhost playbook]# cat qingjun.yml
---
- name: 主控機安裝服務
hosts: localhost
gather_facts: no
tasks:
- name: 安裝rsync服務
yum:
name: rsync
state: present
- name: 受控機安裝服務
hosts: all
gather_facts: no
tasks:
- name: 安裝rsync服務
yum:
name: rsync
state: present
- name: 目錄同步
synchronize:
src: /etc/ansible/playbook
dest: /opt/
2.查看受控機同步過來的目錄。
二、jinja2模板
- jinja2模板常用于將主控機帶有變量的模板文件傳到受控機時,會將變量改為具體的值。
- 自定義的jinja2模板的變量,也會在playbook中引用。
2.1 構建jinja2模板
定義格式:
- {% EXPR %}:用于事實表達式或腳本邏輯。
- {{ EXPR }}:用于向最終用戶輸出表達式或變量的結果。
- {# COMMENT #}:不會在最終文件里出現(xiàn),是jinja2文件本身的注釋。
注意事項:
- 必須使用template模塊,因為它可以修改變量值。
- 在jinja2模板文件里使用for語句和if語句,playbook中使用loop語句和when語句。
1.主控機定義模板文件,模板文件里面可以取事實,可以取變量。取的事實值,將會再傳到受控機上時把對應的事實值改為受控機本機的信息??梢韵仁褂胹etup模塊查看收集的事實。
[root@localhost playbook]# cat file/hosts.j2
{# redis配置文件模板 #}
hostname: {{ ansible_facts.hostname }}
redis_ip: {{ ansible_facts.default_ipv4.address }}
2.編寫playbook,將本地的file/hosts模板文件傳到受控機的/etc/hosts文件。
[root@localhost playbook]# cat qingjun.yml
---
- name: 配置受控機配置文件
hosts: all,localhost
tasks:
- name: 安裝rsync服務
template:
src: file/hosts.j2
dest: /etc/hosts
3.執(zhí)行playbook,受控機驗證。
2.2 管理jinja2模板
- 加文件提示,讓管理員在操作受控機上的配置文件時,知道這個文件時ansible生成的,不能擅自修改。
1.修改ansible配置文件ansible_managed參數(shù),自定義文件輸出提示內(nèi)容,最后就會在受控機上生成的配置文件里添加這行注釋。
2.修改jinja2模板。
3.編寫playbook。
2.3 控制結構
- 用戶可以在模板文件中使用jinja2控制結構,以減少重復輸入,為play中的每個主機動態(tài)輸入條目,或者有條件地將文本插入到文件中。
2.3.1 for循環(huán)語句
- 使用{% 自定義邏輯 %}表示執(zhí)行邏輯。
- {{ 變量 }} 表示取的變量值將會輸出到受控機文件內(nèi)。
2.3.1.1 for循環(huán)+變量
1.jinja2模板定義邏輯,使用for循環(huán)變量users里的值,變量user作為輸出內(nèi)容。
[root@localhost playbook]# cat file/hosts.j2
# {{ ansible_managed }}
{# 循環(huán)語句 #}
{% for user in users %} ##for表示開始。
{{ user }}
{% endfor %} ##endfor表示結束。
2.playbook定義users變量循環(huán)體。
[root@localhost playbook]# cat qingjun.yml
---
- name: 配置受控機配置文件
hosts: all
vars:
users: ##將對users變量下的內(nèi)容進行循環(huán)。
- zhangsan
- lisi
- wangwu
tasks:
- name: 安裝rsync服務
template:
src: file/hosts.j2
dest: /opt/qingjun
3.執(zhí)行playbook,查看受控機上輸出的文件,文件里的內(nèi)容正是playbook里的users變量下的內(nèi)容,如何循環(huán)使用jinja2模板定義。
2.3.1.2 for循環(huán)+loop.index
1.配合loop.index使用,取當前循環(huán)索引。
[root@localhost playbook]# cat file/hosts.j2
# {{ ansible_managed }}
{# 循環(huán)語句 #}
{% for user in users %}
{{ loop.index }}
{% endfor %}
2.3.1.3 for循環(huán)+條件判斷
- 對playbook中的變量進行循環(huán),取出不是qingjun的內(nèi)容,將其輸出到受控機的/opt/qingjun文件里。
1.playbook定義變量循環(huán)體。
[root@localhost playbook]# cat qingjun.yml
---
- name: 配置受控機配置文件
hosts: all
vars:
users:
- zhangsan
- lisi
- wangwu
- qingjun
- shito
tasks:
- name: 安裝rsync服務
template:
src: file/hosts.j2
dest: /opt/qingjun
2.jinja2模板定義循環(huán)邏輯。
[root@localhost playbook]# cat file/hosts.j2
# {{ ansible_managed }}
{# 循環(huán)語句 #}
{% for user in users if not user == "qingjun" %}
number user:{{ loop.index }} ,{{ user }}
{% endfor %}
3.執(zhí)行playbook,查看受控機文件內(nèi)容。
2.3.1.4 for循環(huán)+playbook變量組
- 在playbook中定義變量組,編寫jinja2模板文件時可以根據(jù)變量組名稱應用取其中的值。
1.playbook中定義變量循環(huán)體,同時定義兩個組,qingjun組和baimu組。
[root@localhost playbook]# cat qingjun.yml
---
- name: 配置受控機配置文件
hosts: all
vars:
group:
qingjun:
- zhangsan
- lisi
- wangwu
baimu:
- skasdk
- shito
tasks:
- name: 安裝rsync服務
template:
src: file/hosts.j2
dest: /opt/qingjun
2.定義jinja2模板文件,對playbook里的qingjun組里的內(nèi)容進行循環(huán)。
[root@localhost playbook]# cat file/hosts.j2
# {{ ansible_managed }}
{# 循環(huán)語句 #}
{% for name in group['qingjun'] %} ##playbook中的變量組group,其中有個qingjun組。
number user:{{ loop.index }} ,{{ name }}
{% endfor %}
3.執(zhí)行playbook,受控機查看文件內(nèi)容。
2.3.15 for循環(huán)+清單文件組
- jinja2模板文件中使用groups引用清單文件中的組,根據(jù)組名取其中的值,不會取變量值,所以只會取出主機ip。
1.清單文件里由兩個組,mq和qq??梢愿鶕?jù)主機組名稱來取值。
2.編寫playbook,雖然仍然存在變量組,但在后面的jinja2模板文件里不再引用。
[root@localhost playbook]# cat qingjun.yml
---
- name: 配置受控機配置文件
hosts: all
vars:
group:
qingjun:
- zhangsan
- lisi
- wangwu
baimu:
- skasdk
- shito
tasks:
- name: 安裝rsync服務
template:
src: file/hosts.j2
dest: /opt/qingjun
3.定義jinja2模板文件,對清單文件里的mq組內(nèi)容進行循環(huán)。
[root@localhost playbook]# cat file/hosts.j2
# {{ ansible_managed }}
{# 循環(huán)語句 #}
{% for name in groups['mq'] %} ##清單文件中的組mq。
number user:{{ loop.index }} ,{{ name }}
{% endfor %}
4.執(zhí)行playbook,受控機查看文件內(nèi)容。
2.3.2 if判斷語句
- if語句與前面的when語句作用相同,當滿足條件時則輸出內(nèi)容;不滿足條件時,則不輸出內(nèi)容。
1.定義jinja2模板文件,自定義判斷條件。
[root@localhost playbook]# cat file/hosts.j2
# {{ ansible_managed }}
{# if判斷語句 #}
{% if 1 >2 %} ##自定義判斷條件,當為true時,則輸出內(nèi)容到文件里;當為false時,則不做輸出。
number user:{{ ansible_facts['default_ipv4']['address'] }}
{% endif %}
2.編寫playbook,把jinja2文件內(nèi)容傳輸?shù)绞芸貦C的/opt/qingjun文件里。
[root@localhost playbook]# cat qingjun.yml
---
- name: 配置受控機配置文件
hosts: all
tasks:
- name: 安裝rsync服務
template:
src: file/hosts.j2
dest: /opt/qingjun
3.執(zhí)行playbook,受控機查看文件內(nèi)容。
4.此時改變jinja2中的判斷規(guī)則,條件為true時,則將內(nèi)容輸出到受控機。
[root@localhost playbook]# cat file/hosts.j2
# {{ ansible_managed }}
{# if判斷語句 #}
{% if 1 < 2 %} ##條件為真,輸出內(nèi)容到受控機。
number user:{{ ansible_facts['default_ipv4']['address'] }}
{% endif %}
2.4 變量過濾器
- 變量過濾器也是編寫jinja2模板文件,在里面寫一些可以優(yōu)化輸出內(nèi)容格式的參數(shù)語句,方便客戶閱讀。
- 格式:{{ 變量 | to_json }}
1.輸出內(nèi)容為普通json格式,參數(shù)to_json。
[root@localhost playbook]# cat file/hosts.j2
# {{ ansible_managed }}
{# if判斷語句 #}
{% if 1 < 2 %}
{{ ansible_facts['default_ipv4'] | to_json }}
{% endif %}
2.輸出為方便閱讀的json格式,參數(shù)to_nice_json。
[root@localhost playbook]# cat file/hosts.j2
# {{ ansible_managed }}
{# if判斷語句 #}
{% if 1 < 2 %}
{{ ansible_facts['default_ipv4'] | to_nice_json }}
{% endif %}
3.輸出為yaml格式,參數(shù)to_yaml和to_nice_yaml。文章來源:http://www.zghlxwxcb.cn/news/detail-470144.html
[root@localhost playbook]# cat file/hosts.j2
# {{ ansible_managed }}
{# if判斷語句 #}
{% if 1 < 2 %}
{{ ansible_facts['default_ipv4'] | to_nice_yaml }}
{% endif %}
4.限制注入變量格式,只能是字符串型,參數(shù)from_json和from_yaml。文章來源地址http://www.zghlxwxcb.cn/news/detail-470144.html
到了這里,關于Ansible基礎6——文件模塊、jinja2模板的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!