自动化运维工具Ansible
ansible簡介:
??????? ansible是新出現的自動化運維工具,基于Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。
ansible是基于模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。主要包括:
- 連接插件connection plugins:負責和被監控端實現通信;
- host inventory:指定操作的主機,是一個配置文件里面定義監控的主機;
- 各種模塊核心模塊、command模塊、自定義模塊;
- 借助于插件完成記錄日志郵件等功能;
- playbook:劇本執行多個任務時,非必需可以讓節點一次性運行多個任務。
圖形介紹:
- 優點:
- no agents:不需要在被控主機上安裝任何客戶端;
- no server:無服務器端,使用時直接運行命令即可;
- modules in any languages:基于模塊工作,可使用任意語言開發模塊;
- yaml,not code:使用yaml語言定制劇本playbook;
- ssh by default:基于ssh工作;
- strong multi-tier solution:可實現多級指揮。
- 輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可;
- 批量任務執行可以寫成腳本,而且不用分發到遠程就可以執行;
- 使用python編寫,維護更簡單,ruby語法過于復雜;
?
實驗環境:
redhat6.5???????????
test1:172.25.254.11????????? ansible服務器端???????????? 安裝python2.7模塊 ?? ?? ansible
test2:172.25.254.12????????? 客戶端????????????????????????????? 安裝python2.7模塊
官網:https://www.ansible.com
server端與client端安裝python模塊:
[root@test1 ~]# yum install -y gcc zlib zlib-devel openssl-devel openssl
[root@test1 ~]# ls?????????? //提前下載好python軟件包,可打開網頁進行下載:https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz
Python-2.7.8.tgz
[root@test1 ~]# cd Python-2.7.8
[root@test1 Python-2.7.8]# ./configure --prefix=/usr/local
[root@test1 Python-2.7.8]# make && make install
?到這里一定要注意,由于我們只是做實驗,所以為了虛擬機之后的正常使用,請提前備份/usr/bin/python* ,實驗做完之后刪除/usr/bin/python* ,然后將備份后的東西還原回去。[root@test1 Python-2.7.8]# mkdir /tmp/python //創建一個備份文件[root@test1 Python-2.7.8]# cp -a /usr/bin/python* /tmp/python //備份原來的python文件[root@test1 Python-2.7.8]# cp -a /usr/local/include/python2.7/* /usr/local/include/
[root@test1 Python-2.7.8]# cd /usr/bin/
[root@test1 bin]# ln -s /usr/local/bin/python2.7 /usr/local/bin/python
[root@test1 bin]# rm -f /usr/bin/python
[root@test1 bin]# cp /usr/local/bin/python2.7 /usr/bin/python
僅server端安裝ansible:
接下來安裝setuptools模塊
[root@test1 ~]# ls?????????????????? //下載鏈接: http://ftp.leg.uct.ac.za/pub/packages/macports/distfiles/py-setuptools/
Python-2.7.8.tgz
setuptools-7.0.tar.gz[root@test1 setuptools-7.0]# python setup.py install
安裝pycrypto模塊
[root@test1 ~]# cd
[root@test1 ~]# ls?????????????????????????//下載鏈接:https://www.dlitz.net/software/pycrypto/
pycrypto-2.6.1.tar.gz
Python-2.7.8
Python-2.7.8.tgz
setuptools-7.0
setuptools-7.0.tar.gz?????????????????????[root@test1 ~]# tar zxf pycrypto-2.6.1.tar.gz
[root@test1 ~]# cd pycrypto-2.6.1
[root@test1 pycrypto-2.6.1]# python setup.py install安裝PyYAML模塊:
[root@test1 ~]# ls????????????????????????????????????//下載鏈接:https://pyyaml.org/download/pyyaml/
pycrypto-2.6.1
pycrypto-2.6.1.tar.gz
Python-2.7.8
Python-2.7.8.tgz
PyYAML-3.11.tar.gz
setuptools-7.0
setuptools-7.0.tar.gz[root@test1 ~]# tar zxf PyYAML-3.11.tar.gz
[root@test1 ~]# cd PyYAML-3.11
[root@test1 PyYAML-3.11]# python setup.py install
安裝Jinja2模塊://下載鏈接:https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz
[root@test1 ~]# tar zxf MarkupSafe-0.9.3.tar.gz??????
[root@test1 ~]# cd MarkupSafe-0.9.3
[root@test1 MarkupSafe-0.9.3]# python setup.py install[root@test1 ~]# tar zxf Jinja2-2.7.3.tar.gz???????????????? //下載鏈接:https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.7.3.tar.gz
[root@test1 ~]# cd Jinja2-2.7.3
[root@test1 Jinja2-2.7.3]# python setup.py install?????????安裝paramiko模塊:
[root@test1 ~]# tar zxf ecdsa-0.11.tar.gz??????????????????? https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.11.tar.gz
[root@test1 ~]# cd ecdsa-0.11
[root@test1 ecdsa-0.11]# python setup.py install[root@test1 ~]# tar zxf paramiko-1.15.1.tar.gz??????????? https://pypi.python.org/packages/source/p/paramiko/paramiko-1.15.1.tar.gz
[root@test1 ~]# cd paramiko-1.15.1
[root@test1 paramiko-1.15.1]# python setup.py install?????? ?安裝simplejson模塊
[root@test1 ~]#? tar zxf simplejson-3.6.5.tar.gz ? ? ? ? ?? https://pypi.python.org/packages/source/s/simplejson/simplejson-3.6.5.tar.gz
[root@test1 ~]# cd simplejson-3.6.5
[root@test1 simplejson-3.6.5]# python setup.py install最后安裝ansible
[root@test1 ~]# tar zxf ansible-1.7.2.tar.gz?????????? https://github.com/ansible/ansible/archive/v1.7.2.tar.gz
[root@test1 ~]# cd ansible-1.7.2
[root@test1 ansible-1.7.2]# python setup.py install??到此ansible就配置完畢啦!!!
接下來繼續進行server端配置
[root@test1 ansible-1.7.2]# cd examples/
[root@test1 examples]# ls
ansible.cfg? DOCUMENTATION.yml? hosts? issues? playbooks? scripts
[root@test1 examples]# mkdir /etc/ansible
[root@test1 examples]# cp hosts ansible.cfg /etc/ansible/
1、SSH免密鑰登錄設置
[root@test1 ~]# ssh-keygen??????????? //生成公私鑰對
[root@test1 ~]# cd /root/.ssh
[root@test1 .ssh]# ls??????????????????? //可以看到生成的公私鑰對
id_rsa? id_rsa.pub? known_hosts
[root@test1 .ssh]# ssh-copy-id 172.25.254.11
[root@test1 .ssh]# cd ..
[root@test1 ~]# scp -r .ssh/ 172.25.254.12:/root/????????????????????? //將公私鑰對以及剛生成的認證發送給test2
root@172.25.254.12's password:
known_hosts???????????????????????????????????????????????????????????????????????????????????????????????????????? 100% 1970???? 1.9KB/s?? 00:00?? ?
id_rsa.pub????????????????????????????????????????????????????????????????????????????????????????????????????????? 100%? 392???? 0.4KB/s?? 00:00?? ?
authorized_keys???????????????????????????????????????????????????????????????????????????????????????????????????? 100%? 392???? 0.4KB/s?? 00:00?? ?
id_rsa????????????????????????????????????????????????????????????????????????????????????????????????????????????? 100% 1675???? 1.6KB/s?? 00:00?? ?
[root@test1 ~]# ssh 172.25.254.12????????????? //登陸test2,可以看到是免密登陸,即不需要輸入test2的root密碼就可以登陸test2的主機
當然test2登陸test1也是免密的
[root@test2 ~]# ssh 172.25.254.11
[root@test1 ~]# vim /etc/ansible/hosts???????????? //修改配置文件
#[dbservers]
#db01.intranet.mydomain.net
#db02.intranet.mydomain.net
#10.25.1.56
#10.25.1.57
# Here's another example of host ranges, this time there are no
# leading 0s:
#db-[99:101]-node.example.com
172.25.254.12
[root@test1 ~]# ansible all -m ping
[root@test1 ~]# vim /etc/ansible/ansible.cfg???????????????????
?? //讓ansible連接加速配置
?????? //開啟日志
???? //關閉每次執行ansible時的檢查
[root@test1 ~]# vim /etc/ansible/hosts????????????? //這里需要注意hosts文件里面的testhosts對應的主機必須已經下載過python2.7
????????????? //其他內容都注釋掉
[root@test1 ~]# ansible testhosts -m command -a 'w'
[root@test1 ~]# ansible all -m command -a 'uptime'
作為自動化運維工具,ansible當然可以批量的做一些事情
例如:通過ansible可以將本地文件/目錄同步到想要發送的客戶端
[root@test1 ~]# vim /var/www/html/index.html
? [root@test1 ~]# ansible testhosts -s -m copy -a 'src=/var/www/html/index.html dest=/mnt/index.html mode=0755'
發送成功,接下來看看test1和test2是否同步過去文件
[root@test1 tmp]#
[root@test1 tmp]# cd /mnt/???????????
[root@test1 mnt]# ls??????????????????? //可以看到文件已經推送過來
default.conf? honeyd-1.5c.tar-2.gz? index.html?
[root@test1 mnt]# cat index.html
<h1>we are family</h1>
[root@test2 tmp]# cd /mnt/
[root@test2 mnt]# ls
index.html? index.php? keepalived-2.0.6
[root@test2 mnt]# cat index.html
<h1>we are family</h1>
接下來講一些ansible常用的模塊及命令等
1、setup???????????????? //用來查看遠程主機的一些信息
[root@test1 ~]# ansible all -m setup
2、ping?????????????????? //查看遠程主機的運行狀態
3、file???????????????????????? //設置文件的屬性,例如:
[root@test1 ~]# ansible all -m file -a "src=/var/www/html/index.html dest=/tmp/index.html state=link"
具體詳解:
| backup | 在覆蓋遠程服務器前將遠程服務器的源文件進行備份,備份文件包含時間信息 |
| content | 用于替代 'src' ,可以直接設定制定文件的值 |
| src | 被鏈接的本地文件,可以是絕對路徑也可以是相對路徑,如果路徑是目錄,則它將遞歸復制。若路徑是用/結尾,則只復制目錄里的內容,若沒有用/則復制目錄里面的所有內容包括時間權限等,類似于rsync,只應用于state=link的情況 |
| dest | (必選項)被鏈接到的路徑,要將源文件復制到的(遠程主機的絕對路徑),只應用于state=link的情況 |
| link | 創建軟鏈接 |
| hard | 創建硬鏈接 |
| mode | 定義文件/目錄的權限(四位數,如:mode=0755) |
| group | 定義文件/目錄的屬組 |
| owner | 定義文件/目錄的屬主 |
| path | 必選項,定義文件/目錄的路徑 |
| recurse | 遞歸設置文件的屬性,只對目錄有效 |
| directory | ?如果目錄不存在,就創建目錄 |
| file | 即使文件不存在也不被創建 |
| touch | 如果文件不存在,則會創建一個新的文件,如果文件/目錄已存在,則更新其最后修改時間 |
| absent | 刪除目錄、文件或者取消鏈接文件 |
| force | 兩種情況下需要強制創建軟鏈接,1、源文件不存在,但之后會建立的情況下;2、目標軟鏈接已存在,需要先取消之前的軟鏈接,然后創建新的軟鏈 |
如:???
[root@test1 etc]# ansible all -m command -a "ls -al /etc/passwd" ? ? ? ? ? ? ? ? //遠程文件信息查看
[root@test1 ~]# ansible all -m file -a "src=/etc/passwd dest=/mnt/passwd state=link"???? //文件鏈接成功,此時/mnt下有文件passwd
[root@test1 mnt]# ansible all -m command -a "ls -al /mnt/passwd"??????????? //此時查看文件存在
[root@test1 mnt]# ansible all -m file -a "path=/mnt/passwd state=absent"???????? //刪除文件
[root@test1 mnt]# ansible all -m command -a "ls -al /mnt/passwd"???????????????????? //查看時報錯,說明已經刪除
4、copy?????????????? //復制文件到遠程主機
5、command???????????????????? //在遠程主機上執行命令
參數有:
creates:一個文件名,當該文件存在,則該命令不執行
free_form:要執行的linux指令
chdir:在執行指令之前,先切換到該目錄
removes:一個文件名,當該文件不存在,則該選項不執行
executable:切換shell來執行指令,該執行路徑必須是一個絕對路徑
ansible就介紹到這!!!
?
如果要還原虛擬機原本的狀態不影響yum等命令,可以將之前的文件再還原回去,如下:
[root@test1 ~]# cd? /usr/bin/
[root@test1 bin]# ls python*
python????? python2???? python2.6?? python.old?
[root@test1 bin]# rm -rf python*
[root@test1 bin]# mv /tmp/python/* .
test2和test1的步驟一樣,這里就不再贅述。
試一下看虛擬機是否正常可以用:
[root@test1 bin]# yum repolist??????????????????? //若出現這樣的報錯,可以執行下面的命令
-bash: /usr/bin/yum: /usr/bin/python2.4: bad interpreter: No such file or directory[root@test1 bin]# ls python*
python? python2? python2.6[root@test1 bin]# mv python python2.4
總結
以上是生活随笔為你收集整理的自动化运维工具Ansible的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dhcp动态主机配置协议
- 下一篇: shell的数字、字符串处理