3.2.1 運維自動化之ansible模塊

Ansible 原理

    使用者使用Ansible或Ansible-playbooks時,在服務器終端輸入Ansible的Ad-Hoc命令集或palybook後,Ansible會遵循預先編排的規則將Playbooks逐條拆解爲Play,再將paly組織成Ansible可識別的任務(Task),隨後調用任務涉及的所有模塊(modules)和插件(plugins),根據Inventory中定義的主機列表通過SSH將任務集以臨時文件或命令的形式傳輸到遠程客戶端執行並返回執行結果,如果是臨時文件,則執行完畢後自動刪除。

    Ansible命令執行來源:

USER(普通用戶)即SYSTEM ADMINISTRATOR
CMDB(配置管理數據庫)API 調用
PUBLIC/PRIVATE CLOUD API調用

USER-> AnsiblePlaybook -> Ansibile

Ansible 特性與構架

    特性

模塊化:調用特定的模塊,完成特定任務
有Paramiko,PyYAML,Jinja2(模板語言)三個關鍵模塊
支持自定義模塊
基於Python語言實現
部署簡單,基於python和SSH(默認已安裝),agentless
安全,基於OpenSSH
支持playbook編排任務
冪等性:一個任務執行1遍和執行n遍效果一樣,不因重複執行帶來意外情況
無需代理不依賴PKI(無需ssl)
可使用任何編程語言寫模塊
YAML格式,編排任務,支持豐富的數據結構
較強大的多層解決方案

    架構


ANSIBLE PLAYBOOKS:任務劇本(任務集),編排定義Ansible任務集的配置文件,由Ansible順序依次執行,通常是JSON格式的YML文件
INVENTORY:Ansible管理主機的清單/etc/anaible/hosts
MODULES:Ansible執行命令的功能模塊,多數爲內置核心模塊,也可自定義
PLUGINS:模塊功能的補充,如連接類型插件、循環插件、變量插件、過濾插件等,該功能不常用
API:供第三方程序調用的應用程序編程接口
ANSIBLE:組合INVENTORY、API、MODULES、PLUGINS的綠框,可以理解爲是ansible命令工具,其爲核心執行工具

Ansible 部署

    1、使用 yum 命令通過 epel 源安裝

[root@CentOS7 ~]#⮀yum install ansible

    2、使用 git 命令通過 github 安裝

確認安裝成功

[root@CentOS7 ~]# ansible --version
ansible 2.5.3
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Aug  4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]

查看 ansible 主程序

[root@CentOS7 ~]# ll /usr/bin/ansible
lrwxrwxrwx 1 root root 20 May 28 19:35 /usr/bin/ansible -> /usr/bin/ansible-2.7

    發現程序路徑是一個指向 /usr/bin/ansible-2.7 的軟連接,所以當安裝新版本的 ansible 時,或者需要回滾至舊版本,改變軟連接指向即可。

配置主機清單 /etc/ansible/hosts

[root@CentOS7 ~]#⮀cat /etc/ansible/hosts
# This is the default ansible 'hosts' file.
#
# It should live in /etc/ansible/hosts
#
#   - Comments begin with the '#' character
#   - Blank lines are ignored
#   - Groups of hosts are delimited by [header] elements
#   - You can enter hostnames or ip addresses
#   - A hostname/ip can be a member of multiple groups

# Ex 1: Ungrouped hosts, specify before any group headers.

## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10

# Ex 2: A collection of hosts belonging to the 'webservers' group

## [webservers]
## alpha.example.org
## beta.example.org
## 192.168.1.100
## 192.168.1.110

# If you have multiple hosts following a pattern you can specify
# them like this:

## www[001:006].example.com

# Ex 3: A collection of database servers in the 'dbservers' group

## [dbservers]
## 
## db01.intranet.mydomain.net
## db02.intranet.mydomain.net
## 10.25.1.56
## 10.25.1.57

# Here's another example of host ranges, this time there are no
# leading 0s:

## db-[99:101]-node.example.com

192.168.30.75    #添加控制主機
192.168.30.69

[group1]         #添加控制主機組
192.168.30.75
192.168.30.69

[group2]
192.168.30.75    #相同的主機可以同時出現在不同的主機組
192.168.30.174

[group]
192.168.30.69
192.168.30.174

[example]
www.jiangbowen.com:2222    #可以使用域名,也可以指定端口號,默認22
192.168.30.[1:100]         #支持範圍指定
db[a:z].jiangbowen.com

配置 ansible 主配置文件

    ansible 的主配置文件存放在 /etc/ansible/ansible.cfg,一般不需要修改,可能修改的

[defaults]

# some basic default values...

#inventory      = /etc/ansible/hosts                        #主機清單保存列表
#library        = /usr/share/my_modules/                    #庫文件保存目錄
#module_utils   = /usr/share/my_module_utils/               #模塊文件路徑
#remote_tmp     = ~/.ansible/tmp                            #遠程臨時文件存放目錄
#local_tmp      = ~/.ansible/tmp                            #本地臨時文件存放目錄
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml       #插件的配置文件
#forks          = 5                                         #併發執行個數
#poll_interval  = 15                                        #執行間隔
#sudo_user      = root                                      #sudo用戶
#ask_sudo_pass = True                                       #是否需要詢問sudo口令
#ask_pass      = True                                       #是否詢問用戶口令
#transport      = smart
#remote_port    = 22                                        #默認連接遠程端口
#module_lang    = C
#module_set_locale = False
host_key_checking = False                                  #是否檢查主機密鑰
log_path = /var/log/ansible.log                            #日誌記錄保存目錄

Ansible 使用

    ansible 命令

    語法:ansible 主機 [-m 模塊] [-a 指令] [選項]

[root@CentOS7 ~]# ansible all --list-hosts
  hosts (3):
    192.168.30.75
    192.168.30.69
    192.168.30.174     #沒有進行基於Key驗證
[root@CentOS7 ~]# ansible group1 --list-hosts
  hosts (2):
    192.168.30.75
    192.168.30.69
[root@CentOS7 ~]# ansible group2 --list-hosts
  hosts (2):
    192.168.30.75
    192.168.30.174
[root@CentOS7 ~]# ansible group3 --list-hosts
  hosts (2):
    192.168.30.69
    192.168.30.174

    選項

-v 詳細過程–vv-vvv更詳細
--list-hosts 顯示主機列表,可簡寫—list
-k, --ask-pass 提示連接密碼,默認Key驗證
-K, --ask-become-pass 提示輸入sudo
-C, --check 檢查,並不執行
-T, --timeout=TIMEOUT 執行命令的超時時間,默認10s
-u, --user=REMOTE_USER 執行遠程執行的用戶
-b, --become 代替舊版的sudo切換

    主機必須出現在主機清單中,可以是單個主機,指定多個臺主機時使用 , 隔開,也可以

使用 all 表示主機清單中的所有主機

[root@CentOS7 ~]# ansible group1 -m ping
192.168.30.69 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.30.75 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

使用通配符 * 表示

[root@CentOS7 ~]# ansible 192.168.30.* -m ping
192.168.30.174 | UNREACHABLE! => {     #此處報錯後面會解釋,此處只需要瞭解 * 確實可以使用
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n", 
    "unreachable": true
}
192.168.30.75 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.30.69 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

使用邏輯關係注意使用單引號將主機引起來

[root@CentOS7 ~]# ansible 'group1:group2' -m ping   #:表示邏輯或
192.168.30.174 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n", 
    "unreachable": true
}
192.168.30.69 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.30.75 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
[root@CentOS7 ~]# ansible 'group1:&group2' -m ping    #:&表示邏輯與
192.168.30.75 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
[root@CentOS7 ~]#⮀ansible 'group1:!group2' -m ping   #:!表示邏輯非
192.168.30.69 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

使用正則表達式

[root@CentOS7 ~]#⮀ansible 'group[1|2]' -m ping
192.168.30.174 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n", 
    "unreachable": true
}
192.168.30.69 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.30.75 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

    ansible 默認基於 Key 驗證,當目標主機沒用進行基於 Key 驗證時,需要使用 -k 選項輸入對應用戶的口令,但是隻能輸入一個口令,便會作用於所有需要輸入口令的主機。所以建議在使用 ansible 之前先進行基於 Key 的驗證。

[root@CentOS7 ~]# ansible all -m ping -k   #使用-k輸入用戶口令進行驗證
SSH password:           #輸入用戶口令
192.168.30.69 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.30.75 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.30.174 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

    ansible 常用模塊

command 模塊用於在遠程主機上執行命令。使用 ansible 命令時,默認使用 command 模塊。

[root@CentOS7 ~]# ansible group2 -m command -a 'systemctl start httpd.service'
192.168.30.174 | SUCCESS | rc=0 >>


192.168.30.75 | SUCCESS | rc=0 >>

     選項

chdir=:切換目錄後執行命令
creates=:當指定文件存在,則該命令不執行
removes=:當指定文件不存在,則該選項不執行

不支持使用管道,變量引用,重定向,邏輯判斷等操作符

[root@CentOS7 ~]# ansible group1 -m command -a 'echo "new line" >> /etc/fstab'
192.168.30.69 | SUCCESS | rc=0 >> 
new line >> /etc/fstab             #只是將echo後字符串打印出來而已,並沒有執行

192.168.30.75 | SUCCESS | rc=0 >>
new line >> /etc/fstab

shell 模塊會通過指定用戶的默認shell執行命令,所以支持管道,變量引用,重定向,邏輯判斷等操作符。

[root@CentOS7 ~]#⮀ansible group1 -m shell -a 'echo "new line" >> /etc/fstab'
192.168.30.69 | SUCCESS | rc=0 >>


192.168.30.75 | SUCCESS | rc=0 >>


[root@CentOS7 ~]#⮀ansible group1 -m shell -a 'cat /etc/fstab | grep "new line"'
192.168.30.69 | SUCCESS | rc=0 >>
new line

192.168.30.75 | SUCCESS | rc=0 >>
new line

     選項

chdir=:切換目錄後執行命令
creates=:當指定文件存在,則該命令不執行
removes=:當指定文件不存在,則該選項不執行

script 模塊能夠將主控端的腳本推送並運行在指定主機。

[root@CentOS7 ~]# ansible group1 -m script -a '/root/bin/9x9table.sh'   #對端主機並沒有此腳本,腳本執行後也並沒有保存此腳本
192.168.30.69 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 192.168.30.69 closed.\r\n", 
    "stdout": "1x1=1\t\r\n1x2=2\t2x2=4\t\r\n1x3=3\t2x3=6\t3x3=9\t\r\n1x4=4\t2x4=8\t3x4=12\t4x4=16\t\r\n1x5=5\t2x5=10\t3x5=15\t4x5=20\t5x5=25\t\r\n1x6=6\t2x6=12\t3x6=18\t4x6=24\t5x6=30\t6x6=36\t\r\n1x7=7\t2x7=14\t3x7=21\t4x7=28\t5x7=35\t6x7=42\t7x7=49\t\r\n1x8=8\t2x8=16\t3x8=24\t4x8=32\t5x8=40\t6x8=48\t7x8=56\t8x8=64\t\r\n1x9=9\t2x9=18\t3x9=27\t4x9=36\t5x9=45\t6x9=54\t7x9=63\t8x9=72\t9x9=81\t\r\n", 
    "stdout_lines": [
        "1x1=1\t", 
        "1x2=2\t2x2=4\t", 
        "1x3=3\t2x3=6\t3x3=9\t", 
        "1x4=4\t2x4=8\t3x4=12\t4x4=16\t", 
        "1x5=5\t2x5=10\t3x5=15\t4x5=20\t5x5=25\t", 
        "1x6=6\t2x6=12\t3x6=18\t4x6=24\t5x6=30\t6x6=36\t", 
        "1x7=7\t2x7=14\t3x7=21\t4x7=28\t5x7=35\t6x7=42\t7x7=49\t", 
        "1x8=8\t2x8=16\t3x8=24\t4x8=32\t5x8=40\t6x8=48\t7x8=56\t8x8=64\t", 
        "1x9=9\t2x9=18\t3x9=27\t4x9=36\t5x9=45\t6x9=54\t7x9=63\t8x9=72\t9x9=81\t"
    ]
}
192.168.30.75 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 192.168.30.75 closed.\r\n", 
    "stdout": "1x1=1\t\r\n1x2=2\t2x2=4\t\r\n1x3=3\t2x3=6\t3x3=9\t\r\n1x4=4\t2x4=8\t3x4=12\t4x4=16\t\r\n1x5=5\t2x5=10\t3x5=15\t4x5=20\t5x5=25\t\r\n1x6=6\t2x6=12\t3x6=18\t4x6=24\t5x6=30\t6x6=36\t\r\n1x7=7\t2x7=14\t3x7=21\t4x7=28\t5x7=35\t6x7=42\t7x7=49\t\r\n1x8=8\t2x8=16\t3x8=24\t4x8=32\t5x8=40\t6x8=48\t7x8=56\t8x8=64\t\r\n1x9=9\t2x9=18\t3x9=27\t4x9=36\t5x9=45\t6x9=54\t7x9=63\t8x9=72\t9x9=81\t\r\n", 
    "stdout_lines": [
        "1x1=1\t", 
        "1x2=2\t2x2=4\t", 
        "1x3=3\t2x3=6\t3x3=9\t", 
        "1x4=4\t2x4=8\t3x4=12\t4x4=16\t", 
        "1x5=5\t2x5=10\t3x5=15\t4x5=20\t5x5=25\t", 
        "1x6=6\t2x6=12\t3x6=18\t4x6=24\t5x6=30\t6x6=36\t", 
        "1x7=7\t2x7=14\t3x7=21\t4x7=28\t5x7=35\t6x7=42\t7x7=49\t", 
        "1x8=8\t2x8=16\t3x8=24\t4x8=32\t5x8=40\t6x8=48\t7x8=56\t8x8=64\t", 
        "1x9=9\t2x9=18\t3x9=27\t4x9=36\t5x9=45\t6x9=54\t7x9=63\t8x9=72\t9x9=81\t"
    ]
}

    選項

chdir=:切換目錄後執行命令
creates=:當指定文件存在,則該命令不執行
removes=:當指定文件不存在,則該選項不執行

當腳本需要讀取標準輸入時,腳本並不會正常運行。因爲腳本是在對端主機的後臺運行,而得不到標準輸入,便會一直等待下去,除非在腳本中設置超時時間。

[root@CentOS7 ~]# ansible group1 -m script -a '/root/bin/chessboard.sh'   
^C [ERROR]: User interrupted execution

root       2211  0.0  0.0 113180  1184 pts/1    S+   23:48   0:00 /bin/bash ~None/.ansible/tmp/ansible-tmp-1527580121.43-60904787174182/chessboard.sh

此時可以在 /root/~None/.ansible/tmp/ 查看命令的臨時文件

[root@CentOS7 tmp]#⮀tree
.
└── ansible-tmp-1527577052.42-180110633770421
    └── command.py

1 directory, 1 file

copy 模塊能夠實現從主控端向目標主機複製單個文件

[root@CentOS7 ~]# ansible group1 -m copy -a 'src=/etc/fstab dest=/data/secfstab owner=jiangbowen mode=644'    #將本機的/etc/fstab文件複製到目標主機上,並將所有者設爲jiangbowen用戶,權限設爲644
192.168.30.69 | SUCCESS => {
    "changed": true, 
    "checksum": "6fbb65e6bb62d7666d77297c188a46c9e215bb84", 
    "dest": "/data/secfstab", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "427fa130e12a6c41daafe68f78c886b1", 
    "mode": "0644", 
    "owner": "jiangbowen", 
    "size": 734, 
    "src": "~None/.ansible/tmp/ansible-tmp-1527581713.59-139108316398323/source", 
    "state": "file", 
    "uid": 500
}
192.168.30.75 | SUCCESS => {
    "changed": true, 
    "checksum": "6fbb65e6bb62d7666d77297c188a46c9e215bb84", 
    "dest": "/data/secfstab", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "427fa130e12a6c41daafe68f78c886b1", 
    "mode": "0644", 
    "owner": "jiangbowen", 
    "secontext": "system_u:object_r:default_t:s0", 
    "size": 734, 
    "src": "~None/.ansible/tmp/ansible-tmp-1527581713.58-232064196823164/source", 
    "state": "file", 
    "uid": 1000
}
[root@CentOS7 ~]#⮀ansible group1 -m copy -a 'src=/root/bin/9x9table.sh dest=/data/secfstab owner=jiangbowen mode=644 backup=yes'   #將本機的/etc/fstab文件複製到目標主機上,並將所有者設爲jiangbowen用戶,權限設爲644,同時在複製時,如果文件已存在同時備份原文件按
192.168.30.69 | SUCCESS => {
    "backup_file": "/data/secfstab.6192.2018-05-29@16:19:02~", 
    "changed": true, 
    "checksum": "8b1bd1f6a042036eeaa74f69df6a7f4183b31ee7", 
    "dest": "/data/secfstab", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "7be915baaec4daf296ad4765ed76b2ff", 
    "mode": "0644", 
    "owner": "jiangbowen", 
    "size": 455, 
    "src": "~None/.ansible/tmp/ansible-tmp-1527581943.02-122324632902056/source", 
    "state": "file", 
    "uid": 500
}
192.168.30.75 | SUCCESS => {
    "backup_file": "/data/secfstab.3478.2018-05-30@00:18:52~", 
    "changed": true, 
    "checksum": "8b1bd1f6a042036eeaa74f69df6a7f4183b31ee7", 
    "dest": "/data/secfstab", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "7be915baaec4daf296ad4765ed76b2ff", 
    "mode": "0644", 
    "owner": "jiangbowen", 
    "secontext": "system_u:object_r:default_t:s0", 
    "size": 455, 
    "src": "~None/.ansible/tmp/ansible-tmp-1527581943.02-121032871897130/source", 
    "state": "file", 
    "uid": 1000
}
[root@CentOS7 ~]#⮀ansible group1 -m shell -a 'll /data/secfstab*'   #使用ll別名查看文件,發現shell並不支持別名
192.168.30.69 | FAILED | rc=127 >>
/bin/sh: ll: command not foundnon-zero return code


192.168.30.75 | FAILED | rc=127 >>
/bin/sh: ll: command not foundnon-zero return code


[root@CentOS7 ~]#⮀ansible group1 -m shell -a 'ls -l /data/secfstab*'   #使用ls -l查看文件
192.168.30.69 | SUCCESS | rc=0 >>
-rw-r--r-- 1 jiangbowen root 455 May 29 16:19 /data/secfstab
-rw-r--r-- 1 jiangbowen root 734 May 29 16:15 /data/secfstab.6192.2018-05-29@16:19:02~


192.168.30.75 | SUCCESS | rc=0 >>
-rw-r--r--. 1 jiangbowen root 455 May 30 00:18 /data/secfstab
-rw-r--r--. 1 jiangbowen root 734 May 30 00:15 /data/secfstab.3478.2018-05-30@00:18:52~

    選項

backup:在覆蓋之前,將源文件備份,備份文件包含時間信息。有兩個選項:yes|no
content:用於替代“src”,可以直接設定指定文件的值
dest:必選項。要將源文件複製到的遠程主機的絕對路徑,如果源文件是一個目錄,那麼該路徑也必須是個目錄
directory_mode:遞歸設定目錄的權限,默認爲系統默認權限
force:如果目標主機包含該文件,但內容不同,如果設置爲yes,則強制覆蓋,如果爲no,則只有當目標主機的目標位置不存在該文件時,才複製。默認爲yes
follow:當複製的文件夾內有鏈接存在的時候,會保留鏈接進行復制
src:被複制到遠程主機的本地文件,可以是絕對路徑,也可以是相對路徑。如果路徑是一個目錄,它將遞歸複製。在這種情況下,如果路徑使用“/”來結尾,則只複製目錄裏的內容,如果沒有使用“/”來結尾,則包含目錄在內的整個內容全部複製。
group:指定複製到對端的所屬組
mode:指定複製到對端的所屬組,類似於chmod
owner:指定複製到對端的所屬者

注意:shell 和 command 模塊不支持使用別名,同時 CentOS7 中 PATH 變量也會改變

[root@CentOS7 ~]#⮀ansible group1 -m shell -a 'alias'   #使用alias查看對端主機的別名爲空
192.168.30.69 | SUCCESS | rc=0 >>


192.168.30.75 | SUCCESS | rc=0 >>


[root@CentOS7 ~]#⮀ansible group1 -m shell -a 'echo $PATH'  #查看對端主機的PATH變量,CentOS7沒有/root/bin路徑
192.168.30.69 | SUCCESS | rc=0 >>
/app/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

192.168.30.75 | SUCCESS | rc=0 >>
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bins

也可以利用內容,在對端主機上直接生成文件

[root@CentOS7 ~]#⮀ansible group1 -m copy -a 'content="CentOS\nLinux\ntest" dest=/data/test.txt'   #將指定內容直接創建在對端的/data/test.txt中
192.168.30.69 | SUCCESS => {
    "changed": true, 
    "checksum": "0f7fd4a4cccdbf903bdb895e22abfa4d594ca2b6", 
    "dest": "/data/test.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "d244d5f01cc6ae8f6dbd6e478f4aa43e", 
    "mode": "0644", 
    "owner": "root", 
    "size": 17, 
    "src": "~None/.ansible/tmp/ansible-tmp-1527582726.73-72421110990483/source", 
    "state": "file", 
    "uid": 0
}
192.168.30.75 | SUCCESS => {
    "changed": true, 
    "checksum": "0f7fd4a4cccdbf903bdb895e22abfa4d594ca2b6", 
    "dest": "/data/test.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "d244d5f01cc6ae8f6dbd6e478f4aa43e", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "system_u:object_r:default_t:s0", 
    "size": 17, 
    "src": "~None/.ansible/tmp/ansible-tmp-1527582726.71-83329890814862/source", 
    "state": "file", 
    "uid": 0
}
[root@CentOS7 ~]#⮀ansible group1 -m shell -a 'cat /data/test.txt'   #查看對端主機的/data/test.txt文件
192.168.30.69 | SUCCESS | rc=0 >>
CentOS
Linux
test

192.168.30.75 | SUCCESS | rc=0 >>
CentOS
Linux
test

fetch 模塊用於將對端主機的文件拉取到主控端。

[root@CentOS7 fetch_test]# ansible group2 -m fetch -a 'src=/etc/fstab dest=/data/fetch_test'
192.168.30.174 | SUCCESS => {
    "changed": true, 
    "checksum": "2b1777d51b0d5a8ca780204e76d8cbfbe1841856", 
    "dest": "/data/fetch_test/192.168.30.174/etc/fstab", 
    "md5sum": "020f628f8334bd9b8c3d3bd7f70307ad", 
    "remote_checksum": "2b1777d51b0d5a8ca780204e76d8cbfbe1841856", 
    "remote_md5sum": null
}
192.168.30.75 | SUCCESS => {
    "changed": true, 
    "checksum": "cfafdc9012666a8e6e02dd5edb67dafc6ba4d181", 
    "dest": "/data/fetch_test/192.168.30.75/etc/fstab", 
    "md5sum": "f5fbd1248d0b8c3e1b7003897a3d8d84", 
    "remote_checksum": "cfafdc9012666a8e6e02dd5edb67dafc6ba4d181", 
    "remote_md5sum": null
}
[root@CentOS7 fetch_test]# tree   #當拉取多個主機上文件時,默認會將不同主機文件保存在各自的目錄下,沒有此目錄則會創建
.
├── 192.168.30.174
│   └── etc
│       └── fstab
└── 192.168.30.75
    └── etc
        └── fstab

4 directories, 2 files

    選項

src:必選項。要拉取到本機的遠程主機文件
dest:本機保存路徑
flat:默認爲no,當爲 yes 時,將不會保存路徑信息

[root@CentOS7 fetch_test]# ansible 192.168.30.75 -m fetch -a  'src=/etc/fstab dest=/data/fetch_test/test'
192.168.30.75 | SUCCESS => {
    "changed": true, 
    "checksum": "cfafdc9012666a8e6e02dd5edb67dafc6ba4d181", 
    "dest": "/data/fetch_test/test/192.168.30.75/etc/fstab", 
    "md5sum": "f5fbd1248d0b8c3e1b7003897a3d8d84", 
    "remote_checksum": "cfafdc9012666a8e6e02dd5edb67dafc6ba4d181", 
    "remote_md5sum": null
}
[root@CentOS7 fetch_test]# tree   #拉取文件時並能不保存並改名,當指定一個不存在的路徑時,則會創建爲目錄
.
└── test
    └── 192.168.30.75
        └── etc
            └── fstab

3 directories, 1 file
[root@CentOS7 fetch_test]# ansible 192.168.30.75 -m fetch -a  'flat=yes src=/etc/fstab dest=/data/fetch_test/test'
192.168.30.75 | SUCCESS => {
    "changed": true, 
    "checksum": "cfafdc9012666a8e6e02dd5edb67dafc6ba4d181", 
    "dest": "/data/fetch_test/test", 
    "md5sum": "f5fbd1248d0b8c3e1b7003897a3d8d84", 
    "remote_checksum": "cfafdc9012666a8e6e02dd5edb67dafc6ba4d181", 
    "remote_md5sum": null
}
[root@CentOS7 fetch_test]# tree    #當flat=yes時,拉取文件時並不保留原路徑
.
└── test

0 directories, 1 file

cron 模塊用於創建計劃任務。

[root@CentOS7 fetch_test]#⮀ansible all  -m cron -a 'minute=5 weekday=2,4,6 user=jiangbowen job="/usr/bin/wall CentOS!" name=Linux'
192.168.30.69 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "Linux"
    ]
}
192.168.30.174 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "Linux"
    ]
}
192.168.30.75 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "Linux"
    ]
}

切換到 jiangbowen 用戶,使用 cron -e 查看創建出的計劃任務文件

#Ansible: Linux
5 * * * 2,4,6 /usr/bin/wall CentOS!    

    選項

minute:分鐘    hour:小時    day:天    month:月    weekday:星期
reboot:當下次開機時  yearly:每年  monthly:每月  weekly:每週  ...
name:計劃任務的描述信息,同名的計劃任務將會被後創建覆蓋
disable:設爲 yes 爲禁用指定計劃任務
job:執行的操作
state:設爲 absent 爲刪除指定計劃任務,present 爲創建計劃任務,缺省爲 present
cron_file:指定計劃任務文件名,計劃任務將創建在 cron.d 目錄下,再次創建同名的計劃任務文件會覆蓋掉原有的計劃任務,且無視 backup 選項,在創建時要指定user

user:以指定用戶身份創建計劃任務

[root@CentOS7 fetch_test]# ansible all  -m cron -a 'state=absent user=jiangbowen name=Linux'  #刪除計劃任務時,需要指定name,當不是默認用戶時,還需要指定用戶
192.168.30.69 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": []
}
192.168.30.174 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": []
}
192.168.30.75 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": []
}
[root@CentOS7 fetch_test]# ansible all  -m cron -a 'state=absent user=root cron_file=MyCron'   #刪除計劃任務文件時,需要指定文件名與用戶,
192.168.30.69 | SUCCESS => {   
    "changed": true, 
    "cron_file": "MyCron", 
    "state": "absent"
}
192.168.30.174 | SUCCESS => {
    "changed": true, 
    "cron_file": "MyCron", 
    "state": "absent"
}
192.168.30.75 | SUCCESS => {
    "changed": true, 
    "cron_file": "MyCron", 
    "state": "absent"
}

file 模塊可以管理文件的屬性

[root@CentOS7 ~]# ansible group1 -m file -a 'state=absent dest=/data/secfstab'
192.168.30.69 | SUCCESS => {
    "changed": true, 
    "path": "/data/secfstab", 
    "state": "absent"
}
192.168.30.75 | SUCCESS => {
    "changed": true, 
    "path": "/data/secfstab", 
    "state": "absent"
}

    選項

state:修改文件狀態
    directory:創建目錄,支持多級創建
    file:判斷文件存在性
    link:創建軟鏈接
    hard:創建硬鏈接接
    absent:刪除文件,如果是目錄將會被遞歸刪除
    touch:創建文件,如果文件已經存在,將修改時間戳
dest:目標文件或目錄的路徑和名稱
src:指定鏈接文件的源文件
mode:設置文件權限
owner:設置文件的屬主信息
group:設置文件的屬組信息

force:強制創建鏈接文件,即使源文件不存在,如果鏈接文件已存在,便覆蓋state:修改文件狀態

[root@CentOS7 ~]# ansible all -m file -a 'force=yes state=link src=/data/NewFile dest=/data/LinkFile'    #192.168.30.174主機中沒有/data/NewFile文件
192.168.30.69 | SUCCESS => {
    "changed": true, 
    "dest": "/data/LinkFile", 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "size": 13, 
    "src": "/data/NewFile", 
    "state": "link", 
    "uid": 0
}
 [WARNING]: Cannot set fs attributes on a non-existent symlink target. follow should be set to False to avoid this.
#提示沒有源文件,但是制定了force選項,還是創建了指向不存在文件的鏈接文件
192.168.30.174 | SUCCESS => {
    "changed": true, 
    "dest": "/data/LinkFile", 
    "src": "/data/NewFile", 
    "state": "absent"
}
192.168.30.75 | SUCCESS => {
    "changed": true, 
    "dest": "/data/LinkFile", 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:etc_runtime_t:s0", 
    "size": 13, 
    "src": "/data/NewFile", 
    "state": "link", 
    "uid": 0
}
[root@CentOS7 ~]# ansible all -m shell -a 'ls -l /data/LinkFile'
192.168.30.69 | SUCCESS | rc=0 >>
lrwxrwxrwx 1 root root 13 May 30 20:04 /data/LinkFile -> /data/NewFile

192.168.30.174 | SUCCESS | rc=0 >>
lrwxrwxrwx 1 root root 13 May 30 08:04 /data/LinkFile -> /data/NewFile   #/data/NewFile文件不存在

192.168.30.75 | SUCCESS | rc=0 >>
lrwxrwxrwx. 1 root root 13 May 31 04:04 /data/LinkFile -> /data/NewFileh

hostname 模塊用於管理對端主機名。

[root@CentOS7 ~]#⮀ansible 192.168.30.174 -m hostname -a 'name=NewName'
192.168.30.174 | SUCCESS => {
    "ansible_facts": {
        "ansible_domain": "", 
        "ansible_fqdn": "NewName", 
        "ansible_hostname": "NewName", 
        "ansible_nodename": "NewName"
    }, 
    "changed": true, 
    "name": "NewName"
}

yum 模塊能夠管理軟件包。

[root@CentOS7 ~]#⮀ansible 192.168.30.174 -m yum -a 'name=bind state=installed'
192.168.30.174 | SUCCESS => {
    "changed": true, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "Loaded plugins: fastestmirror, langpacks\nLoading mirror speeds from cached hostfile\nResolving Dependencies\n--> Running transaction check\n---> Package bind.x86_64 32:9.9.4-50.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package      Arch           Version                  Repository           Size\n================================================================================\nInstalling:\n bind         x86_64         32:9.9.4-50.el7          development         1.8 M\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 1.8 M\nInstalled size: 4.3 M\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : 32:bind-9.9.4-50.el7.x86_64                                  1/1 \n  Verifying  : 32:bind-9.9.4-50.el7.x86_64                                  1/1 \n\nInstalled:\n  bind.x86_64 32:9.9.4-50.el7                                                   \n\nComplete!\n"
    ]
}

    選項

disablerepo:禁用某個 yum 源
enblerepo:啓用某個 yum 源
name:軟件包名
state:installed 爲安裝,removed 爲卸載
lsit:顯示"installed","updates","available'"和"repos"中的包

service 模塊能夠管理服務。

[root@CentOS7 ~]# ansible group1 -m service -a 'name=httpd state=started'
192.168.30.75 | SUCCESS => {
    "changed": true, 
    "name": "httpd", 
    "state": "started", 
    "status": {
        "ActiveEnterTimestampMonotonic": "0", 
        "ActiveExitTimestampMonotonic": "0", 
        "ActiveState": "inactive", 
        "After": "systemd-journald.socket system.slice remote-fs.target basic.target network.target tmp.mount -.mount nss-lookup.target", 
        "AllowIsolate": "no", 
        ...
    }
}
192.168.30.69 | SUCCESS => {
    "changed": true, 
    "name": "httpd", 
    "state": "started"
}

    選項

enabled:開機是否啓動
name:服務名
runleval:指定運行級別
sleep:在重啓服務時,啓動前會等待指定時間
state:
    started:啓動
    stopped:停止
    restarted:重啓
    reloaded:重載

user 模塊用於管理用戶的信息。

[root@CentOS7 ~]# ansible 192.168.30.174 -m user -a 'name=TestUser group=jiangbowen comment="test user" system=yes'
192.168.30.174 | SUCCESS => {
    "changed": true, 
    "comment": "test user", 
    "create_home": true, 
    "group": 1000, 
    "home": "/home/TestUser", 
    "name": "TestUser", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": true, 
    "uid": 996
}

    選項

name:用戶名
state:缺省 present 爲添加用戶,absent 爲刪除用戶
system:是否創建爲系統用戶
home:指定家目錄
creathome:是否創建家目錄
uid:指定 UID
group:指定用戶組
password:此選項會將明文密碼存入 /etc/shadow 文件中,但是在登陸時會將輸入的密碼加密後與文件中的密碼比對,所以在設置密碼時需要使用 openssl passwd -1 "密碼" 命令生成密文後再使用 ansible 設置密碼。

[root@CentOS7 ~]# ansible 192.168.30.174 -m user -a 'name=TestUser password=centos'
192.168.30.174 | SUCCESS => {
    "append": false, 
    "changed": true, 
    "comment": "test user", 
    "group": 1000, 
    "home": "/home/TestUser", 
    "move_home": false, 
    "name": "TestUser", 
    "password": "NOT_LOGGING_PASSWORD", 
    "shell": "/bin/bash", 
    "state": "present", 
    "uid": 996
}
[root@CentOS7 ~]# ansible 192.168.30.174 -m shell -a 'getent shadow TestUser'
192.168.30.174 | SUCCESS | rc=0 >>
TestUser:centos:17681::::::   #密碼爲明文,會導致登陸密碼錯誤

group 模塊可以管理用戶組。

[root@CentOS7 ~]# ansible 192.168.30.174 -m group -a 'name=TestUser gid=1111'
192.168.30.174 | SUCCESS => {
    "changed": true, 
    "gid": 1111, 
    "name": "TestUser", 
    "state": "present", 
    "system": false
}
[root@CentOS7 ~]# ansible 192.168.30.174 -m shell -a 'getent group TestUser'
192.168.30.174 | SUCCESS | rc=0 >>
TestUser:x:1111:x

    選項

name:用戶名
state:缺省 present 爲添加組,absent 爲刪除組
system:是否創建爲系統組
gid:指定 GID

mount 模塊用於掛載文件

[root@CentOS7 ~]#⮀ansible 192.168.30.75 -m mount -a 'src=/dev/sr0 path=/mnt/cdrom state=mounted fstype=iso9660'
192.168.30.75 | SUCCESS => {         #必須指定文件系統
    "changed": true, 
    "dump": "0", 
    "fstab": "/etc/fstab", 
    "fstype": "iso9660", 
    "name": "/mnt/cdrom", 
    "opts": "defaults", 
    "passno": "0", 
    "src": "/dev/sr0"
}
[root@CentOS7 ~]#⮀ansible 192.168.30.75 -m shell -a 'cat /etc/fstab'
192.168.30.75 | SUCCESS | rc=0 >>

#
# /etc/fstab
# Created by anaconda on Wed May 23 01:10:20 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=8a963d68-4561-4fe2-9479-47ed2421ab9d /                       xfs     defaults        0 0
UUID=04af341f-9ac3-4da3-9298-71759aff9e41 /boot                   xfs     defaults        0 0
UUID=ec1cbe64-cf82-4d3b-aee5-d321f9500f8e /data                   xfs     defaults        0 0
UUID=d5eb5f25-9563-4a26-bac2-cadde7466cbf swap                    swap    defaults        0 0
/dev/sr0 /mnt/cdrom iso9660 defaults 0 0

[root@CentOS7 ~]#⮀ansible 192.168.30.75 -m shell -a 'df'
192.168.30.75 | SUCCESS | rc=0 >>
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda2       52403200 3630368  48772832   7% /
devtmpfs          748312       0    748312   0% /dev
tmpfs             764204       0    764204   0% /dev/shm
tmpfs             764204   10220    753984   2% /run
tmpfs             764204       0    764204   0% /sys/fs/cgroup
/dev/sda3       20961280  245792  20715488   2% /data
/dev/sda1        1038336  157936    880400  16% /boot
tmpfs             152844       0    152844   0% /run/user/0
/dev/sr0         9176232 9176232         0 100% /mnt/cdrom   #掛載成功

    選項

src:要掛載的設備

path:掛載路徑

state:

    present:在 /etc/fstab 文件中添加掛載信息

    absent:在 /etc/fstab 中刪除掛載信息並卸載設備

    mounted:在 /etc/fstab 文件中添加掛載信息後再掛載設備

    unmounted:卸載指定路徑掛載設備

fstype:指定文件系統類型





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章