Ansible學習筆記——基礎與配置

〇、Ansible總體介紹

Ansible是一個當時最爲流行的集羣部署與配置工具,在服務器配置和運維管理的過程當中有重要的做用和優點。本文主要爲結合我的的學習心得,向對ansible有興趣的朋友儘量深刻簡出、詳盡的介紹這個工具的原理和用法。html

Ansible是由Ansible Inc.和Red Hat共同開發的一款開源集羣配置軟件,編寫語言爲python,使用時的配置文件語言爲yaml。核心組件使用了paramiko和PyYaml。其中paramiko是python的ssh支持庫,而PyYaml則用於支持yaml配置文件的使用和playbook的應用。node

Ansible有着很是突出的優勢,從而使其在saltstack等集羣配置工具中脫穎而出。優點以下:python

  • 僅需管理主機安裝並配置便可,全部的配置工做都經過ssh鏈接下發至被管理主機。
  • 輕量化
  • Python編寫,源代碼可讀性強。同時playbook使用yml配置,容易上手
  • 對於集羣和ECS的支持很是完美。
  • 支持大量API接入,而且對於python的擴展支持良好。
  • 因爲架構出色,理論上在管理主機性能到位的狀況下能夠同時配置近乎無限的主機。

1、Ansible基本配置和受管主機接入

一、安裝和基本配置

  • 首先是Ansible的安裝配置,以CentOS爲例:
$ yum install -y ansible
複製代碼
  • 其次配置宿主機對受管機的免密登陸,若是已經配置能夠直接跳過
$ ssh-keygen -t rsa     ##若是以前已經生成過祕鑰了則不須要這一步
$ ssh-copy-id root@<agent_ip>  ##向受管機配置管理機的公鑰,這一步可能須要輸入受管機密碼
複製代碼
  • 在配置完公鑰以後記得把受管機的IP信息記錄到/etc/ansible/hosts文件中,若是你須要使用的是以後的ansible-playbook,則須要在對應的工做文件夾內建立一個hosts文件記錄受管機IP。如下爲一個標準的ansible hosts文件的格式:
172.26.0.81    ##不分組直接聲明IP
172.26.0.82:54208    ##申明特殊的ssh端口

[fangwei-test]           ##申明瞭受管機的列表和分類名
172.26.0.83        ##直接聲明IP
Printer     ansible_ssh_host=172.26.0.84    ##定義別名和IP
EMR-master  ansible_ssh_host=172.26.0.85
Snipe-it    ansible_ssh_host=172.26.0.86
Kubernetes  ansible_ssh_host=172.26.0.87

[fangwei-test:vars]      ##配置對應的用戶等ansible變量
ansible_user=root
複製代碼

這裏順便介紹一下hosts文件中經常使用的ansible變量聲明:web

ansible_ssh_host ##鏈接目標主機的地址

ansible_ssh_port ##鏈接目標主機的端口,默認 22 時無需指定

ansible_ssh_user ##鏈接目標主機默認用戶

ansible_ssh_pass ##鏈接目標主機默認用戶密碼

ansible_ssh_connection ##目標主機鏈接類型,能夠是 local 、ssh 或 paramiko

ansible_ssh_private_key_file ##鏈接目標主機的 ssh 私鑰,用於安全要求高的機器。可使用其餘管理主機的公鑰來登陸特定的主機。

ansible_*_interpreter ##指定採用非 Python 的其餘腳本語言
複製代碼
  • 在這一切都配置完畢後,能夠對這個類的受管機進行ping測試,具體爲:
$ ansible fangwei-test -m ping
複製代碼

2. Ansible命令參數介紹

ansible自己自帶很是多的參數選項,能夠適配幾乎任何集羣部署的需求和各類測試需求。 這些參數在ansible-playbook等延伸指令中每每也通用。shell

$ ansible --help

Usage: ansible <host-pattern> [options]

Define and run a single task 'playbook' against a set of hosts  ##單純的ansible指令用於對一個或者一組受管機執行一個playbook任務

普通參數:
  -a MODULE_ARGS, --args=MODULE_ARGS
                        #[重要]模塊參數
  --ask-vault-pass     # 要求輸入管理密碼
  -B SECONDS, --background=SECONDS
                        #異步運行,X秒後失敗(默認關閉)
  -C, --check           #不對受管機執行任何改變,可是假設已執行語句並返回結果(用於測試)
  -D, --diff            #當改變小體積文件的時候,顯示二者的區別,經常和-C參數一塊兒用(用於測試)
  -e EXTRA_VARS, --extra-vars=EXTRA_VARS
                        #將其餘變量設置爲key = value或YAML / JSON,若是filename前綴爲@
  -f FORKS, --forks=FORKS
                        #指定要使用的並行進程數(默認值= 5)
  -h, --help            #顯示此幫助消息並退出
  -i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY
                        #指定庫存主機路徑或逗號分隔的主機列表。PS: --inventory-file已棄用
  -l SUBSET, --limit=SUBSET
                        #進一步將所選主機限制爲其餘模式
  --list-hosts          #輸出匹配主機列表;不會執行任何其餘操做
  -m MODULE_NAME, --module-name=MODULE_NAME
                        ##[重要]要執行的模塊名稱(默認爲command)
  -M MODULE_PATH, --module-path=MODULE_PATH
                        ##將冒號分隔的路徑預先添加到模塊庫(默認爲[u'/root/.ansible/plugins/modules',u'/usr/share/ansible/plugins/modules'])
  -o, --one-line        ##壓縮輸出。
  --playbook-dir=BASEDIR
                        ##因爲此工具不使用playbooks,所以將其用做替代playbook目錄。這將設置許多功能的相對路徑,包括roles/group_vars/etc. 也就是變相實現部分playbook功能。
  -P POLL_INTERVAL, --poll=POLL_INTERVAL
                        ##若是使用-B(默認值= 15),則設置輪詢間隔。
  --syntax-check        ##對playbook執行語法檢查,但不執行它.
  -t TREE, --tree=TREE  ##將輸出記錄到此目錄
  --vault-id=VAULT_IDS  ##顯示要使用的保管庫標識
  --vault-password-file=VAULT_PASSWORD_FILES
                        ##保管庫密碼文件
  -v, --verbose         ##詳細模式(-vvv表示更多,-vvvv表示啓用鏈接調試)
  --version             ##顯示ansible版本並退出

  鏈接相關參數:
    主要關於控制哪些受管機以及如何鏈接到主機。

    -k, --ask-pass      ##要求輸入受管機密碼
    --private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE
                        ##使用特色文件來認證連接
    -u REMOTE_USER, --user=REMOTE_USER
                        ##以特定user來進行鏈接。
    -c CONNECTION, --connection=CONNECTION
                        ##要使用的鏈接類型(默認=智能)
    -T TIMEOUT, --timeout=TIMEOUT
                        ##以秒爲單位覆蓋鏈接超時(默認值= 10)
    --ssh-common-args=SSH_COMMON_ARGS
                        ##指定傳遞給sftp / scp / ssh的公共參數(例如ProxyCommand)
    --sftp-extra-args=SFTP_EXTRA_ARGS
                        ##指定僅傳遞給sftp的額外參數(例如-f,-l)
    --scp-extra-args=SCP_EXTRA_ARGS
                        ##指定僅傳遞給scp的額外參數(例如-l)
    --ssh-extra-args=SSH_EXTRA_ARGS
                        ##指定僅傳遞給ssh的額外參數(例如-R)

  特權升級參數:
    控制你在目標主機上若是成爲或者成爲哪一個用戶

    -s, --sudo          ##用sudo(nopasswd)運行操做(不推薦,推薦使用--become-method)
    -U SUDO_USER, --sudo-user=SUDO_USER
                        ##所需的sudo用戶(默認= root)(不建議使用,推薦使用--become-method)
    -S, --su            ##用su運行操做 (不建議使用,推薦使用--become-method)
    -R SU_USER, --su-user=SU_USER
                        ##以su做爲此用戶運行操做(默認=無)(不建議使用,推薦使用--become-method)
    -b, --become        ##用run運行操做(不顯示密碼提示)
    --become-method=BECOME_METHOD
                        ##要使用的權限升級方法(默認= sudo),可選項有: [ sudo | su | pbrun | pfexec | doas | dzdo | ksu | runas | pmrun | enable | machinectl ]
    --become-user=BECOME_USER
                        ##以此用戶身份運行操做(默認= root)
    --ask-sudo-pass     ##請求sudo密碼(不推薦使用,推薦使用--become-method)
    --ask-su-pass       ##請求su密碼 (不推薦使用,推薦使用--become-method)
    -K, --ask-become-pass
                        ##要求提供權限提高密碼
複製代碼

2、Ansible模塊介紹與使用

Ansible內置了海量的原生模塊和大量的用於鏈接第三方API的支持模塊,熟練掌握基礎模塊,而且活用各類擴展模塊,是熟練掌握Ansible的必經之路。這一章裏面咱們會對Ansible的模塊進行基礎的介紹和使用案例分析。至於詳細的模塊介紹能夠查看我寫的Ansible支持模塊詳表npm

在ansible中查看全部的模塊只須要一個命令:vim

$ ansible-doc -l
複製代碼

若是須要查看某一個特定的模塊的詳細解釋則能夠直接查詢,以ping模塊爲例:centos

[root@Host ~]# ansible-doc ping
> PING    (/usr/lib/python2.7/site-packages/ansible/modules/system/ping.py)

        A trivial test module, this module always returns `pong' on successful contact. It does not make sense in playbooks, but it is useful from `/usr/bin/ansible' to verify the ability...     ##以後省略
複製代碼

模塊的重要性除了自己的強大功能外,熟練地掌握模塊也是以後playbook部分的基礎。一個優秀的playbook使用者必然對經常使用模塊的參數瞭如指掌。安全

0、Ping模塊

ping這個模塊主要用來測試可否連通目標服務器。bash

$ ansible test -m ping
複製代碼

1. Command模塊

Command模塊自如其名,就是一個很純粹的命令執行模塊,用於在受管機上進行命令的執行,其自己也能夠配合不少二級參數和指令進行功能的擴展。不支持管道功能。例如最簡單的查看hostname功能:

[root@Printer ~]# ansible fangwei -m command -a 'hostname'
EMRtest | CHANGED | rc=0 >>
EMR-master

Snipeit | CHANGED | rc=0 >>
localhost.localdomain
複製代碼

須要注意的是,在沒有特意指定ansible的-m參數的時候,默認調用的Module就是command。 下面是command經常使用的幾個二級參數:

  • creates:判斷,當該文件存在時,則該命令不執行
  • free_form:須要執行的Linux指令
  • chdir:在執行命令以前,先切換到該指定的目錄
  • removes:判斷,當該文件不存在時,則該選項不執行
  • executable:切換shell來執行命令,該執行路徑必須是一個絕對路徑 下面爲chdir的用法舉例,其餘的指令也是相似的用法,能夠自行嘗試。具體的格式爲: ansible $目標host -a '$二級參數=$目標文件或路徑 $待執行指令'
[root@Printer ~]# ansible fangwei -a 'chdir=/etc/ansible ls -l'
EMRtest | CHANGED | rc=0 >>
總用量 28
-rw-r--r-- 1 root root 20277 12月 14 13:57 ansible.cfg
-rw-r--r-- 1 root root  1070 12月 26 11:26 hosts
drwxr-xr-x 2 root root  4096 12月 14 13:57 roles
複製代碼

2. Shell模塊(或者Raw模塊)

這個模塊的主要特色就是囊括了全部的command的功能和二級參數支持,而且支持管道。

[root@Printer ~]# ansible fangwei -m shell -a 'ps -ef | grep crond | grep -v grep'
EMRtest | CHANGED | rc=0 >>
root      6030     1  0  2018 ?        00:00:13 /usr/sbin/crond -n

Snipeit | CHANGED | rc=0 >>
root      1042     1  0 2月12 ?       00:00:04 /usr/sbin/crond -n
複製代碼

3. File模塊

File模塊主要是對於文件的一些簡單操做,主要是建立或者權限設定,已經文件的存在判斷等。

  • force:在兩種狀況下強制建立軟連接。一、源文件不存在但以後會創建的狀況;二、目標軟件已存在,須要先取消以前的軟連接,而後建立新的軟連接。選項:yes|no
  • group:定義文件/目錄的屬組
  • mode:定義文件/目錄的權限
  • path:必選項,定義文件/目錄的路徑
  • recurse:遞歸的設置文件的屬性,只對目錄有效
  • src:要被連接到的路徑,只應用於state=link的狀況
  • dest:被連接到的路徑,只應用於state=link的狀況
  • state: directory:若是目錄不存在,建立目錄 file:即便文件不存在,也不會被建立 link:建立軟連接;hard:建立硬連接 touch:若是文件不存在,則會建立一個新的文件,若是已存在,則更新其最後修改時間 absent:刪除目錄/文件或者取消連接文件
[root@Printer ~]# ansible fangwei -m file -a 'path=/root/ninngenn.cfg state=touch'
Snipeit | CHANGED => {
    "changed": true,
    "dest": "/root/ninngenn.cfg",
    "gid": 0,
    "group": "root",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "state": "file",
    "uid": 0
}
EMRtest | CHANGED => {
    "changed": true,
    "dest": "/root/ninngenn.cfg",
    "gid": 0,
    "group": "root",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "state": "file",
    "uid": 0
}
複製代碼

4. Copy模塊

Copy模塊主要用於複製文件到遠程主機。具體參數以下:

  • backup:在覆蓋以前將源文件備份,備份文件包含時間信息,選項:yes|no
  • content:用於替代」src」,能夠直接設定文件的值
  • directory_node:遞歸的設定目錄權限,默認爲系統默認權限
  • force:若是目標主機包含該文件,但內容不一樣,若是設置爲yes,則強制覆蓋;若是設置爲no,則只有當目標主機的目標位置不存在該文件時,才複製。默認爲yes
  • others:全部file模塊裏的選項均可以在這裏使用
  • src:要複製到遠程主機的文件在本地的地址,能夠是絕對路徑,也能夠是相對路徑。若是路徑是一個目錄,它將遞歸複製。在這種狀況下,若是路徑使用「/」來結尾,則只複製目錄裏的內容,若是沒有使用「/」來結尾,則包含目錄在內的整個內容所有複製,相似於rsync
[root@Printer ~]# ansible fangwei -m copy -a 'src=/root/ninngenn.cfg dest=/root/ninngenn.cfg force=yes'
EMRtest | CHANGED => {
    "changed": true,
    "checksum": "458bd6a39e16bc1e00255b66c67b5cb92180166b",
    "dest": "/root/ninngenn.cfg",
    "gid": 0,
    "group": "root",
    "md5sum": "cf35206b8cca3e51082bb32ce278ed8d",
    "mode": "0644",
    "owner": "root",
    "size": 56,
    "src": "/root/.ansible/tmp/ansible-tmp-1551949966.41-24885251361529/source",
    "state": "file",
    "uid": 0
}
Snipeit | CHANGED => {
    "changed": true,
    "checksum": "458bd6a39e16bc1e00255b66c67b5cb92180166b",
    "dest": "/root/ninngenn.cfg",
    "gid": 0,
    "group": "root",
    "md5sum": "cf35206b8cca3e51082bb32ce278ed8d",
    "mode": "0644",
    "owner": "root",
    "size": 56,
    "src": "/root/.ansible/tmp/ansible-tmp-1551949966.4-190980703709511/source",
    "state": "file",
    "uid": 0
}
複製代碼

5. Service模塊

用於受管機服務的配置與管理,相似於systemd,經常使用選項:

  • arguments:爲命令提供一些附加參數
  • enabled:是否開機啓動,選項 yes|no
  • name:必選項,服務名稱
  • pattern:定義一個模式,若是經過status指令來查看服務狀態時,沒有響應,它會經過ps命令在進程中根據該模式進行查找,若是匹配到,則認爲該服務依然運行
  • runlevel:運行級別
  • sleep:若是執行了restarted,則在stop和start之間等待幾秒鐘
  • state:對當前服務執行啓動/中止/重啓/從新加載等操做(started/stopped/restarted/reloaded)
[root@Printer ~]# ansible fangwei -m service -a 'name=sshd state=restarted enabled=yes'
Snipeit | CHANGED => {
    "changed": true,
    "enabled": true,
    "name": "sshd",
    "state": "started"
}
EMRtest | CHANGED => {
    "changed": true,
    "enabled": true,
    "name": "sshd",
    "state": "started"
}
複製代碼

6. Cron模塊

相似於Linux的Crontab功能,用來控制服務或者進程的定時執行功能。經常使用參數:

  • backup:對遠程主機上的原計劃任務內容修改以前作備份
  • cron_file:若是指定該選項,則用該文件替換遠程主機上cron.d目錄下的用戶的任務計劃
  • day:日(1-31,,/2,…)
  • hour:小時(0-23,,/2,…)
  • minute:分鐘(0-59,,/2,…)
  • month:月(0-12,*,…)
  • weekday:周(0-7,*,…)
  • job:要執行的任務,依賴於state=present
  • name:該任務的描述
  • special_time:指定何時執行,參數:reboot,yearly,annually,monthly,weekly,daily,hourly
  • state:確認該任務計劃是建立仍是刪除
  • user:以哪一個用戶身份執行
[root@Printer ~]# ansible fangwei -m cron -a 'name="check home directory" minute=*/10 job="ls -lht /home"'
Snipeit | CHANGED => {
    "changed": true,
    "envs": [],
    "jobs": [
        "check home directory"
    ]
}
EMRtest | CHANGED => {
    "changed": true,
    "envs": [],
    "jobs": [
        "check home directory"
    ]
}
複製代碼

7. FileSystem

FileSystem模塊用於配置受管機的文件系統。改模塊涉及高位操做,請務必當心,經常使用參數爲:

  • dev:目標塊設備
  • force:在一個已有文件系統的設備上強制建立
  • fstype:文件系統的類型
  • opts:傳遞給mkfs命令的選項
[root@Printer ~]# ansible test_hosts -m filesystem -a 'dev=/dev/sdb fstype=ext4'
172.26.0.84 | SUCCESS => {
    "changed": true
}
複製代碼

8. Mount模塊

Mount模塊用於配置受管機的磁盤掛載,高危模塊,請慎重使用,下面爲經常使用參數:

  • dump:存儲(見fstab文件第5列)。注意,若是設置爲null而且狀態設置爲present,它將中止工做,而且將在後續運行中進行重複條目。對Solaris系統沒有影響。
  • fstype:必選項,文件系統類型,要求狀態是present或mounted
  • name:必選項,掛載點
  • opts:傳遞給mount命令的參數
  • src:必選項,要掛載的設備路徑。要求狀態是present或mounted
  • state:必選項。選項以下: present:只處理fstab中的配置 absent:刪除掛載點 mounted:自動建立掛載點並掛載 unmounted:卸載
[root@Ansible ~]# ansible test_hosts -m mount -a 'name=/mnt src=/dev/sdb1 fstype=ext4 state=mounted opts=rw'
172.26.0.84 | SUCCESS => {
    "changed": true, 
    "dump": "0", 
    "fstab": "/etc/fstab", 
    "fstype": "ext4", 
    "name": "/mnt", 
    "opts": "rw", 
    "passno": "0", 
    "src": "/dev/sdb1"
複製代碼

9. Yum模塊

若是熟悉CentOS的朋友應該就會知道,這是使用yum包管理器來管理軟件包的模塊,參數以下:

  • conf_file:yum的配置文件
  • disable_gpg_check:關閉gpg_check
  • disablerepo:不啓用某個源
  • enablerepo:啓用某個源
  • list:查看yum列表
  • name:要進行操做的軟件包名字,也能夠傳遞一個url或者一個本地的rpm包的路徑
  • state:狀態(present/installed/absent/removed/latest)
[root@Printer ~]# ansible fangwei -m yum -a 'name=sl state=latest'
Snipeit | CHANGED => {
    "ansible_facts": {
        "pkg_mgr": "yum"
    },
    "changed": true,
    "msg": "",
    "obsoletes": {
        "grub2": {
            "dist": "x86_64",
            "repo": "@anaconda",
            "version": "1:2.02-0.65.el7.centos.2"
        },
        "grub2-tools": {
            "dist": "x86_64",
            "repo": "@anaconda",
            "version": "1:2.02-0.65.el7.centos.2"
        }
    },
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * ius: dfw.mirror.rackspace.com\n * webtatic: uk.repo.webtatic.com\nResolving Dependencies\n--> Running transaction check\n---> Package sl.x86_64 0:5.02-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package Arch Version Repository Size\n================================================================================\nInstalling:\n sl x86_64 5.02-1.el7 epel 14 k\n\nTransaction Summary\n================================================================================\nInstall 1 Package\n\nTotal download size: 14 k\nInstalled size: 17 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Installing : sl-5.02-1.el7.x86_64 1/1 \n Verifying : sl-5.02-1.el7.x86_64 1/1 \n\nInstalled:\n sl.x86_64 0:5.02-1.el7 \n\nComplete!\n"
    ]
}
EMRtest | CHANGED => {
    "ansible_facts": {
        "pkg_mgr": "yum"
    },
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\nResolving Dependencies\n--> Running transaction check\n---> Package sl.x86_64 0:5.02-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package Arch Version Repository Size\n================================================================================\nInstalling:\n sl x86_64 5.02-1.el7 epel 14 k\n\nTransaction Summary\n================================================================================\nInstall 1 Package\n\nTotal download size: 14 k\nInstalled size: 17 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Installing : sl-5.02-1.el7.x86_64 1/1 \n Verifying : sl-5.02-1.el7.x86_64 1/1 \n\nInstalled:\n sl.x86_64 0:5.02-1.el7 \n\nComplete!\n"
    ]
}
複製代碼

10. User模塊

User模塊顧名思義就是用於用戶參數設置的模塊。經常使用參數:

  • home:指定用戶家目錄
  • group:設置用戶主組
  • groups:設置用戶的附屬組
  • uid:設置用戶的UID
  • password:設置用戶的密碼,密碼必須爲加密後的值
  • name:建立用戶的用戶名
  • createhhome:選項yes|no,值爲yes時才建立用戶家目錄
  • system:選項yes|no,默認爲no,值爲yes時建立的用戶爲系統用戶
  • remove:當state=absent時,remove=yes則表示連同家目錄一塊兒刪除,等價於userdel -r
  • state:選項present|absent,建立用戶或刪除用戶
  • shell:設置用戶的shell環境
[root@Ansible ~]# ansible test_hosts -m user -a 'name=user1 uid=1001 group=yfshare createhome=yes home=/home/user1 password="P@ssw0rd" shell=/bin/bash state=present'
172.26.0.84 | SUCCESS => {
    "changed": true, 
    "comment": "", 
    "createhome": true, 
    "group": 1000, 
    "home": "/home/user1", 
    "name": "user1", 
    "password": "NOT_LOGGING_PASSWORD", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": false, 
    "uid": 1001
}
複製代碼

11. Group模塊

顧名思義用於配置Group信息的模塊,參數以下:

  • gid:設置組的GID
  • name:組名
  • state:選項爲present|absent,建立組或刪除組
  • system:選項爲yes|no,值爲yes,則建立系統組 用法與User模塊雷同,再也不舉例。

12. get_url模塊

主要用於從http、ftp、https服務器上下載文件(相似於wget),主要參數以下:

  • checksum:文件下載完成後進行校驗
  • timeout:請求超時時間,默認爲10s
  • url:文件下載地址
  • url_username:用戶名,基於HTTP的基本認證
  • url_password:密碼
  • -use_proxy:選項yes|no,默認爲yes,即便用代理
  • dest:下載文件存儲的絕對路徑
[root@Printer ~]# ansible fangwei -m get_url -a 'dest=/root url=http://172.26.0.84/file/drivers/Canon/mac-10-14-canon.dmg'
EMRtest | CHANGED => {
    "changed": true,
    "checksum_dest": null,
    "checksum_src": "eff3bd83c5966373f04d8c4576cbbe610ba0d638",
    "dest": "/root/mac-10-14-canon.dmg",
    "gid": 0,
    "group": "root",
    "md5sum": "59b6a0a3dcb9dd3e6e46d1e8374d9c43",
    "mode": "0644",
    "msg": "OK (23166785 bytes)",
    "owner": "root",
    "size": 23166785,
    "src": "/root/.ansible/tmp/ansible-tmp-1551951882.53-86480089864174/tmp_7guIp",
    "state": "file",
    "status_code": 200,
    "uid": 0,
    "url": "http://172.26.0.84/file/drivers/Canon/mac-10-14-canon.dmg"
}
Snipeit | CHANGED => {
    "changed": true,
    "checksum_dest": null,
    "checksum_src": "eff3bd83c5966373f04d8c4576cbbe610ba0d638",
    "dest": "/root/mac-10-14-canon.dmg",
    "gid": 0,
    "group": "root",
    "md5sum": "59b6a0a3dcb9dd3e6e46d1e8374d9c43",
    "mode": "0644",
    "msg": "OK (23166785 bytes)",
    "owner": "root",
    "size": 23166785,
    "src": "/root/.ansible/tmp/ansible-tmp-1551951882.52-38856232211770/tmpPLN4Wf",
    "state": "file",
    "status_code": 200,
    "uid": 0,
    "url": "http://172.26.0.84/file/drivers/Canon/mac-10-14-canon.dmg"
複製代碼

13. Setup模塊

playbooks自動收集遠程主機上可用變量,這些變量用於playbooks配置。

[root@Ansible ~]# ansible test_hosts -m setup
172.26.0.84 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "172.26.0.84"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80:****:****:fe5c:dc6d"
        ], 
        "ansible_architecture": "x86_64",
複製代碼

14. Script模塊

這個模塊用於在受管機上執行sh腳本。

[root@Ansible ~]# ansible test_hosts -m script -a '/tmp/script.sh'
Enter passphrase for key '/root/.ssh/id_rsa': 
172.26.0.84 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 172.26.0.84 closed.\r\n", 
    "stdout": "", 
    "stdout_lines": []
複製代碼

3、神器ansible-playbook的使用

一、Yaml語言

Yaml語言是一種配置語言,主要用於配置文件的設定和數據塊的儲存,做爲一種xml語言的進化形態出現。起主要的優點在於:

  • YAML的可讀性好。
  • YAML和腳本語言的交互性好。
  • YAML使用實現語言的數據類型。
  • YAML有一個一致的信息模型。
  • YAML易於實現。

上面5條也就是XML不足的地方。同時,YAML也有XML的下列優勢:

  • YAML能夠基於流來處理;
  • YAML表達能力強,擴展性好。 總之,YAML試圖用一種比XML更敏捷的方式,來完成XML所完成的任務。

更多的內容及規範參見yaml官網。 語法結構經過空格來展現。Sequence裏的項用"-"來表明,Map裏的鍵值對用":"分隔。 這幾乎就是全部的語法了。如下爲一個標準的ansible-playbook的yaml配置文件:

---
- hosts: rotest2
  roles:
    - sshd
    - snmp
    - hostname
    - vim
    - parted
    - authorized_keys
複製代碼

二、playbook模塊

roles:角色(主模塊,和主yaml文件、ansible配置文件、host文件同在playbook根目錄,同時在roles文件夾下則是各類自定義的role。在role文件夾下才包括了後續的其餘次級模塊)

root@Ansible ~/ansible-test $ ls
ansible.cfg  hosts  roles  main.yml
root@Ansible ~/ansible-test/roles $ ls
audit  authorized_keys  hostname  megacli  nrpe  parted  snmp  sshd  telegraf  vim
複製代碼

在role文件夾下,會調用下面的各個子模塊,可是除了task之外都不是必須,而是可選項。例如這個telegraf的部署role,下面只包含了files、handlers、tasks三個子模塊。在子模塊中咱們能夠調用任何ansible支持的模塊功能,尤爲是上一章咱們介紹的那些重要功能模塊

root@Ansible ~/ansible-test/roles/telegraf $ ls
files  handlers  tasks
複製代碼
  • tasks:任務
  • variables:變量
  • templates:模板
  • handlers:處理器
  • files:須要的文件

三、如何使用playbook

ansible-playbook的使用基本和ansible相似,哪怕調用--help指令查看,也是同樣的參數結果。通常來講因爲playbook調用的模塊較多,配置的內容較豐富,後續的部署影響較大,因此在使用的時候請務必先調用-D -C兩個參數進行結果測試,排查報錯,確認一切無誤後再進行推送和部署。例如:

~$ ansible-playbook -i hosts ro.yml -t authorized_keys -DC
~$ ansible-playbook -i hosts ro.yml -t authorized_keys
複製代碼

四、使用案例

這裏咱們就用一個案例來對ansible-playbook進行詳細的解釋。這個案例比較完整,有助於咱們方便理解。 這個案例的文件架構爲:

root@Ansible ~/ansible-test $ ls
ansible.cfg  hosts  roles  main.yml
複製代碼

具體的main.yml文件爲:

root@Ansible ~/ansible-test $ cat main.yml
---
- hosts: test
  roles:
    - sshd
    - snmp
    - hostname
    - vim
    - parted
    - authorized_keys
    - telegraf
    - audit
複製代碼

咱們進入roles文件夾,查看具體的role內容。

root@Ansible ~/ansible-test/roles $ ls
audit  authorized_keys  hostname  megacli  nrpe  parted  snmp  sshd  telegraf  vim
複製代碼

若是咱們須要在受管機上安裝某個軟件,以telegraf這個role爲例:

root@Ansible ~/ansible-test/roles/telegraf $ tree
.
├── files
│   ├── telegraf-1.8.0-1.x86_64.rpm     #安裝包rpm文件
│   ├── telegraf.conf                   #自定義的配置文件
│   └── telegraf.conf.bak               #原始默認配置文件(非必須)
├── handlers
│   └── main.yml                        #處理器配置
└── tasks
    └── main.yml                        #role的任務主配置

3 directories, 5 files
-------------------------------------
root@Ansible ~/ansible-test/roles/telegraf $ cat ./tasks/main.yml
---

- name: install telegraf                #配置npm的下載地址
  yum: name=https://dl.influxdata.com/telegraf/releases/telegraf-1.8.0-1.x86_64.rpm state=present
  tags: telegraf

- name: copy telegraf config            #配置文件的複製
  copy: src=telegraf.conf dest=/etc/telegraf/
  notify: reload telegraf
  tags: telegraf

- name: ensure service telegraf is started and enabled
  service: name=telegraf state=started enabled=yes
  tags: telegraf                        #確保在受管機上開機啓動telegraf服務
-------------------------------------
root@Ansible ~/ansible-test/roles/telegraf $ cat ./handlers/main.yml
---

- name: reload telegraf                 #異常情況從新加載
  service: name=telegraf state=reloaded
複製代碼

而對於部分複雜的配置需求,咱們甚至可使用shell腳原本對受管機進行相關的處理,例如磁盤掛載或者分配等系統級別的任務。

root@Ansible ~/ansible-test/roles/parted $ ls
files  tasks
-------------------------------------
root@Ansible ~/ansible-test/roles/parted $ tree
.
├── files
│   ├── parted.sh                   #shell腳本文件
│   └── parted.sh.bak
└── tasks
    └── main.yml                    #主task配置

2 directories, 3 files
-------------------------------------
root@Ansible ~/ansible-test/roles/parted $ cat files/parted.sh
#!/bin/bash 
OPTS="noatime,nobarrier,errors=remount-ro,nofail"

x=b
#for x in {b}
#do
    echo "mkpart /dev/vd${x}"
    parted /dev/vd${x} -s mklabel gpt
    parted /dev/vd${x} -s mkpart primary 1 100%
    echo ">>> mkfs.ext4 /dev/vd${x}1"
    mkfs.ext4 -q /dev/vd${x}1
    if [ $? -eq 0 ]; then
        UUID=$(blkid /dev/vd${x}1 | sed -e 's/.*\(UUID=.*\) TYPE.*/\1/')
        echo -e "${UUID}\t\t/data\t\text4\t\t${OPTS}\t\t0 0" >> /etc/fstab
    fi
    seq=$(($seq+1))
#done #經過shell腳本進行磁盤的分區與掛載
-------------------------------------
root@Ansible ~/ansible-test/roles/parted $ cat tasks/main.yml
---
 #parted
- name: copy parted config
  copy: src={{ item }} dest=~ owner=root group=root mode="0777"
  with_items:                       #複製腳本到受管機並配置chown權限
    - parted.sh                     #執行shell腳本
  tags: parted
複製代碼

關於playbook的其餘功能你們能夠經過實踐和閱讀其餘案例來學習,ansible很是靈活,請務必善於使用。

附錄、參考文獻

  1. 戴爾yaml介紹
  2. Ansible Documents
  3. Ansible中文權威指南
  4. Ansible模塊Module
相關文章
相關標籤/搜索