自動化運維工具Ansible實戰(三)配置和命令集

一、Ansible配置

Ansible安裝好之後的配置文件有如下兩種:
1、yum安裝,配置文件默認路徑爲:
/etc/ansible/ansible.cfg
2、源碼包安裝,配置文件路徑需要從軟件包裏面拷貝,如下:

[root@Ansible ~]# mkdir /etc/ansible     --創建ansible目錄
[root@Ansible ~]# cp /usr/src/ansible-2.5.0/examples/* /etc/ansible/    --拷貝文件 *

該配置文件中定義了Ansible的主機的默認配置部分,如默認是否需要輸入密碼、是否開啓sudo認證、action_plugins插件的位置、hosts主機組的位置、是否開啓log功能、默認端口、key文件位置等等。

以下是配置文件的內容和詳細說明:

[root@Ansible ~]# vim /etc/ansible/ansible.cfg
 10 [defaults]        --通用默認配置
 14 #inventory      = /etc/ansible/hosts   --這個是默認庫文件位置,腳本,或者存放可通信主機的目錄
 15 #library        = /usr/share/my_modules/  --Ansible默認搜尋模塊的位置
 16 #module_utils   = /usr/share/my_module_utils/
 17 #remote_tmp     = ~/.ansible/tmp   --Ansible通過遠程傳輸模塊到遠程主機,然後遠程執行,執行後在清理現場.在有些場景下,你也許想使用默認路徑希望像更換補丁一樣使用
 18 #local_tmp      = ~/.ansible/tmp
 19 #plugin_filters_cfg = /etc/ansible/plugin_filters.yml
 20 #forks          = 5    --在與主機通信時的默認並行進程數 ,默認是5d
 21 #poll_interval  = 15   --當具體的poll interval沒有定義時,多少時間回查一下這些任務的狀態, 默認值是5秒
 22 #sudo_user      = root  --sudo使用的默認用戶 ,默認是root
 23 #ask_sudo_pass = True  --用來控制Ansible playbook 在執行sudo之前是否詢問sudo密碼.默認爲no
 24 #ask_pass      = True  --控制Ansible playbook 是否會自動默認彈出密碼
 25 #transport      = smart  --通信機制.默認 值爲’smart’。如果本地系統支持 ControlPersist技術的話,將會使用(基於OpenSSH)‘ssh’,如果不支持講使用‘paramiko’.其他傳輸選項包括‘local’, ‘chroot’,’jail’等等
 26 #remote_port    = 22  --遠程SSH端口。 默認是22
 27 #module_lang    = C  --模塊和系統之間通信的計算機語言,默認是C語言
 28 #module_set_locale = False
 36 #gathering = implicit  --控制默認facts收集(遠程系統變量). 默認值爲’implicit’, 每一次play,facts都會被收集
 59 #roles_path    = /etc/ansible/roles    -- roles 路徑指的是’roles/’下的額外目錄,用於playbook搜索Ansible roles
 62 #host_key_checking = False  --檢查主機密鑰
 87 #sudo_exe = sudo  --如果在其他遠程主機上使用另一種方式執sudu操作.可以使用該參數進行更換
 89 # What flags to pass to sudo  --傳遞sudo之外的參數
 91 #sudo_flags = -H -S –n
 94 #timeout = 10  --ssh超時時間
 98 #remote_user = root  --使用/usr/bin/ansible-playbook鏈接的默認用戶名,如果不指定,會使用當前登錄的用戶名
102 #log_path = /var/log/ansible.log  --日誌文件存放路徑
105 #module_name = command   --ansible命令執行默認的模塊
110 #executable = /bin/sh  --在sudo環境下產生一個shell交互接口. 用戶只在/bin/bash的或者sudo限制的一些場景中需要修改
115 #hash_behaviour = replace  --特定的優先級覆蓋變量
123 #jinja2_extensions = jinja2.ext.do,jinja2.ext.i18n  --允許開啓Jinja2拓展模塊
127 #private_key_file = /path/to/file  --私鑰文件存儲位置
131 #vault_password_file = /path/to/vault_password_file  --設置密碼文件,也可以通過命令行指定“–vault-password-file”
136 #ansible_managed = Ansible managed: {file} modified on %Y-%m-%d %H:    %M:%S by {uid} on {host}   --這個設置可以告知用戶,Ansible修改了一個文件,並且手動寫入的內容可能已經被覆蓋
145 #display_skipped_hosts = True   --顯示任何跳過任務的狀態 ,默認是顯示
160 #error_on_undefined_vars = False  -- 如果所引用的變量名稱錯誤的話, 將會導致ansible在執行步驟上失敗
166 #system_warnings = True  --允許禁用系統運行ansible相關的潛在問題警告
171 #deprecation_warnings = True  --允許在ansible-playbook輸出結果中禁用“不建議使用”警告
179 # command_warnings = False  --當shell和命令行模塊被默認模塊簡化的時,Ansible 將默認發出警告
203 #bin_ansible_callbacks = False  --用來控制callback插件是否在運行 /usr/bin/ansible 的時候被加載. 這個模塊將用於命令行的日誌系統,發出通知等特性
208 #nocows = 1  --默認ansible可以調用一些cowsay的特性   開啓/禁用:0/1
226 #nocolor = 1  --輸出帶上顏色區別, 開啓/關閉:0/1

Ansible官方配置文件
http://www.ansible.com.cn/docs/intro_configuration.html#environmental-configuration

Ansible默認的配置都是註釋掉的(#),可以通過去掉#來進行開啓相應的配置服務。比如啓用日誌,更改相應的hosts文件的路徑等等。如查看日誌,當再次操作Ansible的時候就可以查看生成的日誌了。

[root@Ansible ~]# vim /etc/ansible/ansible.cfg
102 log_path = /var/log/ansible.log     --把註釋(#)去掉
[root@Ansible ~]# ansible web -m  ping  --執行Ansible命令
192.168.8.55 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
[root@Ansible ~]# cat /var/log/ansible.log     --查看日誌
2018-04-19 15:22:05,533 p=80580 u=root |  192.168.8.55 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

二、Ansible命令集

安裝完Ansible後,發現Ansible一共爲我們提供了十個指令:ansible、ansible-console、ansible-inventory、ansible-vault、ansible-config、ansible-doc、ansible-playbook、ansible-connection、ansible-galaxy、ansible-pull。

1、ansible

[root@Ansible ~]# ansible -h
Usage: ansible <host-pattern> [選項]

ansible是指令核心部分,其主要用於執行ad-hoc命令,即單條命令。默認後面需要跟主機和選項部分,默認不指定模塊時,使用的是command模塊。如:

[root@Ansible ~]# ansible 192.168.8.66 -a 'uptime'
192.168.8.66 | SUCCESS | rc=0 >>
 15:27:24 up 1 day,  1:39,  4 users,  load average: 0.07, 0.05, 0.05

[root@Ansible ~]# ansible –help
Usage: ansible <host-pattern> [options]
**命令選項:**
-a MODULE_ARGS, --args=MODULE_ARGS   # 模塊的參數
--ask-vault-pass   # vault 密碼
-B SECONDS, --background=SECONDS   # 異步運行時,多長時間超時
-C, --check   # 只是測試一下會改變什麼內容,不會真正去執行;相反,試圖預測一些可能發生的變化
-D, --diff   # 當更改文件和模板時,顯示這些文件得差異,比--check效果好
-e EXTRA_VARS, --extra-vars=EXTRA_VARS   # 添加附加變量,比如key=value,yaml,json格式
-f FORKS, --forks=FORKS   # 指定定要使用的並行進程數,默認爲5個
-h, --help   # 顯示此幫助信息並退出
-i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY   # 指定主機清單文件或逗號分隔的主機,默認爲/etc/ansible/hosts(或者從源碼包拷貝)
-l SUBSET, --limit=SUBSET   # 進一步限制所選主機/組模式,只執行-l 後的主機和組。 也可以這樣使用-l @retry_hosts.txt
--list-hosts   # 輸出匹配主機的列表,不執行其他任何操作
-m MODULE_NAME, --module-name=MODULE_NAME   # 要執行的模塊,默認爲command
-M MODULE_PATH, --module-path=MODULE_PATH   # 要執行的模塊的路徑,默認爲/usr/share/ansible/
-o, --one-line   # 壓縮輸出,摘要輸出.嘗試一切都在一行上輸出
--playbook-dir=BASEDIR   # 由於此工具不使用劇本,因此將其用作替代劇本目錄。這爲很多功能設置了相對路徑,包括roles/ group_vars/etc等
-P POLL_INTERVAL, --poll=POLL_INTERVAL   # 如果使用-B,則設置輪詢間隔,默認爲15秒
--syntax-check   # 對playbook進行語法檢查,且不執行playbook
-t TREE, --tree=TREE   # 日誌輸出到該目錄,日誌文件名會以主機名命名
--vault-id=VAULT_IDS   # 要使用的vault標識
--vault-password-file=VAULT_PASSWORD_FILES  # vault密碼文件
-v, --verbose   # 輸出執行的詳細信息,使用-vvv獲得更多,-vvvv 啓用連接調試
--version   # 顯示程序的版本號並退出

**連接選項:**
-k, --ask-pass   # 要求用戶輸入請求連接密碼
--private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE   # 私鑰路徑,使用這個文件來驗證連接
-u REMOTE_USER, --user=REMOTE_USER   # 連接遠程用戶,默認爲空
-c CONNECTION, --connection=CONNECTION   # 連接類型,默認smart,支持local ssh 和 paramiko
-T TIMEOUT, --timeout=TIMEOUT   # 指定默認超時時間,默認是10S
--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)運行操作(不推薦使用)
-U SUDO_USER, --sudo-user=SUDO_USER   # sudo 用戶,默認爲root(不推薦使用)
-S, --su   # 使用su運行操作(不推薦使用)
-R SU_USER, --su-user=SU_USER   # su 用戶,默認爲root(不推薦使用)
-b, --become   # 運行操作(不暗示密碼提示)
--become-method=BECOME_METHOD   # 權限升級方法使用,默認爲sudo,有效選擇:sudo 、su、pbrun、pfexec、doas、dzdo、ksu、runas、pmrun、enable
--become-user=BECOME_USER   # 使用哪個用戶運行(默認爲root)
--ask-su-pass   # 要求輸入su密碼(不推薦使用)
-K, --ask-become-pass   # 請求特權升級密碼

2、ansible-playbook

[root@Ansible ~]# ansible-playbook -h
Usage: ansible-playbook [options] playbook.yml [playbook2 ...]

相對於ansible,增加了下列選項:

--flush-cache # 清除fact緩存
--syntax-check # 語法檢查
--force-handlers # 如果任務失敗,也要運行handlers
--list-tags # 列出所有可用的標籤
--list-tasks # 列出將要執行的所有任務
--skip-tags=SKIP_TAGS # 跳過運行標記此標籤的任務
--start-at-task=START_AT_TASK # 在此任務處開始運行
--step # 一步一步:在運行之前確認每個任務
-t TAGS, --tags=TAGS # 只運行標記此標籤的任務

該指令對於需反覆執行的、較爲複雜的任務,我們可以通過定義 Playbook 來搞定。它允許使用變量、條件、循環、以及模板,也能通過角色及包含指令來重用既有內容。其通過讀取playbook 文件後,執行相應的動作,這個後面會詳細講到。

3、ansible-doc

[root@Ansible ~]# ansible-doc -h
Usage: ansible-doc [-l|-F|-s] [選項] [-t <插件類型> ] [插件]

該指令用於查看模塊信息,常用參數有兩個-l 和 -s ,具體如下:

--# 列出所有已安裝的模塊
[root@Ansible ~]# ansible-doc  -l 

--# 查看具體某模塊的用法,這裏查看command模塊
[root@Ansible ~]# ansible-doc -s command

4、ansible-pull

[root@Ansible ~]# ansible-pull -h
Usage: ansible-pull -U <庫> [選項] [<playbook.yml>]

該指令使用需要談到ansible的另一種模式---pull 模式,這和我們平常經常用的push模式剛好相反,其適用於以下場景:你有數量巨大的機器需要配置,即使使用非常高的線程還是要花費很多時間;你要在一個沒有網絡連接的機器上運行Anisble,比如在啓動之後安裝。

5、ansible-config

[root@Ansible ~]# ansible-config -h
Usage: ansible-config [view|dump|list] [--help] [選項] [ansible.cfg]
  • view(查看):顯示當前的配置文件
  • dump(轉儲):顯示當前設置,合併ansible如果指定.cfg
  • list(列表)列出所有讀取lib/constants.py的當前配置並顯示env和config文件設置名稱

該指令是一個配置命令行類。查看、編輯、管理Ansible配置。

6、ansible-galaxy

[root@Ansible ~]# ansible-galaxy -h
Usage: ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ...

ansible-galaxy 該指令用於共享和下載roles的工具,方便的從https://galaxy.ansible.com/ 站點下載第三方擴展模塊,我們可以形象的理解其類似於centos下的yum、python下的pip或easy_install 。如下示例:

[root@Ansible ~]# ansible-galaxy install aeriscloud.docker
- downloading role 'docker', owned by aeriscloud
- downloading role from https://github.com/AerisCloud/ansible-docker/archive/v1.2.1.tar.gz
- extracting aeriscloud.docker to /etc/ansible/roles/aeriscloud.docker
- aeriscloud.docker was installed successfully

這個安裝了一個aeriscloud.docker組件,前面aeriscloud是galaxy上創建該模塊的用戶名,後面對應的是其模塊。在實際應用中也可以指定txt或yml 文件進行多個組件的下載安裝。這部分可以參看官方文檔

7、ansible-vault

[root@Ansible ~]# ansible-vault -h
Usage: ansible-vault [create|decrypt|edit|encrypt|encrypt_string|rekey|view] [options] [vaultfile.yml]

該指令是一個文件加解密工具,應用於配置文件中含有敏感信息,又不希望他能被人看到,vault可以幫你加密/解密這個配置文件,屬高級用法。主要對於playbooks裏比如涉及到配置密碼或其他變量時,可以通過該指令加密,這樣我們通過cat看到的會是一個密碼串類的文件,編輯的時候需要輸入事先設定的密碼才能打開。這種playbook文件在執行時,需要加上 –ask-vault-pass參數,同樣需要輸入密碼後才能正常執行。具體該部分可以參查官方博客

8、ansible-inventory

[root@Ansible ~]# ansible-inventory -h
Usage: ansible-inventory [options] [host|group]

該指令用於在Ansible看到它時顯示或轉儲配置的清單信息。

9、ansible-console

[root@Ansible ~]# ansible-console -h
Usage: ansible-console [<host-pattern>] [options]

該指令是一個REPL控制檯允許執行Ansible任務(基於dominis’ansible-shell)。

10、ansible-connection

該指令是一個連接類型,可以是 local、ssh 或 paramiko,ansible1.2 之前默認爲 paramiko。

Ansible官方文檔:
http://docs.ansible.com/ansible/latest/search.html?q=ansible-doc&check_keywords=yes&area=default

以上就是Ansible常用的命令格式及參數,在接下來的學習中會逐步運用的。

三、Ad-Hoc

1、Ad-Hoc簡介

所謂 ad-hoc 命令是什麼呢?
這其實是一個概念性的名字,是相對於寫 Ansible playbook 來說的。類似於在命令行敲入shell命令和寫shell scripts兩者之間的關係。
如果我們敲入一些命令去比較快的完成一些事情,而不需要將這些執行的命令特別保存下來,這樣的命令就叫做 ad-hoc 命令。
Ansible提供兩種方式去完成任務
(1)ad-hoc命令
執行shell命令,或shell腳本。可以執行一些簡單的命令,不需要將這些執行的命令特別保存下來。適合執行簡單的命令。

(2)Ansible playbook
可以解決比較複雜的任務,可以將命令保存下來。適合執行配置管理或部署客戶機。

Ad-Hoc是指Ansible下臨時執行的一條命令,並且不需要保存的命令,對於複雜的命令會使用playbook。Ad-hoc的執行依賴於模塊,Ansible官方提供了大量的模塊。如:command、raw、shell、file、cron等,具體可以通過ansible-doc -l 進行查看。可以使用ansible-doc -s module來查看某個模塊的參數,也可以使用ansible-doc help module來查看該模塊更詳細的信息。

2、Ad-Hoc用法

接下來我們詳細講解該命令的用法:
(1)命令說明


ansible [主機或組] -m [模塊名] -a ['模塊參數'] [ansible參數]

主機和組,是在/etc/ansible/hosts 裏進行指定的部分,當然動態Inventory 使用的是腳本從外部應用裏獲取的主機;
模塊名,可以通過ansible-doc -l 查看目前安裝的模塊,默認不指定時,使用的是command模塊,具體可以查看/etc/ansible/ansible.cfg 的“#module_name = command ” 部分,默認模塊可以在該配置文件中進行修改;
模塊參數,可以通過 “ansible-doc -s 模塊名” 查看具體的用法及後面的參數;
ansible參數,可以通過ansible命令的幫助信息裏查看到,這裏有很多參數可以供選擇,如是否需要輸入密碼、是否sudo等。

(2)後臺執行
當命令執行時間比較長時,也可以放到後臺執行,使用-B、-P參數,如下:

ansible all -B 3600 -a "/usr/bin/long_running_operation --do-stuff"     # 後臺執行命令3600s,-B 表示後臺執行的時間
ansible all -m async_status -a "jid=123456789"    # 檢查任務的狀態
ansible all -B 1800 -P 60 -a "/usr/bin/long_running_operation --do-stuff"     # 後臺執行命令最大時間是1800s即30分鐘,-P 每60s檢查下狀態,默認15s

(3)命令執行模塊
命令執行模塊包含如下4個模塊:

  • command模塊:該模塊通過-a跟上要執行的命令可以直接執行,不過命令裏如果有帶有如下字符部分則執行不成功 “ "<", ">", "|", "&" ;
  • shell 模塊:用法基本和command一樣,不過其是通過/bin/sh進行執行,所以shell 模塊可以執行任何命令,就像在本機執行一樣;
  • raw模塊:用法和shell 模塊一樣 ,也可以執行任意命令,就像在本機執行一樣;
  • script模塊:其是將管理端的shell 在被管理主機上執行,其原理是先將shell 複製到遠程主機,再在遠程主機上執行,原理類似於raw模塊。

說明:raw模塊和comand、shell 模塊不同的是其沒有chdir、creates、removes參數,chdir參數的作用就是先切到chdir指定的目錄後,再執行後面的命令,這在後面很多模塊裏都會有該參數 。接下來會進行詳細的介紹:

command模塊包含如下選項:

  • creates:創建一個文件名,當該文件存在,則該命令不執行
  • free_form:要執行的linux指令
  • chdir:在執行指令之前,先切換到該指定的目錄
  • removes:一個文件名,當該文件不存在,則該選項不執行
  • executable:切換shell來執行指令,該執行路徑必須是一個絕對路徑

例1 使用chdir的示例

[root@Ansible ~]# ansible 192.168.8.66 -m command -a 'chdir=/tmp touch test.txt' 
192.168.8.66 | SUCCESS | rc=0 >>
--# 結果顯示:進入tmp目錄然後創建test.txt文件

[root@Ansible ~]# ansible 192.168.8.66 -m shell -a 'chdir=/tmp touch test.txt'
192.168.8.66 | SUCCESS | rc=0 >>
--# 結果顯示:進入tmp目錄然後創建test.txt文件

[root@Ansible ~]# ansible 192.168.8.66 -m raw -a 'chdir=/tmp touch test.txt'
192.168.8.66 | SUCCESS | rc=0 >>
Shared connection to 192.168.8.66 closed.
--# 結果顯示:進入當前執行用戶的家目錄然後創建test.txt文件

說明:三個命令都會返回執行成功的狀態。不過實際上只有前兩個文件會被創建成功。使用raw模塊執行的結果文件事實上也被正常創建了,不過不是在chdir指定的目錄,而是在當前執行用戶的家目錄。

例2 使用creates與removes示例

--# 當/tmp/test.txt文件存在時,則不執行who指令;則反之
[root@Ansible ~]# ansible 192.168.8.66 -m command -a 'creates=/tmp/test.txt who'
192.168.8.66 | SUCCESS | rc=0 >>
skipped, since /tmp/test.txt exists

--# 當/tmp/test.txt文件存在時,則執行who指令;則反之
[root@Ansible ~]# ansible 192.168.8.66 -m command -a 'removes=/tmp/test.txt who'
192.168.8.66 | SUCCESS | rc=0 >>
root     tty1         2018-04-17 17:07
root     pts/0        2018-04-19 16:51 (192.168.8.1)
root     pts/1        2018-04-19 17:16 (192.168.8.55)

自動化運維工具Ansible實戰(三)配置和命令集

例3 script模塊實例
首先在Ansible服務器上創建一個腳本並賦予可執行權限

[root@Ansible ~]# vim script.sh
#/bin/bash
ifconfig ens33
df -h

[root@Ansible ~]# chmod +x script.sh 
[root@Ansible ~]# ansible 192.168.8.66 -m script -a 'script.sh'
192.168.8.66 | SUCCESS => {
    "changed": true,
    "rc": 0,
    "stderr": "Shared connection to 192.168.8.66 closed.\r\n",
"stdout": 
……
    "stdout_lines": [
        "ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500",
        "        inet 192.168.8.66  netmask 255.255.255.0  broadcast 192.168.8.255",
        ……
        "",
        "文件系統        容量  已用  可用 已用% 掛載點",
        "/dev/sda3        28G  1.7G   26G    7% /",
        "devtmpfs        983M     0  983M    0% /dev",
        "tmpfs           993M     0  993M    0% /dev/shm",
        "tmpfs           993M  8.7M  984M    1% /run",
        "tmpfs           993M     0  993M    0% /sys/fs/cgroup",
        "/dev/sda1       497M  109M  389M   22% /boot",
        "tmpfs           199M     0  199M    0% /run/user/0"
    ]
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章