ansible 執行結果信息–各顏色說明;ansible Ad-Hoc 說明;ansible 如何查看幫助文檔與常用模塊詳解 ...
ansible 執行結果信息–各顏色說明;ansible Ad-Hoc 說明;ansible 如何查看幫助文檔與常用模塊詳解
主機規劃
添加用戶賬號
說明:
1、 運維人員使用的登錄賬號;
2、 所有的業務都放在 /app/ 下「yun用戶的家目錄」,避免業務數據亂放;
3、 該用戶也被 ansible 使用,因為幾乎所有的生產環境都是禁止 root 遠程登錄的(因此該 yun 用戶也進行了 sudo 提權)。
1 # 使用一個專門的用戶,避免直接使用root用戶 2 # 添加用戶、指定家目錄並指定用戶密碼 3 # sudo提權 4 # 讓其它普通用戶可以進入該目錄查看信息 5 useradd -u 1050 -d /app yun && echo '123456' | /usr/bin/passwd --stdin yun 6 echo "yun ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers 7 chmod 755 /app/
Ansible 配置清單Inventory
之後文章都是如下主機配置清單
1 [yun@ansi-manager ansible_info]$ pwd 2 /app/ansible_info 3 [yun@ansi-manager ansible_info]$ cat hosts_key 4 # 方式1、主機 + 埠 + 密鑰 5 [manageservers] 6 172.16.1.180:22 7 8 [proxyservers] 9 172.16.1.18[1:2]:22 10 11 # 方式2:別名 + 主機 + 埠 + 密碼 12 [webservers] 13 web01 ansible_ssh_host=172.16.1.183 ansible_ssh_port=22 14 web02 ansible_ssh_host=172.16.1.184 ansible_ssh_port=22 15 web03 ansible_ssh_host=172.16.1.185 ansible_ssh_port=22
Ansible執行返回 => 顏色信息說明
黃色:成功執行並且伴隨著狀態的改變
ansible proxyservers -m command -a 'cat /etc/hosts' -i hosts_key
綠色:成功執行並且沒有發生狀態的改變,或者只是對遠程節點狀態信息進行查看
ansible proxyservers -m ping -i hosts_key
紅色:操作執行命令有異常
ansible proxyservers -m command -a 'll /tmp' -i hosts_key
紫色:表示對命令執行發出警告信息(可能存在的問題,給你一下建議)
1 # 其中 hosts_kkk 文件不存在 2 ansible proxyservers -m command -a 'll /tmp' -i hosts_kkk
Ansible 之 Ad-Hoc
Ansible中有兩種模式, 分別是 Ad-Hoc 模式和 Playbooks 模式。
ad-hoc簡而言之,就是“臨時命令”,不會保存。
ad-hoc模式的使用場景
場景一,在多台機器上,查看某個進程是否啟動
場景二,在多台機器上,拷貝指定日誌文件到本地,等等
ad-hoc模式的命令使用
Ansible查看幫助方法
1 [yun@ansi-manager ~]$ ansible-doc -l # 查看所有模塊與簡要說明 2 [yun@ansi-manager ~]$ ansible-doc copy # 查看指定模塊方法「可優先查看 EXAMPLES 信息」★★★★★ 3 [yun@ansi-manager ~]$ ansible-doc -s copy # 查看指定模塊的 Playbooks 代碼段
Ansible常用模塊
工作目錄與主機清單
當前所在的工作目錄和主機清單
1 [yun@ansi-manager ansible_info]$ pwd 2 /app/ansible_info 3 [yun@ansi-manager ansible_info]$ ll 4 total 4 5 -rw-rw-r-- 1 yun yun 226 Oct 8 16:07 hosts_key 6 [yun@ansi-manager ansible_info]$ cat hosts_key 7 # 方式1、主機 + 埠 + 密鑰 8 [manageservers] 9 172.16.1.180:22 10 11 [proxyservers] 12 172.16.1.18[1:2]:22 13 14 # 方式2:別名 + 主機 + 埠 + 密碼 15 [webservers] 16 web01 ansible_ssh_host=172.16.1.183 ansible_ssh_port=22 17 web02 ansible_ssh_host=172.16.1.184 ansible_ssh_port=22 18 web03 ansible_ssh_host=172.16.1.185 ansible_ssh_port=22
command 命令模塊
預設模塊, 用於執行命令。但不支持管道或重定向。
正常示例
1 [yun@ansi-manager ansible_info]$ ansible proxyservers -a 'df -h' -i hosts_key 2 # 或者 3 [yun@ansi-manager ansible_info]$ ansible proxyservers -m command -a 'df -h' -i hosts_key
異常示例
1 # 重定向不支持 2 ansible proxyservers -m command -a 'df -h > /tmp/df.info' -i hosts_key 3 # 管道不支持 4 ansible proxyservers -m command -a "df -h | grep 'boot'" -i hosts_key
shell 命令模塊
功能和 command 相同,且支持管道和重定向。與 command 相比,優先使用該模塊。
示例
1 ansible proxyservers -m shell -a "df -h | grep 'boot'" -i hosts_key 2 ansible proxyservers -m shell -a "df -h > /tmp/df.info" -i hosts_key
script 腳本模塊
在本地運行模塊,等同於在遠程執行。且不需要將腳本文件推送到目標主機進行執行。
示例
腳本中有 sudo 提權
1 # 在 ansible 管理機操作 2 [yun@ansi-manager ansible_info]$ cat /app/yunwei/yum_test.sh 3 #!/bin/sh 4 # 由於使用的是 yun 用戶,而不是 root 用戶,因此需要 sudo 提權 5 sudo yum install -y iftop 6 [yun@ansi-manager ansible_info]$ ansible proxyservers -m script -a "/app/yunwei/yum_test.sh" -i hosts_key
腳本中無 sudo 提權
1 # 在 ansible 管理機操作 2 [yun@ansi-manager ansible_info]$ cat /app/yunwei/yum_test.sh 3 #!/bin/sh 4 yum install -y iftop 5 ####################################### 6 # 由於我們使用的是 yun 普通用戶 7 # 因此這裡需要使用 -b 選擇進行提權,這樣在遠程會以 root 用戶執行 8 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m script -a "/app/yunwei/yum_test.sh" -i hosts_key
在目標機器查看是否在 yum 安裝 iftop
1 [root@ansi-haproxy01 ~]# ps -ef | grep 'iftop' 2 root 3867 3866 0 23:25 pts/1 00:00:00 sudo yum install -y iftop 3 root 3868 3867 48 23:25 pts/1 00:00:12 /usr/bin/python /bin/yum install -y iftop 4 root 4144 3155 0 23:25 pts/0 00:00:00 grep --color=auto iftop
yum 安裝軟體模塊
在目標機器實現 yum 安裝軟體
1 # 查看 yum 模塊方法「可優先查看 EXAMPLES 信息的使用案例,知曉如何使用」 2 [yun@ansi-manager ansible_info]$ ansible-doc yum 3 # 由於我們使用的是 yun 普通用戶 4 # 因此必須使用 -b 選擇進行提權 5 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m yum -a 'name=httpd state=present' -i ./hosts_key
相關選項說明:
name:要安裝軟體包的名稱
state:狀態說明
‘present’ 和 ‘installed’ 簡單地確保全裝了所需的包。「優先使用 present」
‘latest’ 將更新指定的軟體包,如果它不是最新可用的版本。
‘absent’ and ‘removed’ 將刪除指定的包【慎用!!!】。「如要使用優先使用 absent」
download_only:只下載包,不安裝
copy 文件拷貝模塊「本地到遠端」
將控制機的文件或目錄拷貝到受控機,並且可以指定目標文件/目錄的屬性信息。
控制機操作
1 # 查看 yum 模塊方法「可優先查看 EXAMPLES 信息的使用案例,知曉如何使用」 2 [yun@ansi-manager ansible_info]$ ansible-doc copy 3 # 由於我們使用的是 yun 普通用戶 4 # 因此有時需要使用 -b 選擇進行提權 5 # 將 content 中的內容直接寫入目標文件中 6 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m copy -a "content='123\n' dest=/tmp/copy_test2 owner=root group=root mode=0644 backup=yes" -i ./hosts_key 7 ## 拷貝文件 8 [yun@ansi-manager ansible_info]$ cat /tmp/copy_test 9 111111 10 222222 11 333333 12 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m copy -a "src=/tmp/copy_test dest=/tmp/ owner=root group=root mode=0644 backup=yes" -i ./hosts_key 13 ## 拷貝目錄 14 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m copy -a "src=/app/yunwei dest=/tmp/ owner=root group=root mode=0644 backup=yes" -i ./hosts_key
被控端查看
1 [yun@ansi-haproxy01 tmp]$ cat copy_test2 2 123 3 [yun@ansi-haproxy01 tmp]$ cat /tmp/copy_test 4 111111 5 222222 6 333333
相關選項說明:
src:源文件「可以是絕對路徑或相對路徑」
remote_src:為 False「預設」,則源文件在本地;為 True ,則源文件在遠端「瞭解」
dest:推送數據的目標路徑或目標文件
owner:指定遠端文件的屬主
group:指定遠端文件的屬組
mode:指定遠端文件的許可權
backup:如果推送的目標文件存在且與源文件內容不同,那麼會對目標文件進行備份「通過 checksum 校驗」
content:將 content 中的內容直接寫入目標文件中
註意事項:
1、同一個源文件,如果源文件內容沒有任何修改,那麼進行第二次相同的操作時,檢測到要拷貝的文件和目標文件內容相同「通過 checksum 校驗」,且目標文件屬性前後未發生改變,那麼就不會進行拷貝。由於目標文件屬性未發生改變,所以返回數據顏色為綠色。如下圖所示。
2、同一個源文件,如果源文件內容沒有任何修改,那麼進行第二次相同的操作時,如果源文件和目標文件內容相同「通過 checksum 校驗」,但目標文件屬性前後要求發生改變「屬主、屬組、許可權」,那樣也不會進行拷貝。但由於目標文件屬性發生改變,所以返回數據顏色為黃色。
fetch 文件拷貝模塊「遠端到本地」
該模塊功能類似於 copy 模塊,但是是反向的。將遠端的文件拷貝到本地。備註:當前僅支持文件,暫不支持遞歸拷貝。
由於ansible使用的是 yun 用戶,因此從遠端拷貝過來的文件屬主、屬組都是 yun。
控制機操作
1 # 查看 yum 模塊方法「可優先查看 EXAMPLES 信息的使用案例,知曉如何使用」 2 [yun@ansi-manager ansible_info]$ ansible-doc fetch 3 # 由於我們使用的是 yun 普通用戶 4 # 因此有時需要使用 -b 選擇進行提權
被控端文件準備1
1 [test1@ansi-haproxy01 tmp]$ ll /tmp/test1 2 -rw-rw-r-- 1 test1 test1 20 Nov 2 11:04 /tmp/test1 3 [test1@ansi-haproxy01 tmp]$ cat /tmp/test1 4 111 5 222 6 333 7 aaa 8 bbb
被控端文件準備2
1 [test1@ansi-haproxy02 tmp]$ ll /tmp/test1 2 -rw-rw-r-- 1 test1 test1 20 Nov 2 11:04 /tmp/test1 3 [test1@ansi-haproxy02 tmp]$ cat /tmp/test1 4 1111
拷貝方式1
1 [yun@ansi-manager ansible_info]$ ansible 172.16.1.181 -b -m fetch -a "src=/tmp/test1 dest=/tmp/" -i ./hosts_key # 拷貝 172.16.1.181 主機的 2 或者 3 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m fetch -a "src=/tmp/test1 dest=/tmp/" -i ./hosts_key # 拷貝 proxyservers 主機組的 4 ## 查看拷貝結果「註意目錄層次」 5 [yun@ansi-manager ansible_info]$ ll /tmp/ 6 total 4 7 drwxrwxr-x 3 yun yun 17 Nov 2 11:21 172.16.1.181 8 drwxrwxr-x 3 yun yun 17 Nov 2 11:23 172.16.1.182 9 [yun@ansi-manager ansible_info]$ tree /tmp/172.16.1.18* 10 /tmp/172.16.1.181 11 └── tmp 12 └── test1 13 /tmp/172.16.1.182 14 └── tmp 15 └── test1 16 17 2 directories, 2 files
拷貝方式2
1 # 如果使用 flat=yes,那麼最好只拷貝一臺遠端主機的文件,如果是多台那麼後面執行的結果,會把前面的覆蓋掉。 2 # dest 路徑有 / 結尾 3 [yun@ansi-manager ansible_info]$ ansible 172.16.1.181 -b -m fetch -a "src=/tmp/test1 dest=/tmp/kkk2/ flat=yes" -i ./hosts_key # 推薦,只拷貝一臺 4 # dest 路徑無 / 結尾 5 [yun@ansi-manager ansible_info]$ ansible 172.16.1.181 -b -m fetch -a "src=/tmp/test1 dest=/tmp/kkk flat=yes" -i ./hosts_key # 推薦,只拷貝一臺 6 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m fetch -a "src=/tmp/test1 dest=/tmp/kkk flat=yes" -i ./hosts_key # 不推薦,會產生覆蓋 7 ## 查看拷貝結果 8 [yun@ansi-manager ansible_info]$ cat /tmp/kkk2/test1 9 111 10 222 11 333 12 aaa 13 bbb 14 [yun@ansi-manager ansible_info]$ ll /tmp/kkk 15 -rw-rw-r-- 1 yun yun 20 Nov 2 11:25 /tmp/kkk 16 [yun@ansi-manager ansible_info]$ cat /tmp/kkk # 該文件沒有 "11111"信息; 產生了覆蓋效應 17 111 18 222 19 333 20 aaa 21 bbb
相關選項說明:
src:源文件,當前僅支持文件,不支持目錄
dest:推送數據的目標路徑,預設為:dest[路徑]/hostname/src[路徑]。參見上面示例
flat: 預設 False。當為 yes/True 時,那麼拷貝效果類似於本地的 copy。
template 模板使用
該模塊功能類似於 copy 模塊,但 copy 模塊不支持變數,不支持模板。
template 模塊支持變數,支持 Jinja 模板。因此如果生成中的配置文件涉及變數,那麼請使用 template 模塊。
涉及到 playbook、變數和 Jinja ,這些在後面的文章會有詳解。
1 # 查看 yum 模塊方法「可優先查看 EXAMPLES 信息的使用案例,知曉如何使用」 2 [yun@ansi-manager ansible_info]$ ansible-doc template 3 # 由於我們使用的是 yun 普通用戶 4 # 因此有時需要使用 -b 選擇進行提權 5 # palybook 6 [yun@ansi-manager ansible_info]$ pwd 7 /app/ansible_info 8 [yun@ansi-manager ansible_info]$ ll 9 total 16 10 drwxrwxr-x 2 yun yun 35 Oct 11 11:23 file 11 -rw-rw-r-- 1 yun yun 226 Oct 8 16:07 hosts_key 12 -rw-rw-r-- 1 yun yun 304 Oct 11 11:40 test_template.yml 13 [yun@ansi-manager ansible_info]$ ll file/ # 涉及的文件 14 total 4 15 -rw-rw-r-- 1 yun yun 175 Oct 11 11:23 test_template.conf.j2 16 [yun@ansi-manager ansible_info]$ cat file/test_template.conf.j2 17 # facts 變數 18 dns_info={{ ansible_dns['nameservers'][0] }} 19 mem_total={{ ansible_memtotal_mb }} 20 # 自定義變數 21 listen_port={{ listen_port }} 22 access_addr={{ access_addr }} 23 24 [yun@ansi-manager ansible_info]$ 25 [yun@ansi-manager ansible_info]$ cat test_template.yml # 涉及的 playbook 26 --- 27 # template 示例 28 - hosts: proxyservers 29 vars: 30 - listen_port: 8080 31 - access_addr: zhangblog.com 32 33 tasks: 34 - name: "template conf" 35 template: 36 src: ./file/test_template.conf.j2 37 dest: /tmp/test_template.conf 38 owner: root 39 group: yun 40 mode: '0600' 41 [yun@ansi-manager ansible_info]$ ansible-playbook -b -i ./hosts_key test_template.yml # 執行
目標機器查看
1 [root@ansi-haproxy01 tmp]# pwd 2 /tmp 3 [root@ansi-haproxy01 tmp]# cat test_template.conf 4 # facts 變數 5 dns_info=223.5.5.5 6 mem_total=1821 7 # 自定義變數 8 listen_port=8080 9 access_addr=zhangblog.com
相關選項說明:
src:源文件「可以是絕對路徑或相對路徑」
dest:推送數據的目標路徑或目標文件
owner:指定遠端文件的屬主
group:指定遠端文件的屬組
mode:指定遠端文件的許可權
backup:如果推送的目標文件存在且與源文件內容不同,那麼會對目標文件進行備份
file 文件配置模塊
在受控機創建文件或目錄,或修改屬性信息「如:屬主、屬組、許可權」
1 # 查看 yum 模塊方法「可優先查看 EXAMPLES 信息的使用案例,知曉如何使用」 2 [yun@ansi-manager ansible_info]$ ansible-doc file 3 # 由於我們使用的是 yun 普通用戶 4 # 因此有時需要使用 -b 選擇進行提權 5 ## 在受控機改變目標文件的屬性【該文件是已存在的】 6 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m file -a "path=/tmp/yum_test.sh owner=yun group=yun mode=0600" -i ./hosts_key 7 ## 在受控機創建軟連接 8 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m file -a "src=/tmp/yum_test.sh dest=/tmp/yum_link.sh owner=yun group=yun state=link" -i ./hosts_key 9 ## 在受控機創建硬鏈接 10 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m file -a "src=/tmp/yum_test.sh dest=/tmp/yum_hard.sh owner=yun group=root state=hard" -i ./hosts_key 11 ## 在受控機,如果目標文件不存在則創建 12 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m file -a "path=/tmp/dest_file owner=yun group=yun state=touch" -i ./hosts_key 13 ## 在控制機,如果目標目錄不存在則創建「可創建多級目錄」 14 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m file -a "path=/tmp/desc_dir/aaa/bbb owner=yun group=root mode=700 state=directory" -i ./hosts_key 15 ## 在控制機,改變目標目錄和目錄下所有目錄或文件的屬性信息「遞歸修改」 16 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m file -a "path=/tmp/desc_dir owner=yun group=zhang mode=766 state=directory recurse=yes" -i ./hosts_key 17 ## 在受控機,如果目標文件或目錄存在,則刪除「慎用!!!」 18 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m file -a "path=/tmp/desc_dir state=absent " -i ./hosts_key
相關選項說明:
path:指定目標文件或目錄
owner:指定目標文件的屬主
group:指定目標文件的屬組
mode:指定目標文件的許可權
state:狀態說明
file:預設值,指定文件
link:創建軟連接
hard:創建硬鏈接
touch:如果文件不存在則創建
directory:如果目錄不存在則創建
absent:如果目標文件或目錄存在,則刪除「慎用!!!」
recurse:遞歸授權
lineinfile 行編輯模塊
此模塊確保文件中有特定的行,或者使用反向引用的正則表達式替換現有的行。當您只想更改文件中的一行時,這非常有用。
如果您想要更改多個相似的行,請查看[replace]模塊。如果你想要插入/更新/刪除文件中的一個行塊,請查看[blockinfile]模塊。對於其他情況,請參見[copy]或[template]模塊。
數據文件準備
1 [yun@ansi-manager tmp]$ cat /tmp/lineinfile_test 2 # disabled - No SELinux policy is loaded. 3 SELINUX=disabled1 4 # disabled - No SELinux policy is loaded. 5 SELINUX=disabled2 6 # disabled - No SELinux policy is loaded. 7 SELINUX=disabled3 8 # SELINUXTYPE= can take one of three two values: 9 10 # httpd listen port 11 Listen 80
1 # 查看 yum 模塊方法「可優先查看 EXAMPLES 信息的使用案例,知曉如何使用」 2 [yun@ansi-manager ansible_info]$ ansible-doc lineinfile 3 # 由於我們使用的是 yun 普通用戶 4 # 因此有時需要使用 -b 選擇進行提權
行插入
1 # 如果文件中沒有 line 中的字元串,那麼就追加在文件末尾;有則不作任何操作。 2 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m lineinfile -a "path=/tmp/lineinfile_test line='# who are you?'" -i ./hosts_key 3 # 首先保證line 中的字元串在文件中沒有,如果有則不會添加 4 # 其次會使用insertafter中的正則規則進行正則匹配,匹配成功則在最後一次匹配行後面插入line,如果沒匹配成功則在文件末尾插入 5 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m lineinfile -a "path=/tmp/lineinfile_test insertafter='SELINUX' line='insertafter test1'" -i ./hosts_key 6 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m lineinfile -a "path=/tmp/lineinfile_test insertafter='SELINUXXX' line='insertafter test2'" -i ./hosts_key 7 # 首先保證line 中的字元串在文件中沒有,如果有則不會添加 8 # 其次會使用insertbefore中的正則規則進行正則匹配,匹配成功則在最後一次匹配行前面插入line,如果沒匹配成功則在文件末尾插入 9 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m lineinfile -a "path=/tmp/lineinfile_test insertbefore='SELINUX' line='insertbefore test1'" -i ./hosts_key 10 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m lineinfile -a "path=/tmp/lineinfile_test insertbefore='SELINUXXX' line='insertbefore test2'" -i ./hosts_key
行替換
1 # state=present時,如果多次匹配,那麼最後一次匹配會被修改;如果沒有匹配成功則在文件末尾追加,不管line是否存在。 2 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m lineinfile -a "path=/tmp/lineinfile_test regexp='^SELINUX=' line='SELINUX=enforcing'" -i ./hosts_key 3 # state=present時,如果多次匹配,那麼最後一次匹配會被修改;如果沒有匹配成功則文件保持不變,使用backrefs=yes。 4 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m lineinfile -a "path=/tmp/lineinfile_test regexp='^ELINUX=' line='SELINUX=enforcing' backrefs=yes" -i ./hosts_key
行刪除
1 # state=absent時,如果多次匹配,那麼每一次匹配都會刪除匹配行 2 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m lineinfile -a "path=/tmp/lineinfile_test regexp='^SELINUX=' state=absent" -i ./hosts_key 3 # 根據line匹配,如果匹配則刪除匹配行 4 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m lineinfile -a "path=/tmp/lineinfile_test line='# httpd listen port' state=absent" -i ./hosts_key
相關選項說明:
path:要修改的文件。
line:與 state=present 配合使用;在文件中要插入或者替換的行。
state:狀態說明
present:添加或修改,預設值
absent:刪除
backrefs:與 state=present 配合使用;如果設置了 line 可以包含反向引用(位置和命名),當‘regexp’匹配,就會填充反向引用。
這個參數稍微改變了模塊的操作;’insertbefore’ 和 ‘insertafter’ 將被忽略,如果 ‘regexp’ 與文件中的任何地方不匹配,文件將保持不變。
regexp:對文件的每行進行正則匹配;對於 state=present 只有最後的一次行匹配會被替換;對於 state=absent 只要匹配就會刪除該行。
backup:對源文件備份。預設:False
create:與 state=present 配合使用;如果不存在則創建文件。預設:False
insertafter:與 state=present 配合使用;在匹配行後插入。使用正則表達式,在指定正則表達式的最後一次匹配之後插入該行。如果需要第一個匹配,則使用(firstmatch=yes)。
如果沒有匹配成功,那麼會在文件末尾處插入。優先順序低於 regexp。
insertbefore:與 state=present 配合使用;在匹配行前插入。使用正則表達式,在指定正則表達式的最後一次匹配之前插入該行。如果需要第一個匹配,則使用(firstmatch=yes)。
如果沒有匹配成功,那麼會在文件末尾處插入。優先順序低於 regexp。
firstmatch:與 insertafter 或 insertbefore 配合使用;在 insertafter 或 insertbefore 的首次正則匹配。預設:False
owner:指定遠端文件的屬主
group:指定遠端文件的屬組
mode:指定遠端文件的許可權
blockinfile 多行編輯模塊
該模塊可以幫助我們在指定的文件中插入”一段文本”,這段文本是被標記過的。
換句話說就是,我們在這段文本上做了記號,以便在以後的操作中可以通過”標記”找到這段文本,然後修改或者刪除它
1 # 查看 yum 模塊方法「可優先查看 EXAMPLES 信息的使用案例,知曉如何使用」 2 [yun@ansi-manager ansible_info]$ ansible-doc blockinfile 3 # 由於我們使用的是 yun 普通用戶 4 # 因此有時需要使用 -b 選擇進行提權
對不存在的文件進行——多行插入與修改
1 # /tmp/blockinfile_test 文件是不存在的,因此使用了create選項 2 # 插入/修改 如果沒有則插入,如果之前有信息則修改 3 ##### 這裡之前沒有,則是創建文件並【插入】信息 4 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m blockinfile -a 'path=/tmp/blockinfile_test block="Match User ansible-agent\nPasswordAuthentication no" create=yes' -i ./hosts_key 5 [root@ansi-manager ansible_info]# cat /tmp/blockinfile_test # 查看文件信息 6 # BEGIN ANSIBLE MANAGED BLOCK 7 Match User ansible-agent 8 PasswordAuthentication no 9 # END ANSIBLE MANAGED BLOCK 10 ##### 文件已存在,mark標記已存在,這裡是【修改】 11 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m blockinfile -a 'path=/tmp/blockinfile_test block="iface eth0 inet static\n address 192.0.2.23\n netmask 255.255.255.0" create=yes' -i ./hosts_key 12 [root@ansi-manager ansible_info]# cat /tmp/blockinfile_test # 查看文件信息 13 # BEGIN ANSIBLE MANAGED BLOCK 14 iface eth0 inet static 15 address 192.0.2.23 16 netmask 255.255.255.0 17 # END ANSIBLE MANAGED BLOCK
對已存在的文件進行——多行插入與修改
1 [root@ansi-manager ansible_info]# cat /tmp/blockinfile_test2 # 查看文件信息 2 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 3 <html> 4 <head> 5 <title>blockinfile info</title> 6 </head> 7 <body> 8 <h1>welcome to here.</h1> 9 </body></html> 10 ##### 插入多行標記塊信息 這裡也使用了 insertafter 選項 11 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m blockinfile -a 'path=/tmp/blockinfile_test2 marker="<!-- {mark} ANSIBLE MANAGED BLOCK -->" insertafter="<body>" block="<h1>Welcome to blockinfile</h1>\n<p>Last Login By you!</p>"' -i ./hosts_key 12 [root@ansi-manager ansible_info]# cat /tmp/blockinfile_test2 # 查看文件信息 13 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 14 <html> 15 <head> 16 <title>blockinfile info</title> 17 </head> 18 <body> 19 <!-- BEGIN ANSIBLE MANAGED BLOCK --> 20 <h1>Welcome to blockinfile</h1> 21 <p>Last Login By you!</p> 22 <!-- END ANSIBLE MANAGED BLOCK --> 23 <h1>welcome to here.</h1> 24 </body></html> 25 ##### 刪除標記塊信息 26 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m blockinfile -a 'path=/tmp/blockinfile_test2 marker="<!-- {mark} ANSIBLE MANAGED BLOCK -->" block=""' -i ./hosts_key 27 [root@ansi-manager ansible_info]# cat /tmp/blockinfile_test2 # 查看文件信息 28 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 29 <html> 30 <head> 31 <title>blockinfile info</title> 32 </head> 33 <body> 34 <h1>welcome to here.</h1> 35 </body></html>
相關選項說明:
path:要修改的文件。
block:要插入標記行內的文本。如果該選項缺失或是一個空字元串,該塊將被刪除,就像 “state” 被指定為 “absent” 。(別名:content)
state:狀態說明
present:添加或修改,預設值
absent:刪除
create:文件不存在則創建。預設:False
backup:對源文件備份。預設:False
insertafter:在匹配行後插入。使用正則表達式,在指定正則表達式的最後一次匹配之後插入該block。
如果沒有匹配成功,那麼會在文件末尾處插入。
insertbefore:在匹配行前插入。使用正則表達式,在指定正則表達式的最後一次匹配之前插入該block。
如果沒有匹配成功,那麼會在文件末尾處插入。
marker:標記線模板。’{mark}’ 將被