ansible——自動化運維工具

目錄

ansible 簡介
ansible 是什麼?
ansible 特點
ansible 架構圖
ansible 任務執行
ansible 任務執行模式
ansible 執行流程
ansible 命令執行過程
ansible 配置詳解
ansible 安裝方式
使用 yum 安裝
本地yum倉庫安裝方式:
ansible 程序結構
ansible配置文件查找順序
ansible配置文件
ansuble主機清單
ansible 配置公私鑰
ansible 常用命令
ansible 命令詳解
ansible-doc 命令
ansible 常用模塊
1)主機連通性測試
2)command 模塊
3)shell 模塊
4)copy 模塊
5)file 模塊
6)fetch 模塊
7)cron 模塊
8)yum 模塊
9)service 模塊
10)user 模塊
11)group 模塊
12)script 模塊
13)setup 模塊

ansible 簡介

ansible 是什麼?
  ansible是新出現的自動化運維工具,基於Python開發,集合了衆多運維工具(puppet、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。
  ansible是基於 paramiko 開發的,並且基於模塊化工作,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。ansible不需要在遠程主機上安裝client/agents,因爲它們是基於ssh來和遠
程主機通訊的。ansible目前已經已經被紅帽官方收購,是自動化運維工具中大家認可度最高的,並且上手容易,學習簡單。是每位運維工程師必須掌握的技能之一。
ansible 特點
1.部署簡單,只需在主控端部署Ansible環境,被控端無需做任何操作;
2.默認使用SSH協議對設備進行管理;
3.有大量常規運維操作模塊,可實現日常絕大部分操作;
4.配置簡單、功能強大、擴展性強;
5.支持API及自定義模塊,可通過Python輕鬆擴展;
6.通過Playbooks來定製強大的配置、狀態管理;
7.輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可;
8.提供一個功能強大、操作性強的Web管理界面和REST API接口——AWX平臺。

ansible 架構圖在這裏插入圖片描述

上圖中我們看到的主要模塊如下:

Ansible:Ansible核心程序。
HostInventory:記錄由Ansible管理的主機信息,包括端口、密碼、ip等。
Playbooks:“劇本”YAML格式文件,多個任務定義在一個文件中,定義主機需要調用哪些模塊來完成的功能。
CoreModules:核心模塊,主要操作是通過調用核心模塊來完成管理任務。
CustomModules:自定義模塊,完成核心模塊無法完成的功能,支持多種語言。
ConnectionPlugins:連接插件,Ansible和Host通信使用

ansible 任務執行

ansible 任務執行模式
 Ansible 系統由控制主機對被管節點的操作方式可分爲兩類,即adhoc和playbook:

ad-hoc模式(點對點模式)
  使用單個模塊,支持批量執行單條命令。ad-hoc 命令是一種可以快速輸入的命令,而且不需要保存起來的命令。就相當於bash中的一句話shell。
playbook模式(劇本模式)
  是Ansible主要管理方式,也是Ansible功能強大的關鍵所在。playbook通過多個task集合完成一類功能,如Web服務的安裝部署、數據庫服務器的批量備份等。可以簡單地把playbook理解爲通過組合多條ad-hoc操作的配置文件。
ansible 執行流程
 簡單理解就是Ansible在運行時, 首先讀取ansible.cfg中的配置, 根據規則獲取Inventory中的管理主機列表, 並行的在這些主機中執行配置的任務, 最後等待執行返回的結果。
ansible 命令執行過程
在這裏插入圖片描述
1.加載自己的配置文件,默認/etc/ansible/ansible.cfg;
2.查找對應的主機配置文件,找到要執行的主機或者組;
3.加載自己對應的模塊文件,如 command;
4.通過ansible將模塊或命令生成對應的臨時py文件(python腳本), 並將該文件傳輸至遠程服務器;
5.對應執行用戶的家目錄的.ansible/tmp/XXX/XXX.PY文件;
6.給文件 +x 執行權限;
7.執行並返回結果;
8.刪除臨時py文件,sleep 0退出;

ansible 配置詳解

ansible 安裝方式
 ansible安裝常用兩種方式,yum安裝、本地yum倉庫安裝方式
1、採用互聯網yum倉庫的安裝方式:

[root@ansible ~]# yum install epel-release -y        #清除yum緩存
[root@ansible ~]# yum -y install ansible             #安裝Ansible
[root@ansible ~]# ansible --version                  #可以查看到此信息,說明安裝成功
ansible 2.4.2.0
  config file = /etc/ansible/ansible.cfg
         .............................

2.本地yum倉庫安裝方式:
本地yum倉庫安裝,請下載我提供的本地yum倉庫,提取碼:h2bu

[root@ansible yum.repos.d]# mount /dev/cdrom /media         #掛載我提供的ISO文件
mount: /dev/sr0 寫保護,將以只讀方式掛載
[root@ansible yum.repos.d]# cat /etc/yum.repos.d/a.repo       
#刪除或移動原有yum配置文件,並編寫本地yum文件:
[fd]
baseurl=file:///media
gpgcheck=0
[root@ansible yum.repos.d]# yum clean all          #清除yum緩存
[[email protected]]# yum -y install ansible             #安裝Ansible
[root@ansible yum.repos.d]# ansible --version              #可以查看到此信息,說明安裝成功
ansible 2.3.1.0
  config file = /etc/ansible/ansible.cfg
           .....................

ansible 程序結構
通過使用rpm -ql ansible指令可以查看ansible安裝的所有文件位置!
安裝目錄如下(yum安裝):
  配置文件目錄:/etc/ansible/
  執行文件目錄:/usr/bin/
  Lib庫依賴目錄:/usr/lib/pythonX.X/site-packages/ansible/
  Help文檔目錄:/usr/share/doc/ansible-X.X.X/
  Man文檔目錄:/usr/share/man/man1/
ansible配置文件查找順序
 ansible與我們其他的服務在這一點上有很大不同,這裏的配置文件查找是從多個地方找的,順序如下:

1.檢查環境變量ANSIBLE_CONFIG指向的路徑文件(export ANSIBLE_CONFIG=/etc/ansible.cfg);
2.~/.ansible.cfg,檢查當前目錄下的ansible.cfg配置文件;
3./etc/ansible.cfg檢查etc目錄的配置文件。
ansible配置文件
ansible 的配置文件爲/etc/ansible/ansible.cfg,ansible 有許多參數,下面我們列出一些常見的參數:
1.inventory = /etc/ansible/hosts #這個參數表示資源清單inventory文件的位置

2.library = /usr/share/ansible #指向存放Ansible模塊的目錄,支持多個目錄方式,只要用冒號(:)隔開就可以

3.forks = 5 #併發連接數,默認爲5

4.sudo_user = root #設置默認執行命令的用戶

5.remote_port = 22 #指定連接被管節點的管理端口,默認爲22端口,建議修改,能夠更加安全

6.host_key_checking = False #設置是否檢查SSH主機的密鑰,值爲True/False。關閉後第一次連接不會提示配置實例

7.timeout = 60 #設置SSH連接的超時時間,單位爲秒

8.log_path = /var/log/ansible.log #指定一個存儲ansible日誌的文件(默認不記錄日誌)
ansuble主機清單
 在配置文件中,我們提到了資源清單,這個清單就是我們的主機清單,裏面保存的是一些 ansible 需要連接管理的主機列表。我們可以來看看他的定義方式:
ansible主機清單設置
編輯/etc/ansible/hosts:

[root@CentOS7-master ~]# vim /etc/ansible/hosts  #定義方式:

###1、直接指明主機地址或主機名:
green.example.com
blue.example.com
192.168.100.1
92.168.100.10


###2、定義一個主機組[組名]把地址或主機名加進去
[webservers]
 192.168.1.100
 192.168.1.110

#組成員可以使用通配符來匹配,如下 192.168.1.[1:6] #表示匹配從192.168.1.1——192.168.1.6的主機

ansible配置公私鑰

配置ansible使用公鑰驗證
配置這個的原因是爲了方便ansible可以實現無祕訪問控制其他機器,是實現自動化的前提。這一步可以再配置好ansible.cfg文件以及hosts主機清單後執行。
1、首先生成祕鑰

1.##執行下條指令後一路回車即可!
2.[root@CentOS7-master ~]# ssh-keygen -t rsa

2、然後向主機分發祕鑰:

1.##所有添加到主機清單中的IP地址或者主機名,全部都要用下條指令執行一遍。
2.[root@CentOS7-master ~]# ssh-copy-id root@主機名或IP地址

3、如果出現以下情況:

1.ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
2.-bash: ssh-copy-id: command not found

3.#請嘗試:
4.yum -y install openssh-clientsansible

ansible常用命令

ansible命令集

/usr/bin/ansible    # Ansibe AD-Hoc 臨時命令執行工具,常用於臨時命令的執行

/usr/bin/ansible-doc    # ansible 模塊功能查看工具

/usr/bin/ansible-galaxy     # 下載/上傳優秀代碼或Roles模塊 的官網平臺,基於網絡的

/usr/bin/ansible-playbook   # ansible 定製自動化的任務集編排工具

/usr/bin/ansible-pull # ansible遠程執行命令的工具,拉取配置而非推送配置(使用較少,海量機器時使用,對運維的架構能力要求較高)

/usr/bin/ansible-vault # ansible 文件加密工具

/usr/bin/ansible-console # ansible基於Linux Consoble界面可與用戶交互的命令執行工具

ansible命令詳解

###命令格式:
ansible <host-pattern> [-f forks] [-m module_name] [-a args]

###我們可以通過 ansible -h查看幫助
###本段中所有以“**”開頭的參數,均表示是重要的
[root@CentOS7-master ~]# ansible -h
Usage: ansible <host-pattern> [options] Options:

** -a MODULE_ARGS, --args=MODULE_ARGS
模塊的參數,如果執行默認COMMAND的模塊,即是命令參數,如:“date”,“pwd”等等 module arguments 模塊參數

-k, --ask-pass 
    ask for SSH password 登錄密碼,提示輸入SSH密碼而不是假設基於密鑰的驗證

--ask-su-pass 
    ask for su password su切換密碼

-K, --ask-sudo-pass 
    ask for sudo password 提示密碼使用sudo,sudo表示提權操作

--ask-vault-pass 
    ask for vault password

-B SECONDS, --background=SECONDS 
    run asynchronously, failing after X seconds (default=N/A)後臺運行超時時間

** -C, --check
    don‘t make any changes; instead, try to predict some of the changes that may occur #只是測試一下會改變什麼內容,不會真正去執行;相反,試圖預測一些可能發生的變化

-c CONNECTION, --connection=CONNECTION 
    connection type to use (default=smart) #連接類型使用

** -f FORKS, --forks=FORKS
    specify number of parallel processes to use (default=5) #並行任務數。NUM被指定爲一個整數,默認是5 

-h, --help 
    show this help message and exit 打開幫助文檔API

** -i INVENTORY, --inventory-file=INVENTORY
    specify inventory host file (default=/etc/ansible/hosts) #指定庫存主機文件的路徑,默認爲/etc/ansible/hosts

** --list-hosts
    outputs a list of matching hosts; does not execute anything else

** -m MODULE_NAME, --module-name=MODULE_NAME
    module name to execute (default=command) #執行模塊的名字,默認使用 command 模塊,所以如果是隻執行單一命令可以不用 -m參數

-M MODULE_PATH, --module-path=MODULE_PATH   
    specify path(s) to module library (default=/usr/share/ansible/) #要執行的模塊的路徑,默認爲/usr/share/ansible/

-o, --one-line 
    condense output #壓縮輸出,摘要輸出.嘗試一切都在一行上輸出。

-P POLL_INTERVAL, --poll=POLL_INTERVAL  
    set the poll interval if using -B (default=15) #調查背景工作每隔數秒。需要- b

--private-key=PRIVATE_KEY_FILE 
    use this file to authenticate the connection #私鑰路徑,使用這個文件來驗證連接

** -S, --su
    run operations with su #用 su 命令

** -R SU_USER, --su-user=SU_USER
    run operations with su as this user (default=root) #指定SU的用戶,默認是root用戶

** -s, --sudo
    run operations with sudo (nopasswd)

** -U SUDO_USER, --sudo-user=SUDO_USER
    desired sudo user (default=root)(deprecated, use become) #sudo到哪個用戶,默認爲 root

** -T TIMEOUT, --timeout=TIMEOUT
    override the SSH timeout in seconds (default=10) #指定SSH默認超時時間, 默認是10S

-t TREE, --tree=TREE 
    log output to this directory #將日誌內容保存在該輸出目錄,結果保存在一個文件中在每臺主機上。

** -u REMOTE_USER, --user=REMOTE_USER
    connect as this user (default=root) #遠程用戶, 默認是root用戶 

--vault-password-file=VAULT_PASSWORD_FILE 
    vault password file

** -v, --verbose
    verbose mode (-vvv for more, -vvvv to enable 詳細信息connection debugging)

--version 
    show program's version number and exit  #輸出ansible的版本

ansible-doc命令

ansible-doc指令是用來查看ansible所支持的模塊的文件信息的,並且支持shell!
查看 ansible-doc 的使用說明:
###一般用法:(也是常用的用法)
ansible-doc -l 獲取模塊信息
ansible-doc -s MOD_NAME 獲取指定模塊的使用幫助

###ansible-doc
[root@CentOS7-master ~]# ansible-doc -h 
Usage: ansible-doc [options][module...]

Options:
    -h, --help show this help message and exit # 顯示命令參數API文檔

    -l, --list List available modules #列出可用的模塊

    -M MODULE_PATH, --module-path=MODULE_PATH #指定模塊的路徑specify path(s) to module library (default=None)

    -s, --snippet Show playbook snippet for specified module(s) #顯示playbook制定模塊的用法

    --version show program's version number and exit # 顯示ansible-doc的版本號查看模塊

實例:

[root@CentOS7-master ~]# ansible-doc -l|grep mysql
mysql_db                           Add or remove MySQL databases from a remote host.   
mysql_replication                  Manage MySQL replication                            
mysql_user                         Adds or removes a user from a MySQL database.       
mysql_variables                    Manage MySQL global variables
[root@CentOS7-master ~]# 
[root@CentOS7-master ~]# ansible-doc -l mysql_replication 
a10_server                         Manage A10 Networks AX/SoftAX/Thunder/vThunder devic...
a10_service_group                  Manage A10 Networks devices' service groups         
......
......
......
quantum_router_interface           Attach/Detach a subnet's interface to a router      
quantum_subnet                     Add/remove subnet from a network                    
(END)

ansible常用模塊

1、主機連通性測試:

[root@192 ~]# vim /etc/ansible/hosts 
[root@192 ~]# ansible all -m ping
192.168.1.15 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.1.16 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.1.58 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

若出現以下結果,則說明未配置主機列表,則需要在/etc/ansible/hosts 中添加主機列表:

[root@CentOS7-master ~]# ansible all -m ping
 [WARNING]: provided hosts list is empty, only localhost is available

 [WARNING]: No hosts matched, nothing to do

2、command:在遠程主機執行命令;不支持|管道命令
命令模塊接受命令名稱,後面是空格分隔的列表參數。給定的命令將在所有選定的節點上執行。它不會通過shell進行處理,比如$HOME和操作如”小於”<“,”>”, “|”, “;”,”&”‘ 工作(需要使用(shell)模塊實現這些功能)。

action: command

chdir       #在執行命令之前,先切換到該目錄

creates     #一個文件名,當這個文件存在,則該命令不執行,可以用來做判斷

executable  #切換shell來執行命令,需要使用命令的絕對路徑

free_form   #要執行的Linux指令,一般使用ansible的-a參數代替。

removes     #一個文件名,這個文件不存在,則該命令不執行,與creates相反的判斷
[root@192 ~]# ansible all -m command -a 'ifconfig'
192.168.1.16 | SUCCESS | rc=0 >>
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.16  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::1c70:26ce:d630:1c70  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::7a5:d6dd:d259:98cc  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::a75f:22e9:ba54:957c  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:00:12:b6  txqueuelen 1000  (Ethernet)
        RX packets 176801  bytes 260182761 (248.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 45214  bytes 2820390 (2.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 72  bytes 6248 (6.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 72  bytes 6248 (6.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:27:e4:27  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

192.168.1.58 | SUCCESS | rc=0 >>
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.58  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::1c70:26ce:d630:1c70  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::a75f:22e9:ba54:957c  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:f3:bf:73  txqueuelen 1000  (Ethernet)
        RX packets 29563  bytes 42812015 (40.8 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 10409  bytes 678597 (662.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 72  bytes 6248 (6.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 72  bytes 6248 (6.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:27:e4:27  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

192.168.1.15 | SUCCESS | rc=0 >>
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.15  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::1c70:26ce:d630:1c70  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:94:2e:ad  txqueuelen 1000  (Ethernet)
        RX packets 79414  bytes 116338650 (110.9 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 23480  bytes 1482711 (1.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 72  bytes 6248 (6.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 72  bytes 6248 (6.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:27:e4:27  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@192 ~]# ansible all -m command -a 'chdir=/tmp ls'  
192.168.1.15 | SUCCESS | rc=0 >>
ansible_ThpveH
ssh-5Dkf5SfH483W
systemd-private-fcf7660f6b89485c8f53e9a1d6335e8e-colord.service-FnABAJ
systemd-private-fcf7660f6b89485c8f53e9a1d6335e8e-cups.service-R8E6Lk
systemd-private-fcf7660f6b89485c8f53e9a1d6335e8e-rtkit-daemon.service-eDXa14
systemd-private-fcf7660f6b89485c8f53e9a1d6335e8e-vmtoolsd.service-Ey2wRr
tracker-extract-files.0
yum_save_tx.2020-05-16.14-45.02hesw.yumtx

192.168.1.16 | SUCCESS | rc=0 >>
ansible_0BtWXz
ssh-0E7PYJySzJrT
systemd-private-2a894815fa9d44f5bb25661470b6c09a-colord.service-Zwmd5C
systemd-private-2a894815fa9d44f5bb25661470b6c09a-cups.service-SNyI2N
systemd-private-2a894815fa9d44f5bb25661470b6c09a-rtkit-daemon.service-IkFVVA
systemd-private-2a894815fa9d44f5bb25661470b6c09a-vmtoolsd.service-b3aoIs
tracker-extract-files.0
yum_save_tx.2020-05-16.14-47.A8PvSD.yumtx

192.168.1.58 | SUCCESS | rc=0 >>
ansible_rjGktI
pip-DzTkR1-unpack
ssh-xSOLKOVlzvDA
systemd-private-462818de87eb4b57acae84cb355a89e0-colord.service-1dU7Ho
systemd-private-462818de87eb4b57acae84cb355a89e0-cups.service-i6Vr0D
systemd-private-462818de87eb4b57acae84cb355a89e0-rtkit-daemon.service-fJyqk7
systemd-private-462818de87eb4b57acae84cb355a89e0-vmtoolsd.service-8STrTN
tracker-extract-files.0

3、shell模塊
shell模塊在遠程主機上調用shell解釋器運行命令,支持shell的各種功能,例如管道等 :

[root@192 ~]# ansible all -m shell -a 'cat /etc/passwd |grep "root"'
192.168.1.58 | SUCCESS | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

192.168.1.15 | SUCCESS | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

192.168.1.16 | SUCCESS | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

4、copy:複製文件到遠程主機,可以改權限等
用法:
(1) 複製文件

-a "src= dest= "

(2) 給定內容生成文件

-a "content= dest= "

相關選項如下:

backup:在覆蓋之前,將源文件備份,備份文件包含時間信息。有兩個選項:yes|no
content:用於替代“src”,可以直接設定指定文件的值

dest:必選項。要將源文件複製到的遠程主機的絕對路徑,如果源文件是一個目錄,那麼該路徑也必須是個目錄

directory_mode:遞歸設定目錄的權限,默認爲系統默認權限

force:如果目標主機包含該文件,但內容不同,如果設置爲yes,則強制覆蓋,如果爲no,則只有當目標主機的目標位置不存在該文件時,才複製。默認爲yes

others:所有的file模塊裏的選項都可以在這裏使用

src:被複制到遠程主機的本地文件,可以是絕對路徑,也可以是相對路徑。如果路徑是一個目錄,它將遞歸複製。在這種情況下,如果路徑使用“/”來結尾,則只複製目錄裏的內容,如果沒有使用“/”來結尾,則包含目錄在內的整個內容全部複製,類似於rsync
[root@192 ~]# ansible all -m copy -a 'content="hello\nworld" dest=/tmp/test.ansible mode=666' 
192.168.1.16 | SUCCESS => {
    "changed": true, 
    "checksum": "7db827c10afc1719863502cf95397731b23b8bae", 
    "dest": "/tmp/test.ansible", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "9195d0beb2a889e1be05ed6bb1954837", 
    "mode": "0666", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
    "size": 11, 
    "src": "/root/.ansible/tmp/ansible-tmp-1589620966.54-208964354657486/source", 
    "state": "file", 
    "uid": 0
}
192.168.1.15 | SUCCESS => {
    "changed": true, 
    "checksum": "7db827c10afc1719863502cf95397731b23b8bae", 
    "dest": "/tmp/test.ansible", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "9195d0beb2a889e1be05ed6bb1954837", 
    "mode": "0666", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
    "size": 11, 
    "src": "/root/.ansible/tmp/ansible-tmp-1589620966.5-180390952309590/source", 
    "state": "file", 
    "uid": 0
}
192.168.1.58 | SUCCESS => {
    "changed": true, 
    "checksum": "7db827c10afc1719863502cf95397731b23b8bae", 
    "dest": "/tmp/test.ansible", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "9195d0beb2a889e1be05ed6bb1954837", 
    "mode": "0666", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
    "size": 11, 
    "src": "/root/.ansible/tmp/ansible-tmp-1589620966.55-103378698389009/source", 
    "state": "file", 
    "uid": 0
}

5、file 設置文件屬性:

創建目錄:-a "path= state=directory"
創建鏈接文件:-a "path= src= state=link"
刪除文件:-a "path= state=absent"
force:需要在兩種情況下強制創建軟鏈接,一種是源文件不存在,但之後會建立的情況下;另一種是目標軟鏈接已存在,需要先取消之前的軟鏈,然後創建新的軟鏈,有兩個選項:yes|no

group:定義文件/目錄的屬組 mode:定義文件/目錄的權限

owner:定義文件/目錄的屬主 path:必選項,定義文件/目錄的路徑

recurse:遞歸設置文件的屬性,只對目錄有效 src:被鏈接的源文件路徑,只應用於state=link的情況

dest:被鏈接到的路徑,只應用於state=link的情況
    state:
        directory:如果目錄不存在,就創建目錄
        file:即使文件不存在,也不會被創建
        link:創建軟鏈接
        hard:創建硬鏈接
        touch:如果文件不存在,則會創建一個新的文件,如果文件或目錄已存在,則更新其最後修改時間
        absent:刪除目錄、文件或者取消鏈接文件
[root@192 ~]# ansible all -m file -a 'path=/tmp/test state=directory' 192.168.1.16 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/tmp/test", 
    "secontext": "unconfined_u:object_r:user_tmp_t:s0", 
    "size": 6, 
    "state": "directory", 
    "uid": 0
}
192.168.1.58 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/tmp/test", 
    "secontext": "unconfined_u:object_r:user_tmp_t:s0", 
    "size": 6, 
    "state": "directory", 
    "uid": 0
}
192.168.1.15 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/tmp/test", 
    "secontext": "unconfined_u:object_r:user_tmp_t:s0", 
    "size": 6, 
    "state": "directory", 
    "uid": 0
}
[root@192 ~]# ansible all -m file -a 'path=/data/aa state=touch'
192.168.1.15 | SUCCESS => {
    "changed": true, 
    "dest": "/data/aa", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:default_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 0
}
192.168.1.16 | SUCCESS => {
    "changed": true, 
    "dest": "/data/aa", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:default_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 0
}
192.168.1.58 | SUCCESS => {
    "changed": true, 
    "dest": "/data/aa", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:default_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 0
}
[root@192 ~]# ansible all -m file -a 'path=/data/aa state=file' 
192.168.1.15 | SUCCESS => {
    "changed": false, 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "path": "/data/aa", 
    "secontext": "unconfined_u:object_r:default_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 0
}
192.168.1.16 | SUCCESS => {
    "changed": false, 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "path": "/data/aa", 
    "secontext": "unconfined_u:object_r:default_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 0
}
192.168.1.58 | SUCCESS => {
    "changed": false, 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "path": "/data/aa", 
    "secontext": "unconfined_u:object_r:default_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 0
}

6、fetch從遠程某主機獲取文件到本地:
dest:用來存放文件的目錄,例如存放目錄爲backup,源文件名稱爲/etc/profile在主機pythonserver中,那麼保存爲/backup/pythonserver/etc/profile;

Src:在遠程拉取的文件,並且必須是一個file,不能是目錄。

[root@192 ~]# ansible all -m fetch -a 'src=/var/log/messages dest=/root'
192.168.1.58 | SUCCESS => {
    "changed": true, 
    "checksum": "fa3be01a67361d5334b0e2883ddf74dfb3f47078", 
    "dest": "/root/192.168.1.58/var/log/messages", 
    "md5sum": "cfa3033c94a15c1884e2c1146154480b", 
    "remote_checksum": "fa3be01a67361d5334b0e2883ddf74dfb3f47078", 
    "remote_md5sum": null
}
192.168.1.16 | SUCCESS => {
    "changed": true, 
    "checksum": "7f8a407f98e363c35b382aefafd2c7c3a3bbc95d", 
    "dest": "/root/192.168.1.16/var/log/messages", 
    "md5sum": "e865d61eb844a52e901162103da2212e", 
    "remote_checksum": "7f8a407f98e363c35b382aefafd2c7c3a3bbc95d", 
    "remote_md5sum": null
}
192.168.1.15 | SUCCESS => {
    "changed": true, 
    "checksum": "c5df85683f660be8e9e0d33acf1e7a1ba42c1be8", 
    "dest": "/root/192.168.1.15/var/log/messages", 
    "md5sum": "d11697018d7123e8fabb20335f9ab581", 
    "remote_checksum": "c5df85683f660be8e9e0d33acf1e7a1ba42c1be8", 
    "remote_md5sum": null
}

7、cron管理cron計劃任務
ansible all -m cron -a “ ”: 設置管理節點生成定時任務

action: cron backup=    #如果設置,創建一個crontab備份 [yes|no]
cron_file=  #如果指定, 使用這個文件cron.d,而不是單個用戶

crontab

day=    #日應該運行的工作( 1-31, *, */2, )

hour=   #小時 ( 0-23, *, */2, )

minute=     #分鐘( 0-59, *, */2, )

month=  #月( 1-12, *, /2, )

weekday     #周 ( 0-6 for Sunday-Saturday,, )

job=    #指明運行的命令是什麼

name=   #定時任務描述

reboot  #任務在重啓時運行,不建議使用,建議使用special_time

special_time    #特殊的時間範圍,參數:reboot(重啓時),annually(每年),monthly(每月),weekly(每週),daily(每天),hourly(每小時)

state   #指定狀態,present表示添加定時任務,也是默認設置,absent表示刪除定時任務

user    #以哪個用戶的身份執行
ansible webservers -m cron -a 'name="sync time from ntpserver" minute="*/10" job="/sbin/ntpdate asia.pool.ntp.org &>/dev/null" '

8、yum安裝軟件

conf_file   #設定遠程yum安裝時所依賴的配置文件。如配置文件沒有在默認的位置。
disable_gpg_check   #是否禁止GPG checking,只用於‘present’ or `latest’。
disablerepo     #臨時禁止使用yum庫。 只用於安裝或更新時。
enablerepo  #臨時使用的yum庫。只用於安裝或更新時。

#下面帶“**”的都是重點的
** name=    #所安裝的包的名稱
** state=present|latest|absent  #present安裝,latest安裝最新的,absent 卸載軟件。
** update_cache     #強制更新yum的緩存。
[root@192 ~]# ansible 192.168.1.15 -m yum -a 'name=httpd state=present'
192.168.1.15 | SUCCESS => {
    "changed": false, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "httpd-2.4.6-93.el7.centos.x86_64 providing httpd is already installed"
    ]
}

9、service: 服務程序管理

arguments   #命令行提供額外的參數
enabled=true|false  #設置開機啓動。
name=   #服務名稱
runlevel    #開機啓動的級別,一般不用指定。
sleep   #在重啓服務的過程中,是否等待。如在服務關閉以後等待2秒再啓動。
state=  #started啓動服務, stopped停止服務, restarted重啓服務, reloaded重載配置
ansible 192.168.1.15 -m service -a 'name=httpd state=restarted enabled=true'

10、user模塊管理

用戶模塊,管理用戶帳號 action: user
comment     #用戶的描述信息
createhome  #是否創建家目錄
force       #在使用state=absent是, 行爲與userdel –force一致.
group       #指定基本組
groups      #指定附加組,如果指定爲(groups=)表示刪除所有組
home        #指定用戶家目錄
move_home   #如果設置爲home=時, 試圖將用戶主目錄移動到指定的目錄
name        #指定用戶名
non_unique  #該選項允許改變非唯一的用戶ID值
password    #指定用戶密碼
remove      #在使用state=absent時, 行爲是與userdel –remove一致
shell       #指定默認shell
state       #設置帳號狀態,不指定爲創建,指定值爲absent表示刪除
system      #當創建一個用戶,設置這個用戶是系統用戶。這個設置不能更改現有用戶
uid         #指定用戶的uid
update_password     #更新用戶密碼
#創建一個name爲tom,uid爲1006,shell爲、bin/zshell,home爲/home/tomhome的用戶
[root@192 ~]# ansible 192.168.1.16 -m user -a 'name=tom comment="tom is tom" uid=1066 shell=/bin/zshell home=/home/tomhome'           
192.168.1.16 | SUCCESS => {
    "changed": true, 
    "comment": "tom is tom", 
    "createhome": true, 
    "group": 1066, 
    "home": "/home/tomhome", 
    "name": "tom", 
    "shell": "/bin/zshell", 
    "state": "present", 
    "system": false, 
    "uid": 1066
}

11、group
用戶組模塊,添加或刪除組:action: group

gid # 設置組的GID號
name= # 管理組的名稱
state # 指定組狀態,默認爲創建,設置值爲absent爲刪除
system # 設置值爲yes,表示爲創建系統組
[root@192 ~]#  ansible 192.168.1.16 -m group -a 'name=tom state=present'
192.168.1.16 | SUCCESS => {
    "changed": false, 
    "gid": 1066, 
    "name": "tom", 
    "state": "present", 
    "system": false
}

12、script在指定節點運行服務端的腳本

[root@CentOS7-master ~]# vim test.sh
#/bin/bash

#創建/tmp/test.sh.log
touch /tmp/test.sh.log

#將date命令結果輸出到/tmp/test.sh.log
echo “hello” >> /tmp/test.sh.log

所有主機執行/root/test.sh腳本

[root@192 ~]# ansible all -m script -a '/root/test.sh'
192.168.1.58 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 192.168.1.58 closed.\r\n", 
    "stdout": "", 
    "stdout_lines": []
}
192.168.1.16 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 192.168.1.16 closed.\r\n", 
    "stdout": "", 
    "stdout_lines": []
}
192.168.1.15 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 192.168.1.15 closed.\r\n", 
    "stdout": "", 
    "stdout_lines": []
}

13、setup模塊
facts組件是ansible用於採集被管機器設備信息的一個功能,我們可以使用setup模塊查機器的所有facts信息,可以使用filter來查看指定信息。整個facts信息被包裝在一個JSON格式的數據結構中,ansible_facts是最上層的值。

facts就是變量,內建變量 。每個主機的各種信息,cpu顆數、內存大小等。會存在facts中的某個變量中。調用後返回很多對應主機的信息,在後面的操作中可以根據不同的信息來做不同的操作。如redhat系列用yum安裝,而debian系列用apt來安裝軟件。

setup模塊,主要用於獲取主機信息,在playbooks裏經常會用到的一個參數gather_facts就與該模塊相關。

setup模塊下經常使用的一個參數是filter參數,具體使用示例如下(由於輸出結果較多,這裏只列命令不寫結果):

ansible 192.168.1.15 -m setup -a 'filter=ansible*mb' //查看主機內存信息
ansible 192.168.1.15 -m setup -a 'filter=ansible_ens3[2-3]' //查看地接口爲eth0-2的網卡信息
ansible all -m setup --tree /tmp/facts //將所有主機的信息輸入到/tmp/facts目錄下,每臺主機的信息輸入到主機名文件中(/etc/ansible/hosts裏的主機名)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章