AnbleVersion2.4及更高版本能夠管理包含Python2.6或更高版本的早期操做系統。html
yum源或rpm包來源:埃佩爾以及Relases.ansible.com.node
$ sudo yum install ansible
您也能夠本身構建一個能夠分發和安裝的RPM。python
$ git clone https://github.com/ansible/ansible.git $ cd ./ansible $ make rpm $ sudo rpm -Uvh ./rpm-build/ansible-*.noarch.rpm
在託管節點上,須要ssh。默認狀況下使用sftp。若是sftp不可用,能夠在ansible.cfg切換到scp
。您還須要Python 2(版本2.6或更高版本)或Python 3(版本3.5或更高版本)。mysql
注linux
若是在遠程節點上啓用了SELinux,須要安裝 libselinux-python。 yum install libselinux-pythonnginx
默認狀況下,Ansible使用位於/usr/bin/python的解釋器
。若是是 python2/3 您可能會看到如下錯誤:git
"module_stdout": "/bin/sh: /usr/bin/python: No such file or directory\r\n"
可使用raw 快速執行命令
$ ansible myhost --sudo -m raw -a "yum install -y python2"
Ansible能夠經過Python包管理器「pip」安裝。若是您的Python版本中尚未「pip」,您能夠經過如下方法得到pip:github
$ sudo easy_install pip
而後用[1]:web
$ sudo pip install ansible
或者若是您正在尋找最新的開發版本:sql
$ pip install git+https://github.com/ansible/ansible.git@devel
https://docs.ansible.com/ansible/latest/user_guide/index.html
在咱們開始以前,瞭解Ansible如何經過SSH與遠程計算機進行通訊是很重要的。
EnterpriseLinux 6操做系統做爲控制機器時,OpenSSH的版本可能太老,沒法支持ControlPersio。就會使用「paramiko」。若是您但願使用KerberizedSSH等特性,請考慮使用Fedora、MacOS或Ubuntu做爲您的控制機器,直到OpenSSH的更新版本在您的平臺上可用爲止。
偶爾會遇到不支持SFTP的設備。這是不多見的,可是若是發生這種狀況,您能夠切換到scp模式。配置可測性.
在使用遠程機器時,Ansible默認假定您使用的是SSH鍵。鼓勵使用SSH密鑰,但在須要時也能夠經過提供該選項來使用密碼身份驗證。--ask-pass
。若是使用sudo特性和sudo須要密碼時,也能夠提供--ask-become-pass
(之前--ask-sudo-pass
已經被否決了)。
/etc/ansible/hosts
存放須要管理的機器。這是一個庫存文件,在這裏也有更深刻的解釋:處理庫存.
創建密鑰認證 [root@ansible ~]# ssh-keygen [root@ansible ~]# for i in {1..4}; do ssh-copy-id -i 192.168.78.1$i; done 設置SSH代理以免從新鍵入密碼: [root@ansible ~]#ssh-agent bash [root@ansible ~]#ssh-add ~/.ssh/id_rsa
(取決於您的設置,您可能但願使用Ansible的--private-key
選項來指定pem文件)
[root@localhost ansible]# ansible --help | grep priva --private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE
在全部節點上運行一個實時命令:
$ ansible all -a "/bin/echo hello"
閱讀一些更真實的案例adhoc命令簡介,探索使用不一樣模塊能夠作什麼,並瞭解Ansible使用劇本語言。
小貼士
在運行命令時,可使用「localhost」或「127.0.0.1」做爲服務器名稱來指定本地服務器。 例子: $ ansible localhost -m ping -e 'ansible_python_interpreter="/usr/bin/env python"' 經過將此添加到庫存文件中,能夠顯式地指定localhost: localhost ansible_connection=local ansible_python_interpreter="/usr/bin/env python" #建立了一個別名
1)批量定義主機
[g1] g[1:50].example.com g[a-f].example.com
[root@localhost ansible]# vim /etc/ansible/hosts 192.168.1.[128:130] [root@localhost ansible]# ansible all -uroot -k -m ping -o #-k ssh密碼登陸 -u指定用戶 -m要執行的模塊 -o摘要輸出 SSH password: 192.168.1.128 | SUCCESS => {"changed": false, "ping": "pong"} 192.168.1.129 | SUCCESS => {"changed": false, "ping": "pong"} 192.168.1.130 | UNREACHABLE!: Failed to connect to the host via ssh: ssh: connect to host 192.168.1.130 port 22: No route to host
2)內置參數:用戶名和密碼和ssh端口;命令行不用輸入-u和-k選項
[root@localhost ~]# vim /etc/ansible/hosts [web] 192.168.1.[31:32] ansible_ssh_user='root' ansible_ssh_pass='redhat' ansible_ssh_port='22' 192.168.1.172 http_port=80 [root@localhost ~]# ansible web -m ping -o SSH password: 192.168.1.32 | SUCCESS => {"changed": false, "ping": "pong"} 192.168.1.31 | SUCCESS => {"changed": false, "ping": "pong"} 192.168.1.172 | SUCCESS => {"changed": false, "ping": "pong"}
#可讓兩臺服務器產生的apache配置文件httpd.conf差別化
3)組變量,:vars
[webservers] 192.168.1.[31:32] [web:vars] ansible_ssh_user='root' ansible_ssh_pass='redhat' ansible_ssh_port='22' http_port=80
# 組變量的做用域是覆蓋組全部成員,經過定義一個新塊,塊名由組名+ ":vars"組成。**
[all:vars] # *:vars 塊變量,all:vars 全局變量 ansible_ssh_private_key_file=/root/.ssh/id_rsa ansible_ssh_port=22 ansible_ssh_user=root [t3:vars] # t3 使用python解釋器是python2 ansible_python_interpreter=/usr/bin/python2 nginx_port=80 # 私有變量在playbooks中使用 [t3] 192.168.11.162
5)嵌套組,:children
[root@localhost ~]# vim /etc/ansible/hosts [nginx] 192.168.1.31 [apache] 192.168.1.32 [web:children] apache nginx [nested:vars] ntp_server=s1b.time.edu.cn [root@localhost ~]# ansible webservers -m ping -o 192.168.1.31 | SUCCESS => {"changed": false, "ping": "pong"} 192.168.1.32 | SUCCESS => {"changed": false, "ping": "pong"}
#嵌套組定義一個新塊,塊名由[ 組名+":chilren"] 組成。嵌套組也能夠定義組變量,做用域是嵌套組裏的全部組
嵌套組只能在/usr/bin/ansible-playbook中起做用,在/usr/bin/ansible中不起做用
6)自定義主機清單文件
[root@localhost ~]# ansible -i /etc/ansible/webservices webservers -m ping -o 192.168.1.31 | SUCCESS => {"changed": false, "ping": "pong"} 192.168.1.32 | SUCCESS => {"changed": false, "ping": "pong"}
7)查看組中的主機列表
[root@localhost ~]# ansible web --list-host hosts (2): 192.168.1.32 192.168.1.31 [root@localhost ~]# ansible nginx --list-host hosts (1): 192.168.1.31
將定義的主機名與組變量單獨剝離出來放到指定的文件中,將採用YAML格式存放,存放位置規定:"/etc/ansible/group_vars/+組名"和"/etc/ansible/host_vars/+主機名"分別存放指定組名或主機名定義的變量,以下:
[root@ansible host_vars]# cat 192.168.78.11.yml http_port: 80 [root@ansible group_vars]# cat mysql.yml ntp_server: s1b.time.edu.cn database_server: 192.168.78.14 [root@ansible group_vars]# cat web.yml ntp_server: s1b.time.edu.cn http_prot: 80
**能夠直接調用變量,規範目錄名的緣由是ansible會自動加載這幾個目錄下的變量,若是變量不放到這幾個目錄下,是不能調用的,咱們會在後面介紹到不放到特定目錄下,playbook如何調用這些變量**
Inventory 分文件管理(文件名便是組名) 分文件: /etc/ansible/group_vars/vim /etc/ansible/group_vars/webservers /etc/ansible/host_vars/foosball vim 文件中的內容: 變量 ntp_server: acme.example.org db_server: 10.0.0.1 分文件夾:(文件夾就是組名) /etc/ansible/group_vars/vim/install /etc/ansible/group_vars/vim/init /etc/ansible/host_vars/foosball
[root@localhost ~]# ansible webservers -uroot -k -m ping -o SSH password: 192.168.1.32 | SUCCESS => {"changed": false, "ping": "pong"} 192.168.1.31 | SUCCESS => {"changed": false, "ping": "pong"}
copy模塊: 目的:把主控端/root目錄下的a.sh文件拷貝到到指定節點上 命令:ansible 10.1.1.113 -m copy -a 'src=/root/a.sh dest=/tmp/ owner=root group=root mode=0755' file模塊: 目的:更改指定節點上/tmp/t.sh的權限爲755,屬主和屬組爲root 命令:ansible all -m file -a "dest=/tmp/t.sh mode=755 owner=root group=root" cron模塊: 目的:在指定節點上定義一個計劃任務,每隔3分鐘到主控端更新一次時間 命令:ansible all -m cron -a 'name="custom job" minute=\*/3 hour=\* day=\* month=\* weekday=\* job="/usr/sbin/ntpdate 172.16.254.139"' group模塊: 目的:在全部節點上建立一個組名爲nolinux,gid爲2014的組 命令:ansible all -m group -a 'gid=2014 name=nolinux' user模塊: 目的:在指定節點上建立一個用戶名爲nolinux,組爲nolinux的用戶 命令:ansible 10.1.1.113 -m user -a 'name=nolinux groups=nolinux state=present' 刪除用戶 命令:ansible 10.1.1.113 -m user -a 'name=nolinux state=absent remove=yes' yum模塊: 目的:在指定節點上安裝 apache 服務 命令:ansible all -m yum -a "state=present name=httpd" state=latest=>>安裝最新版本 service模塊: 目的:啓動指定節點上的 httpd 服務,並讓其開機自啓動 命令:ansible 10.1.1.113 -m service -a 'name=httpd state=restarted enabled=yes' script模塊: 目的:在指定節點上執行/root/a.sh腳本(該腳本是在ansible主控端) 命令:ansible 10.1.1.113 -m script -a '/root/a.sh' ping模塊: 目的:檢查指定節點機器是否還能連通 命令:ansible 10.1.1.113 -m ping command模塊: 目的:在指定節點上運行hostname命令 命令:ansible 10.1.1.113 -m command -a 'hostname' raw模塊: 目的:在10.1.1.113節點上運行ifconfig命令 命令:ansible 10.1.1.113 -m raw-a 'ifconfig|eth0' get_url模塊: 目的:將http://10.1.1.116/favicon.ico文件下載到指定節點的/tmp目錄下 命令:ansible 10.1.1.113 -m get_url -a 'url=http://10.1.1.116/favicon.ico dest=/tmp' stat模塊: 目的:獲取遠程文件狀態信息,包括atime、ctime、mtime、md五、uid、gid等信息 ansible web -m stat -a 'path=/etc/sysctl.conf' synchronize模塊: 目的:將主控方/root/a目錄推送到指定節點的/tmp目錄下 命令:ansible 10.1.1.113 -m synchronize -a 'src=/root/a dest=/tmp/ compress=yes' 執行效果: delete=yes 使兩邊的內容同樣(即以推送方爲主) compress=yes 開啓壓縮,默認爲開啓 --exclude=.git 忽略同步.git結尾的文件 mode=pull 更改推送模式爲拉取模式 目的:將10.1.1.113節點的/tmp/a目錄拉取到主控節點的/root目錄下 命令:ansible 10.1.1.113 -m synchronize -a 'mode=pull src=/tmp/a dest=/root/' 須要更多模塊請使用ansible-doc -l查詢
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腳本] [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}'"
$ ansible all -m ping #ping全部節點 默認用當前用戶名遠程鏈接到計算機,-u 能夠指定用戶 1)以bruce身份 ping 全部主機 ansible all -m ping -u bruce 2)用 bruce 用戶以 root 身份 ping ansible all -m ping -u bruce --sudo 3)用 bruce 用戶 sudo 到 bruce 用戶 ping ansible all -m ping -u bruce --sudo --sudo-user bruce
Usage: ansible <host-pattern> [options] Options: -m MODULE\_NAME, --module-name=MODULE\_NAME 要執行的模塊,默認爲 command -a MODULE_ARGS, --args=MODULE_ARGS 模塊的參數 -u REMOTE_USER, --user=REMOTE_USER ssh 鏈接的用戶名,默認用 root,ansible.cfg 中能夠配置 -k, --ask-pass 提示輸入 ssh 登陸密碼,當使用密碼驗證登陸的時候用 -s, --sudo sudo 運行 -U SUDO_USER, --sudo-user=SUDO_USER sudo 到哪一個用戶,默認爲 root -K, --ask-sudo-pass 提示輸入 sudo 密碼,當不是 NOPASSWD 模式時使用 -B SECONDS, --background=SECONDS run asynchronously, failing after X seconds(default=N/A) -P POLL_INTERVAL, --poll=POLL_INTERVAL set the poll interval if using -B (default=15) -C, --check 只是測試一下會改變什麼內容,不會真正去執行 -c CONNECTION 鏈接類型(default=smart) -f FORKS, --forks=FORKS fork 多少個進程併發處理,默認 5 -i INVENTORY, --inventory-file=INVENTORY 指定 hosts 文件路徑,默認 default =/etc/ansible/hosts -l SUBSET, --limit=SUBSET 指定一個 pattern,對<host_pattern>已經匹配的主機中再過濾一次 --list-hosts 只打印有哪些主機會執行這個 playbook 文件:不是實際執行該 playbook -M MODULE_PATH, --module-path=MODULE_PATH 要執行的模塊的路徑,默認爲/usr/share/ansible/ -o, --one-line 壓縮輸出,摘要輸出 --private-key=PRIVATE_KEY_FILE 私鑰路徑 -T TIMEOUT, --timeout=TIMEOUT ssh 鏈接超時時間,默認 10 秒 -t TREE, --tree=TREE 日誌輸出到該目錄,日誌文件名會以主機名命名 -v, --verbose verbose mode (-vvv for more, -vvvv to enable connection debugging)