ansible使用知識概要和腦圖
ansible
概要
DEVOP類工具
Infrastructure As Code [ IaC ]
被控制機器只要可以SSH即可,依賴少
安裝
DNF YUM等直接安裝
基本概念
inventory
- 支持yaml等多種配置方式
- 分組
- 變量
運行設置
ANSIBLE_CONFIG
- 當前目錄的 ansible.cfg
- 當前用戶的~/.ansible.cfg
- /etc/ansible/ansible.cfg
模塊
- 模塊是Ansible執行的最小單位,可以是由Python編寫,也可以是Shell編寫,也可以是由其他語言編寫。
- ansible all -m ping
對invenroty定義的所有主機(all)執行ping模塊檢查主機的互通性 - ansible-doc 可以查看模塊的詳細說明和配置
ansible-doc ping
劇本play-book
- playbook是由一個或多個play組成的列表,play的主要功能在于將事先歸并為一組的主機裝扮成事先通過ansible中的task定義好的角色。從根本上來講,所謂的task無非是調用ansible的一個module。將多個play組織在一個playbook中,即可以讓它們聯合起來按事先編排的機制完成某一任務
- 核心元素
- Hosts 執行的遠程主機列表
- Tasks 任務集
- Varniables 內置變量或自定義變量在playbook中調用
- Templates 模板,即使用模板語法的文件,比如配置文件等
- Handlers 和notity結合使用,由特定條件觸發的操作,滿足條件方才執行,否則不執行
- tags 標簽,指定某條任務執行,用于選擇運行playbook中的部分代碼。
Role
- 主要作用是重playbook ansible中將其組織成role,他有著固定的組織格式。以便playbook調用
基本命令
ansible
ansible-doc
ansible-playbook
ansible-galaxy
ansible-inventory
ansible-console
ansible-config
ansible-connection
ansible-vault
ansible-pull
模塊
執行命令的幾個模塊區別
- command模塊 [執行遠程命令]command不支持特殊字符
[root@node1 ansible]# ansible testservers -m command -a 'uname -n' - script模塊 [在遠程主機執行主控端的shell/python腳本 ] (使用相對路徑)
[root@node1 ansible]# ansible testservers -m script -a '/etc/ansible/test.sh - shell模塊 [執行遠程主機的shell/python腳本]shell模塊可以支持特殊字符
[root@node1 ansible]# ansible testservers -m shell -a 'bash /root/test.sh' - raw模塊 [類似于command模塊、支持管道傳遞]
[root@node1 ansible]# ansible testservers -m raw -a "ifconfig eth0 |sed -n 2p |awk '{print $2}' |awk -F: '{print $2}'"
copy模塊見名知義,copy模塊的作用就是拷貝文件,而copy模塊是將ansible主機上的文件拷貝到遠程主機中
-m copy -a "src=/data/module/tmp/jenkins/ac-wehub dest=/data/module/tmp/jenkins/"
fetch模塊是從遠程主機中拉取文件到ansible主機
file模塊可以幫助我們完成一些對文件的基本操作,比如,創建文件或目錄、刪除文件或目錄、修改文件權限等
synchronize模塊:使用ansible copy模復制文件夾效率遠遠不及synchronize, 同一個77m大小的文件,copy模塊需要耗時一分多,但是synchronize只要5秒[synchronize的主要弊端是需要安裝rsync]
-m synchronize -a "src=/data/module/tmp/jenkins/ac-wehub dest=/data/module/tmp/jenkins/ delete=yes checksum=yes "
-m synchronize -a "src=/tmp/client/ dest=/tmp/server mode=pull" 【push 時,src 需要填本地目錄,dest 填遠程主機目錄】
使用步驟概要
ssh免密登錄
- ssh-keygen
- ssh-copy-id -i ~/.ssh/id_rsa.pub 用戶名字@192.168.x.xxx
- ssh 用戶名字@192.168.x.xxx
如上2步即可免密登錄遠端機器
ansible
- 簡單的單個的任務的執行使用
- 1 ansible.cfg
可選,是否修改運行的設置 - 2定義主機文件
分組、變量
必須- [proxy]
192.168.88.10
svr_proxy ansible_ssh_port=22 ansible_ssh_host=192.168.88.10
[seaweedfs]
192.168.88.11
svr_seaweed ansible_ssh_port=22 ansible_ssh_host=192.168.88.11
[server:children]
proxy
seaweedfs
[server:vars]
ansible_ssh_user ansible_ssh_pass
ansible_ssh_user=vagrant
ansible_ssh_private_key_file=./key/id_rsa
host_key_checking=false
- 常用命令解析
- ansible proxy -i inventory -m shell -a 'grep -rins "AES" /opt/openresty/nginx/conf/nginx.conf'
在哪些主機上執行,all是主機清單中的所有主機,上例是在proxy主機
-i 主機清單
-m 執行那個模塊
-a 模塊的參數設置
-v 最多4個-vvvv,越多越詳細
- ansible proxy -i inventory -m shell -a 'grep -rins "AES" /opt/openresty/nginx/conf/nginx.conf'
- 模塊的參數如何設置
- ansible-doc
- 這個參考非常詳細,文檔輸出中有例子
ansible-playbook
- 運行一組編排好的命令
- 例子 sample.yml
-
hosts: all
tasks:- name: Recursively remove directory
file:
path: /tmp/seaweedfs
state: absent
- name: Recursively remove directory
-
hosts: proxy
tasks:-
name: SELINUX=disabled
selinux: state=disabled -
name: openresty service start
service:
name: openresty.service
state: "{{ CMD }}"
when: ( "started" == (CMD) )
ignore_errors: True
-
- ansible-playbook -i inventory sample.yml -e "CMD=started"
ROLE
- 涉及劇本重用
- Collection / galaxy
官網等地方有很多已經寫好的角色,比如nginx的安裝部署等等
XMind: ZEN - Trial Version
