一 Ansible命令用法 Ansible命令行執行方式有:Ad-Hoc、Ansible-playbook兩種,Web方式其官方提供付費產品Tower。Ad-Hoc主要用於臨時命令的執行,Ansible-playbook相當於Ad-Hoc的集合,通過一定的規則編排在一起執行。 1.1 免密鑰 提示: ...
一 Ansible命令用法
Ansible命令行執行方式有:Ad-Hoc、Ansible-playbook兩種,Web方式其官方提供付費產品Tower。Ad-Hoc主要用於臨時命令的執行,Ansible-playbook相當於Ad-Hoc的集合,通過一定的規則編排在一起執行。
1.1 免密鑰
1 [root@manage ~]# ssh-keygen -t rsa -P ''
1 [root@localhost ~]# mkdir .ssh 2 [root@manage ~]# scp -p /root/.ssh/id_rsa.pub [email protected]:/root/.ssh/authorized_keys 3 [root@manage ~]# scp -p /root/.ssh/id_rsa.pub [email protected]:/root/.ssh/authorized_keys 4 [root@manage ~]# scp -p /root/.ssh/id_rsa.pub [email protected]:/root/.ssh/authorized_keys
提示:也可使用以下命令複製到相應的主機:
1 [root@manage ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
1.2 Ad-Hoc基礎命令
基本語法:
1 ansible <host-pattern> [options]
<host-pattern>:指Inventory中定義的主機或主機組,可以為ip、hostname、Inventory中的group組名等。同時支持具有“.”、“*”或“:”等特殊字元的匹配型字元串。
提示:<>表示該選項為必選,[]表述是該選項中的參數任選其一或多個。
1 [options]: 2 -v,--verbose:輸出更詳細的執行過程信息,-vvv可得到執行過程所有信息; 3 -i PATH,--inventory=PATH:指定inventory信息,預設/etc/ansible/hosts; 4 -f NUM,--forks=NUM:併發線程數,預設5個線程; 5 --private-key=PRIVATE_KEY_FILE:指定秘鑰文件; 6 -m NAME,--module-name=NAME:指定執行使用的模塊;
提示:-m指定模塊名稱, 預設情況下是指command模塊, 可以省略不寫。
1 -M DIRECTORY,--module-path=DIRECTORY:指定模塊存放路徑,預設/usr/share/ansible; 2 -a 'ARGUMENTS',--args=‘ARGUMENTS’"模塊參數; 3 -k,--ask-pass SSH:認證密碼; 4 -K,ask-sudo=pass sudo:用戶的密碼(--sudo時使用); 5 -o,--one-line:標準輸出至一行; 6 -s,--sudo:相當於Linux系統下的sudo命令; 7 -t DIRECTORY,--tree=DIRECTORY:輸出信息至DIRECTORY目錄下,結果文件以遠程主機命名; 8 -T SECONDS,--timeout=SECONDS:指定連接遠程主機的最大超時,單位是秒; 9 -B NUM,--background=NUM:後臺執行命令,超NUM秒後中止正在執行的任務; 10 -P NUM,--poll=NUM:定期返回後臺任務進度; 11 -u USERNAME,--user=USERNAME:指定遠程主機以USERNAME運行命令; 12 -U SUDO_USERNAME,--sudo-user=SUDO_USERNAME:使用sudo,相當於Linux系統下的sudo命令; 13 -c CONNECTION,--connection=CONNECTION:指定連接方式,可用選項paramiko(SSH)、ssh、local,local方式常用於crontab和kickstarts; 14 -l SUBSET,--limit=SUBSET:指定運行主機; 15 -l ~REGEX,--limit=~REGEX:指定運行主機(正則); 16 --list-hosts:列出符合條件的主機列表,不執行任何命令。
1.3 playbook基礎命令
基本語法:
1 ansible-playbook <PLAYBOOKNAME>
1 --ask-vault-pass:加密playbook文件時提示輸入密碼; 2 -D,--diff:顯示文件更新的不同的地方; 3 -e EXTRA_VARS,--extra-vars=EXTRA_VARS:在playbook中引入外部變數; 4 --flush-cache:將fact清除到的遠程主機緩存; 5 --force-handlers:強制運行handlers任務,即使在任務失敗的情況下; 6 -i INVENTORY:指定要讀取的Inventory文件; 7 --list-tags:列出所有可用的tags; 8 --list-tasks:列出所有即將被執行的任務; 9 --skip-tags=SKIP_TAGS:跳過指定的tags任務; 10 --start-at-task=START_AT_TASK:從第幾條任務開始執行; 11 --step:逐步執行playbook定義的任務,並經人工確認後繼續執行下一個任務; 12 --syntax-check:檢查playbook中的語法書寫; 13 -t TAGS,--tags=TAGS:指定執行tags的任務。
二 Ansible系列命令介紹
2.1 ansible
ansible是Ansible基礎命令之一,起主要在如下場景使用:
- 非固化需求;
- 臨時性操作;
二次開發介面調用。
2.2 ansible-galaxy
ansible-galaxy類似GitHub或PIP功能,通過ansible-galaxy命令可查找和安裝優秀的Roles。
基本語法:
1 ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] 2 [options] 3 info:列出指定Role詳細信息; 4 install:下載並安裝galaxy指定的Roles到本地; 5 list:列出本地已下載的Roles; 6 remove:刪除本地已下載的Roles。
2.3 ansible-pull
Ansible預設使用push模式,使用ansible-pull命令可使用Ansible另一種工作模式,pull模式。通常適應於以下場景:
大量機器需要配置,即使使用高併發線程依舊要花費很長時間;
在沒有網路的機器上運行Ansible。
基本語法:
1 ansible-pull -U <repository> [options] [<playbook.yml>]
提示:通過ansible-pull結合Git和crontab可實現通過crontab定期拉取指定的Git版本到本地,並以指定模式自動運行預先制訂的指令。
2.4 ansible-doc
ansible-doc是Ansible模塊文檔說明,針對每個模塊都有詳細的用法及應用案例介紹,類似Linux的man。
基本語法:
1 ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]
示例:
1 [root@manage ~]# ansible-doc -l #列出支持的模塊 2 [root@manage ~]# ansible-doc ping #查看模塊功能說明
2.5 ansible-playbook
ansible-playbook是日常使用頻率最高的命令,通過讀取預先編寫好的playbook文件實現批量管理。Playbook具有編寫簡單、可定製性高、靈活方便,以及可固化日常所有操作的特點。
基本語法:
1 ansible-playbook [options] playbook.yml [playbook2 ...]
2.6 ansible-vault
ansible-vault主要用於配置文件加密,如編寫的Playbook配置文件中包含敏感信息,可使用ansible-vault加密/解密此配置文件。
基本語法:
1 ansible-vault [create|decrypt|edit|encrypt|encrypt_string|rekey|view] [options] [vaultfile.yml]
加密示例:
1 ansible-vault encrypt test.yml
解密示例:
1 ansible-vault decrypt test.yml
2.7 ansible-console
ansible-console是Ansible提供的互動式工具,用戶可以在ansible-console虛擬出的終端上類似Shell使用Ansible內置命令。
三 Inventory配置及詳解
Inventory是Ansible管理主機信息的配置文件,預設存放於:/etc/ansible/hosts,命令使用Inventory分組格式如下:ansible -i /etc/ansible/hosts myhost -m ping
3.1 定義主機和組
1 [root@manage ~]# vi /etc/ansible/hosts 2 172.24.8.31 #可直接定義IP地址 3 client02 #可定義主機名 4 client03:2345 #可指定非標準22埠 5 [myhost] #定義一個名為myhost的分組 6 172.24.8.31 7 172.24.8.3[2:4] #代表172.24.8.32/172.24.8.33/172.24.8.34也屬於此分組
提示:支持同一個主機屬於多個分組。
3.2 定義主機變數
1 172.24.8.31 ntp_server=ntp1.aliyun.com
3.3 定義組變數
1 [myhost:vars] 2 ntp_server=ntp1.aliyun.com #定義myhost組中所有主機的ntp_server值
3.4 定義組嵌套及組變數
1 [myhost1] 2 172.24.8.31 3 [myhost2] 4 172.24.8.32 5 172.24.8.33:2345 6 [myhost:children] 7 myhost1 8 myhost2 9 [myhost:vars] 10 ntp_server=ntp1.aliyun.com
3.5 多重變數定義
變數除了可以定義在Inventory中,也可以獨立於Inventory文件之外,通常以.yml、.yaml、.json為尾碼或者無尾碼。器讀取順序如下:
- Inventory配置文件(預設/etc/ansible/hosts)
- Playbook中的vars定義的區域
- Roles中的vars目錄下的文件
- Roles同級目錄group_vars和hosts_vars目錄下的文件
四 Ansible與正則
4.1 全量匹配
1 [root@manage ~]# ansible "*" -m ping 2 [root@manage ~]# ansible all -m ping 3 [root@manage ~]# ansible 172.24.8.* -m ping
4.2 邏輯或(or)匹配
1 [root@manage ~]# ansible myhost1:myhost2 -m ping
4.3 邏輯非(!)匹配
1 [root@manage ~]# ansible myhost:\!myhost2 -m ping
提示:所有在myhost組裡但不在myhost2組的主機。
去掉!特殊意義,可採用\。
4.4 邏輯與(&)匹配
1 [root@manage ~]# ansible myhost:\&myhost2 -m ping #myhost組和myhost2組同時存在的主機
4.5 多條件組合
1 [root@manage ~]# ansible myhost1:myhost2:\&myhost3:\!myhost4 -m ping 2 #myhost1組和myhost2組所有主機在myhost3中存在的,且不屬於myhost4的主機。
4.6 模糊匹配
1 [root@manage ~]# ansible 172* -m ping #所有以172開頭的主機
4.7 域切割
1 [root@manage ~]# ansible myhost2[0] -m ping 2 [root@manage ~]# ansible myhost2[0:1] -m ping
提示:Ansible底層基於Python,Ansible也支持獲取數組相應值。如:
1 [myhost2] 2 172.24.8.32 3 172.24.8.33:2345 4 myhost2[0]:第一個值,172.24.8.32; 5 myhost2[-1]:最後一個值,172.24.8.33; 6 myhost2[0:1]:第一個值和第二個值; 7 myhost2[1:]:第一個值導最後一個值。