Ansible Ad-Hoc與常用模塊

来源:https://www.cnblogs.com/zhanglianghhh/archive/2020/03/19/12525566.html
-Advertisement-
Play Games

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}’ 將被

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 聚焦於 Xamarin 的 NET Conf 是一項免費的為期一天的直播活動,來自社區和.NET產品團隊的演講者正在使用Xamarin技術構建本機移動應用程式!Xamarin允許您使用C#(而不是Java和Swift)為Android和iOS構建本機移動應用程式。3月23日(星期一)下午8:00(太 ...
  • MurmurHash 是一種非加密型哈希演算法,適用於一般的哈希檢索操作,具有高性能、低碰撞率的特點。由 Google 的工程師 Austin Appleby 於2008年創建。MurmurHash 與其它流行的哈希函數相比,對於規律性較強的 Key,其隨機分佈特征表現的更好。非加密意味著著相對 MD ...
  • 問題:vm9里切換主機usb埠提示設備正在被使用,虛擬機里沒法使用主機usb設備,開始趟坑之旅。 1.說是vm里安裝usb3.0驅動。然而虛擬機幹啥啥不行,先win7更新sp1,再安裝KB2533623補丁,下載usb3.0驅動http://www.vmware.com/go/dl_intel_u ...
  • Magicodes.IE Excel圖片導入導出 為了更好的根據實際功能來迭代,從2.2的里程碑規劃開始,我們將結合社區的建議和意見來進行迭代,您可以點此鏈接來提交您的意見和建議: https://github.com/dotnetcore/Magicodes.IE/issues/46 說明 本章教 ...
  • 原文鏈接: "https://xiaoheidiannao.com/articles/Explorer Address Bar.html" 更多電腦使用技巧可以訪問: "https://xiaoheidiannao.com" 查看哦! 大家都知道 "文件管理器" 中的 "地址欄" 是用來顯示和打開 ...
  • 1. 從電腦如何工作開始 首先讓程式進入記憶體 重定位:修改程式中的地址(是相對地址) 程式載入後還需要移動 重定位的最合適時機 運行時重定位 首先在記憶體中找一段空閑的記憶體,然後把這段空閑記憶體的地址找到例如起始地址1000,然後把這個1000賦給PCB,因為創建了進程自然就有了PCB,這個起始地址就 ...
  • 常用用戶管理命令useradd命令名稱:useradd命令所在路徑:/usr/sbin/useradd執行許可權:root功能描述:添加新用戶選項與參數:useradd [-u UID] [-g 初始用戶組] [-G 次要用戶組] [-mM] [-c 說明欄] [-d 家目錄絕對路徑] [-s she... ...
  • 一 secret概述1.1 secret作用Secret對象,主要作用是保管私密數據,比如密碼、OAuth Tokens、SSH Keys等信息。將這些私密信息放在Secret對象中比直接放在Pod或Docker Image中更安全,也更便於使用和分發。二 secret使用2.1 secret創建[ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...