ansible基本架構以下圖所示html
主控端支持local,ssh,zeromq三種方式鏈接被控端,默認使用基於ssh的鏈接--------這部分對應基本架構架構圖中的鏈接模塊;node
能夠按應用類型等法師進行Host Inventory(主機羣)分類,管理節點經過各種模塊實現相應的操做,---單個模塊,單條命令稱爲ad-hocpython
管理節點統一經過playbooks實現多個task的集合實現一類功能,如web服務的安裝部署,數據庫服務端的批量備份等,palybooks咱們能夠理解爲劇本,經過組合多條ad-hoc操做的配置文件c++
ansible默認是經過ssh通道來管理的,也就是它所說的免客戶端方式來管理,底層是經過paramiko來實現的git
ansible執行過程大致過程以下圖,其中暖色的表明模塊化github
名稱 | IP | 操做系統 | 用途 |
---|---|---|---|
ansible-server | 192.168.11.17 | centos7 | 管理端 |
client-1 | 192.168.11.18 | centos7 | |
client-2 | 192.168.11.19 | centos7 |
須要先配置epel源,能幫助咱們解決軟件包的依賴關係 yum install http://mirrors.163.com/centos/7.4.1708/extras/x86_64/Packages/epel-release-7-9.noarch.rpm # epel源 並安裝ansible ll /etc/yum.repos.d/epel* # 安裝 yum install ansible -y
參考博客: https://blog.51cto.com/tengxiansheng/1863688web
源碼安裝須要首先確保安裝了git
,由於它的源碼是保存在GitHub,咱們須要利用git將其clone下來而後本地編譯安裝shell
安裝git yum install -y git
數據庫
安裝ansiblecentos
git clone https://github.com/ansible/ansible.git -recursive cd ./ansible source ./hacking/env-setup
具體安裝過程本身能夠嘗試哦,這裏就不截圖展現了。
驗證安裝是否安裝OK能夠參考上面的ansible --version
解決依賴
yum install python-pip python-devel gcc gcc-c++ glibc-devel zlib-devel openssl-devel -y
pip 安裝ansible
pip install ansibele --upgrade 驗證安裝是否安裝OK能夠參考上面的ansible --version ansible --version 查看版本
兩個核心文件:ansible.cfg和hosts文件,默認都存放在/etc/ansible目錄下。
hosts:機器清單,進行分組管理
文件配置經常使用參數
使用化境變量方式來配置 大多數的Ansible參數能夠經過設置帶有ANSIBLE_開頭的環境變量進行配置,參數名稱必須都是大寫字母,以下配置: export ANSIBLE_SUDO_USER=root 設置了環境變量以後,ANSIBLE_SUDO_USER就能夠在playbook中直接引用。 二、設置ansible.cfg配置參數 Ansible有不少配置參數,下面列出經常使用的配置參數: 1)inventory 該參數表示資源清單inventory文件的位置,資源清單就是一些Ansible須要鏈接管理的主機列表 inventory = /root/ansible/hosts 2)library Ansible的操做動做,不管是本地或遠程,都使用一小段代碼來執行,這小段代碼稱爲模塊,這個library參數就是指向存放Ansible模塊的目錄 library = /usr/share/ansible 3)forks 設置默認狀況下Ansible最多能有多少個進程同時工做,默認設置最多5個進程並行處理。具體須要設置多少個,能夠根據控制主機的性能和被管理節點的數量來肯定。 forks = 5 4)sudo_user 這是設置默認執行命令的用戶,也能夠在playbook中從新設置這個參數 sudo_user = root 5)remote_port 這是指定鏈接被關節點的管理端口,默認是22,除非設置了特殊的SSH端口,否則這個參數通常是不須要修改的 remote_port = 22 6)host_key_checking 這是設置是否檢查SSH主機的密鑰。能夠設置爲True或False host_key_checking = False 7)timeout 這是設置SSH鏈接的超時間隔,單位是秒。 timeout = 20 8)log_path Ansible系統默認是不記錄日誌的,若是想把Ansible系統的輸出記錄到人i治穩健中,須要設置log_path來指定一個存儲Ansible日誌的文件 log_path = /var/log/ansible.log 另外須要注意,執行Ansible的用戶須要有寫入日誌的權限,模塊將會調用被管節點的syslog來記錄,口令是不會出現的日誌中的 9)host_key_checking 若是有臺被管節點從新安裝系統並在known_hosts中有了與以前不一樣的密鑰信息,就會提示一個密鑰不匹配的錯誤信息,直到被糾正爲止,在使用Ansible時,若是有臺被管理節點沒有在known_hosts中被初始化,將會在使用Ansible或定時執行Ansible時提示對key信息的確認。 若是你不想出現這種狀況,而且你明白禁用此項行爲的含義,只要修改該參數爲False便可 host_key_checking = False
lnventory 分組
常見參數配置
ansible_ssh_host # 目標主機地址 ansible_ssh_port # 目標主機端口,默認22 ansible_ssh_user # 目標主機用戶 ansible_ssh_pass # 目標主機ssh密碼 ansible_sudo_pass # sudo密碼 ansible_sudo_exe ansible_connection # 與主機的鏈接類型,好比:local,ssh或者paramiko ansible_ssh_private_key_file # 私鑰地址 ansible_shell_type # 目標系統的shell類型 ansible_python_interpreter # python版本
詳細參數:https://www.cnblogs.com/LuisYang/p/5960660.html
格式
[test] # 組名 10.0.0.1 # 主機ip 或者10.0.0.1:65522 自定義端口
簡單配置
[defaults] inventory = /etc/ansible/hosts sudo_user=root remote_port=22 host_key_checking=False remote_user=root log_path=/var/log/ansible.log module_name=command private_key_file=/root/.ssh/id_rsa no_log:True
參數
實例:
ansible tests1 -m copy -a 'src=/tmp/test.txt dest=/tmp/test/test.txt"
ansible <host-pattern> [-f forks] [-m module_name] [-a args] [options]
做爲ansible的默認模塊,能夠容許遠程主機範圍內的全部shell命令。
注意: 在command的命令中含有像$ HOME'這樣的變量和像``<「',
」>「, `「」「」,「」;「」和「」&「'將沒法正常工做(若是須要這些功能,請使用[shell]模塊)
ansible 192.168.168.11* -m command -a 'ip addr show dev eth0' 參數: – chdir:在運行命令以前,切換到此目錄。
功能:執行遠程主機的shell腳本文件
ansible all -m shell -a "/home/test.sh" 參數: – chdir:在運行命令以前,切換到此目錄。 – executable:更改用於執行命令的shell(bash,sh)。 應該是可執行文件的絕對路徑。
功能: 實現主控端向目標主機copy文件。
ansible all -m copy -a "src=/home/test.sh dest=/tmp/ owner=root group=root mode=0755" #src 主控端文件位置 #dest 被控端目標位置 #owner 文件複製過去後的全部者 #group 文件複製過去後的所屬組 #mode 文件的權限設定,執行a+x這種方式
用途:用於從被控端 中拷貝文件到主控端
注意: 不能拷貝目錄
ansible pythonserver -m fetch -a "src=/root/123 dest=/root" SSH password: - fetch: src: 在遠程拉取的文件,而且必須是一個file,不能是目錄 dest: 用來存放文件的目錄,例如存放目錄爲backup,源文件名稱爲/etc/profile在主機pythonserver中,那麼保存爲/backup/pythonserver/etc/profile
功能:安裝 軟件包
ansible all -m yum -a "name=httpd state=latest disable_gpg_check=yes enablerepo=epel" #name 包名 #state (Choices: present, installed, latest, absent, removed)[Default: present] #disable_gpg_check:禁止gpg檢查 #enablerepo:只啓動指定的repo
功能: 被控端的crontab配置,用於管理計劃任務的
參考博客: https://blog.51cto.com/noodle/1769528
ansible all -m cron -a "name='test' hour='2-5' minute='*/5' day='1' month='3,4' weekday='1' job='ls -l' user=tom" backup:對遠程主機上的原任務計劃內容修改以前作備份 cron_file:若是指定該選項,則用該文件替換遠程主機上的cron.d目錄下的用戶的任務計劃 minute分,hour時,day日,month月,weekday周 job: 要執行的任務,依賴於state=present name: 該任務的描述 special_time: 指定何時執行,參數:reboot,yearly,annually,monthly,weekly,daily,hourly state: 確認該任務計劃是建立仍是刪除 user: 以哪一個用戶身份執行
功能: 服務管理,
[root@localhost ~]# ansible all -m service -a "name=httpd state=restarted" #啓動服務 [root@localhost ~]# ansible all -m service -a "name=httpd state=running" #查看服務狀態 [root@localhost ~]# ansible all -m service -a "name=httpd state=stoped" #中止服務 參數: enabled=:是否開機自動啓動,取值爲true或false; name=:服務名字; state=:狀態,取值有started,stoped,restarted。
基於模板方式生成一個文件複製到遠程主機(template使用Jinjia2格式做爲文件模版,進行文檔內變量的替換的模塊。它的每次使用都會被ansible標記爲」changed」狀態。)
- template: src: /mytemplates/foo.j2 dest: /etc/file.conf owner: bin group: wheel mode: 0644 – backup: 若是原目標文件存在,則先備份目標文件 – src:在ansible控制器上的Jinja2格式化模板的路徑。 這能夠是相對或絕對的路徑。 – dest:將模板渲染到遠程機器上的位置。 force:是否強制覆蓋,默認爲yes – owner:目標文件屬主 – group:目標文件屬組 – mode:目標文件的權限模式,模式能夠被指定爲符號模式(例如,u + rwx或u = rw,g = r,o = r)
功能:用於遠程主機上的文件操做,對文件的全部權,組合模式進行更改
# 更改文件全部權,組和模式。 當使用八進制數指定模式時,第一個數字應始終爲0。 - file: path: /etc/foo.conf owner: foo group: foo mode: 0644 # touch建立文件,使用符號模式設置權限(至關於0644) - file: path: /etc/foo.conf state: touch mode: "u=rw,g=r,o=r" # touch建立文件,添加/刪除一些權限 - file: path: /etc/foo.conf state: touch mode: "u+rw,g-wx,o-rwx" # 建立一個目錄,若是它不存在 - file: path: /etc/some_directory state: directory mode: 0755 – force:須要在兩種狀況下強制建立軟連接,一種是源文件不存在但以後會創建的狀況下;另外一種是目標軟連接已存在,須要先取消以前的軟鏈,而後建立新的軟鏈,有兩個選項:yes|no – group:定義文件/目錄的屬組 – mode:定義文件/目錄的權限 – owner:定義文件/目錄的屬主 – path:必選項,定義文件/目錄的路徑 – recurse:遞歸的設置文件的屬性,只對目錄有效 – src:要被連接的源文件的路徑,只應用於state=link的狀況 – dest:被連接到的路徑,只應用於state=link的狀況 – state: directory:若是目錄不存在,建立目錄 file:即便文件不存在,也不會被建立 link:建立軟連接 hard:建立硬連接 touch:若是文件不存在,則會建立一個新的文件,若是文件或目錄已存在,則更新其最後修改時間 absent:刪除目錄、文件或者取消連接文件
功能: 遠程主機用戶管理
[root@localhost ~]# ansible all -m user -a "name=jerry comment=' doubi jerry'" #添加用戶 詳細參數參考ansible-doc user [root@localhost ~]# ansible all -m user -a "name=jerry state=absent remove=yes" #刪除用戶
功能: 檢查指定節點機器是否還能連通,用法很簡單,不涉及參數,主機若是在線,則回覆pong
還用個hping 模塊,
ansible erp -m ping
執行原始的命令,而不是經過模塊子系統。在任何狀況下,使用shell或命令模塊是合適的。給定原始的參數直接經過配置的遠程shell運行。可返回標準輸出、錯誤輸出和返回代碼。此模塊沒有變動處理程序支持。
這個模塊不須要遠程系統上的Python,就像腳本模塊同樣。此模塊也支持Windows目標。
用於管理Python庫依賴項,爲了使用pip模塊,必須提供參數name或者requirements
# 安裝bottle python包。 - pip: name: bottle # 在0.11版安裝bottle python包。 - pip: name: bottle version: 0.11 # 使用遠程協議(bzr +,hg +,git +,svn +)安裝MyApp。 您沒必要在extra_args中提供'-e'選項。 - pip: name: svn+http://myrepo/svn/MyApp#egg=MyApp # 使用遠程協議(bzr +,hg +,git +)安裝MyApp。 - pip: name: git+http://myrepo/app/MyApp # 從本地壓縮包安裝MyApp - pip: name: file:///path/to/MyApp.tar.gz # 將bottle安裝到指定的virtualenv中,繼承全局安裝的模塊 - pip: name: bottle virtualenv: /my_app/venv virtualenv_site_packages: yes # 使用Python 2.7將bottle安裝到指定的virtualenv中 - pip: name: bottle virtualenv: /my_app/venv virtualenv_command: virtualenv-2.7 # 在用戶主目錄中安裝bottle。 - pip: name: bottle extra_args: --user # 安裝指定的python requirements - pip: requirements: /my_app/requirements.txt # 在指定的virtualenv中安裝指定的python requirements。 - pip: requirements: /my_app/requirements.txt virtualenv: /my_app/venv # 安裝指定的python requirements和自定義pip源URL - pip: requirements: /my_app/requirements.txt extra_args: -i https://example.com/pypi/simple # 專門爲Python 3.3安裝bottle,使用'pip-3.3'可執行文件。 - pip: name: bottle executable: pip-3.3 # 安裝 bottle,若是已安裝,強制從新安裝 - pip: name: bottle state: forcereinstall
參數
– chdir: 執行pip命令前cd進入的目錄 – name:要安裝的Python庫的名稱或遠程包的URL。 – requirements:一個pip requirements.txt文件的路徑,它應該是遠程系統的本地文件,若是使用chdir選項,則能夠將文件指定爲相對路徑。 – version:指定的Python庫的安裝版本。 – extra_args:額外的參數傳遞給pip。 – executable:顯式可執行文件或可執行文件的路徑名,用於爲系統中安裝的特定版本的Python運行pip。 例如pip-3.3,若是系統中安裝了Python 2.7和3.3,而且想要爲Python 3.3安裝運行pip。 它不能與「virtualenv」參數一塊兒指定(在2.1中添加)。 默認狀況下,它將採用適用於python解釋器的版本。 pip3在python 3上,pip2或pip在python 2上。 – virtualenv:要安裝到的virtualenv目錄的可選路徑。 它不能與’executable’參數一塊兒指定(在2.1中添加)。 若是virtualenv不存在,則將在安裝軟件包以前建立它。 可選的virtualenv_site_packages,virtualenv_command和virtualenv_python選項會影響virtualenv的建立。 – virtualenv_command:用於建立虛擬環境的命令或路徑名。 例如pyvenv,virtualenv,virtualenv2,~/bin /virtualenv,/usr/local/bin/virtualenv。 – virtualenv_python:用於建立虛擬環境的Python可執行文件。 例如python3.5,python2.7。 未指定時,將使用用於運行ansible模塊的Python版本。 當virtualenv_command使用pyvenv或-m venv模塊時,不該使用此參數。 – state:狀態(present,absent,latest, forcereinstall),表示是安裝還卸載 present:默認的,表示爲安裝 lastest: 安裝爲最新的版本 absent:表示刪除 forcereinstall:「forcereinstall」選項僅適用於可ansible 2.1及更高版本。
功能: 分組
ansible web -m group -a 'name=g1 gid=666 state=present system=yes' – gid:指定用的gid。 – name:指定用戶名。 – state:是建立仍是刪除。(present,absent) – system:若是是,則表示建立的組是系統組。
模塊主要用於從http、ftp、https服務器上下載文件(相似於wget),主要有以下選項:
- name: Download foo.conf get_url: url: http://example.com/path/file.conf dest: /etc/foo.conf mode: 0440 - name: Download file with custom HTTP headers get_url: url: http://example.com/path/file.conf dest: /etc/foo.conf headers: 'key:value,key:value' - name: Download file with check (sha256) get_url: url: http://example.com/path/file.conf dest: /etc/foo.conf checksum: sha256:b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c – sha256sum:下載完成後進行sha256 check; – timeout:下載超時時間,默認10s – url:下載的URL – url_password、url_username:主要用於須要用戶名密碼進行驗證的狀況 – dest:將文件下載到哪裏的絕對路徑。若是dest是目錄,則使用服務器提供的文件名,或者若是沒有提供,將使用遠程服務器上的URL的基本名稱。 – headers:以格式「key:value,key:value」爲請求添加自定義HTTP標頭。
功能: 用於解壓文件
- name: 將foo.tgz解壓縮到/var/lib/foo中 unarchive: src: foo.tgz dest: /var/lib/foo - name: 解壓遠程計算機上已存在的文件 unarchive: src: /tmp/foo.zip dest: /usr/local/bin remote_src: yes - name: 解壓文檔須要下載的文件(2.0中添加) unarchive: src: https://example.com/example.zip dest: /usr/local/bin remote_src: yes 參數: – copy:在解壓文件以前,是否先將文件複製到遠程主機,默認爲yes。若爲no,則要求目標主機上壓縮包必須存在。 – creates:指定一個文件名,當該文件存在時,則解壓指令不執行 – dest:遠程主機上的一個路徑,即文件解壓的絕對路徑。 – group:解壓後的目錄或文件的屬組 – list_files:若是爲yes,則會列出壓縮包裏的文件,默認爲no,2.0版本新增的選項 – mode:解壓後文件的權限 – src:若是copy爲yes,則須要指定壓縮文件的源路徑 – owner:解壓後文件或目錄的屬主 ---------------------
功能: script模塊將本地腳本複製到遠程主機並運行之
ansible web -m script -a 'time.sh'
相似saltstack的grains靜態信息收集,收集一些主機硬件信息或者以及其餘如fqdn等等
使用setup獲取ip地址以及主機名使用filter過濾等等
獲取內存信息 ansible db -m setup -a 'filter=ansible_memory_mb' 獲取主機名 ansible db -m setup -a 'filter=ansible_nodename'