ansible

安裝ansible: 

AnbleVersion2.4及更高版本能夠管理包含Python2.6或更高版本的早期操做系統。html

yum方式安裝:

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"

經過Pip發佈最新版本

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已經被否決了)。

 

 

  1. 編輯/etc/ansible/hosts
  2. 添加本機的public SSH key到目標機器的authorized_keys   #ssh-copy-id
  3. 添加本機的私鑰到Ansible
  4. 運行ansible all -m ping 測試是否添加成功

/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"  #建立了一個別名
別名
    s1 ansible_ssh_port=65522 ansible_ssh_host=10.0.0.1 ansible_ssh_user=simon    # 別名s1

配置:

經常使用參數配置:
    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版本
 
  • 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"組成。**

  •  4)全局變量、指定python解釋器
[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  
  • 8)分離 主機與組 特定數據  

將定義的主機名與組變量單獨剝離出來放到指定的文件中,將採用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"}
 

3、經常使用模塊

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查詢

 

關於ansbile工具的shell、command、script、raw模塊的區別和使用場景

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}'"

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)
相關文章
相關標籤/搜索