ansible 是一款自動(dòng)化運(yùn)維工具磕瓷,由Red Hat公司出品的,能夠解決我們?cè)趇t工作中念逞,一遍又一遍執(zhí)行相同任務(wù)困食。利用它,我們可以只解決一次問題翎承,然后自動(dòng)化運(yùn)行我們的解決方案硕盹。 目前,數(shù)以千計(jì)的公司正在使用簡(jiǎn)單但功能強(qiáng)大的it自動(dòng)化引擎叨咖,我相信它可以幫我們加速完成DevOps計(jì)劃瘩例。
特性:
- 模塊化:調(diào)用特定的模塊啊胶,完成特定的任務(wù)。
- 有 Paramiko垛贤、PyYAML焰坪、Jinjia2(模板語言)三個(gè)關(guān)鍵模塊。
- 支持自定義模塊聘惦。
- 基于 Python 語言實(shí)現(xiàn)某饰。
- 部署簡(jiǎn)單,基于 python 和 SSH(默認(rèn)已安裝)善绎,agentless黔漂。
- 安全,基于 OpenSSH禀酱。
- 支持 playbook 編排任務(wù)炬守。
- 冪等性:一個(gè)任務(wù)執(zhí)行1遍和執(zhí)行n遍效果一樣,不因重復(fù)執(zhí)行帶來意外情況比勉。
- 無需代理不依賴PKI(無需 ssl)
- 可使用任何編程語言寫模塊劳较。
- YAML格式驹止,編排任務(wù)浩聋,支持豐富的數(shù)據(jù)結(jié)構(gòu)。
- 較強(qiáng)大的多層解決方案臊恋。
框架結(jié)構(gòu):
安裝(此處為pip安裝):
# pip 升級(jí)
? ~ sudo pip3 install --upgrade pip
# 安裝 ansible
? ~ pip3 install ansible
# 安裝指定版本的 ansible
? ~ pip3 install ansible==2.1.1
# 查看 pip 安裝 ansible 的詳情
? ~ pip3 show ansible
Name: ansible
Version: 2.9.10
Summary: Radically simple IT automation
Home-page: https://ansible.com/
Author: Ansible, Inc.
Author-email: info@ansible.com
License: GPLv3+
Location: /Users/jiaflu/Library/Python/3.7/lib/python/site-packages
Requires: PyYAML, cryptography, jinja2
Required-by:
# 為 ansible 建立軟鏈接
? ~ ln -s /Users/jiaflu/Library/Python/3.7/bin/ansible /usr/local/bin/
# 驗(yàn)證 ansible 是否安裝成功
? ~ ansible --version
ansible 2.9.10
config file = None
configured module search path = ['/Users/jiaflu/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /Users/jiaflu/Library/Python/3.7/lib/python/site-packages/ansible
executable location = /usr/local/bin/ansible
python version = 3.7.3 (default, Apr 24 2020, 18:51:23) [Clang 11.0.3 (clang-1103.0.32.62)]
鏈接方式:
(1)基于密碼連接
[root@ansible ~]# vim /etc/ansible/hosts
# 方法一 主機(jī)+端口+密碼
[webserver]
192.168.1.31 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123456"
192.168.1.32 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123456"
192.168.1.33 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123456"
192.168.1.36 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123456"
# 方法二 主機(jī)+端口+密碼
[webserver]
192.168.1.3[1:3] ansible_ssh_user=root ansible_ssh_pass="123456"
# 方法二 主機(jī)+端口+密碼
[webserver]
192.168.1.3[1:3]
[webserver:vars]
ansible_ssh_pass="123456"
(2)基于秘鑰連接
基于秘鑰連接需要先創(chuàng)建公鑰和私鑰衣洁,并發(fā)送給被管理機(jī)器。
- 生成公私鑰
[root@ansible ~]# ssh-keygen
[root@ansible ~]# for i in {1,2,3,6}; do ssh-copy-id -i 192.168.1.3$i ; done
- 配置連接
[root@ansible ~]# vim /etc/ansible/hosts
# 方法一 主機(jī)+端口+密鑰
[webserver]
192.168.1.31:22
192.168.1.32
192.168.1.33
192.168.1.36
# 方法一 別名主機(jī)+端口+密鑰
[webserver]
node1 ansible_ssh_host=192.168.1.31 ansible_ssh_port=22
node2 ansible_ssh_host=192.168.1.32 ansible_ssh_port=22
node3 ansible_ssh_host=192.168.1.33 ansible_ssh_port=22
node6 ansible_ssh_host=192.168.1.36 ansible_ssh_port=22
簡(jiǎn)單使用
- 列出文件列表
[root@localhost ~]# ansible test -a "ls "
10.225.20.231 | CHANGED | rc=0 >>
password
10.225.20.237 | CHANGED | rc=0 >>
password
- 測(cè)試機(jī)器是否通
[root@localhost ~]# ansible test -m ping
10.225.20.237 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
10.225.20.231 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
- 其他命令
# 執(zhí)行遠(yuǎn)程命令
# ansible test -m command -a 'uptime'
# 執(zhí)行主控端腳本
# ansible test -m script -a '/etc/ansible/script/test.sh'
# 執(zhí)行遠(yuǎn)程主機(jī)的腳本
# ansible test -m shell -a 'ps aux|grep zabbix'
# 類似shell
# ansible test -m raw -a "ps aux|grep zabbix|awk '{print \$2}'"
# 創(chuàng)建軟鏈接
# ansible test -m file -a "src=/etc/resolv.conf dest=/tmp/resolv.conf state=link"
# 刪除軟鏈接
# ansible test -m file -a "path=/tmp/resolv.conf state=absent"
# 復(fù)制文件到遠(yuǎn)程服務(wù)器
# ansible test -m copy -a "src=/etc/ansible/ansible.cfg dest=/tmp/ansible.cfg owner=root group=root mode=0644"
使用 playbook
playbook 是一種與 adhoc 任務(wù)執(zhí)行模式完全不同的方式抖仅,而且特別強(qiáng)大坊夫。 簡(jiǎn)單地說,playbook 是一個(gè)非常簡(jiǎn)單的配置管理和多機(jī)器部署系統(tǒng)的基礎(chǔ)撤卢,不同于任何已經(jīng)存在的配置系統(tǒng)环凿,而且非常適合部署復(fù)雜應(yīng)用程序。
playbook的核心元素:
Hosts:主機(jī)
Tasks:任務(wù)列表
Variables
Templates:包含了模板語法的文本文件
Handlers:由特定條件出發(fā)的任務(wù)
任務(wù)分為 service放吩、command智听、shell等
tasks:
- name: make sure apache is running
service: name=httpd state=started
tasks:
- name: enable selinux
command: /sbin/setenforce 1
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand || /bin/true
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand
ignore_errors: True
tasks:
- name: restart everything
command: echo "this task will restart the web services"
notify: "restart web services"
- 例子:使用 playbook 安裝 nginx
寫安裝 nginx 的 sh 腳本 nginx-install.yml
- hosts: test
vars:
http_port: 80
max_clients: 200
remote_user: root
tasks:
- name: copy nginx-install.sh to client
copy: src=nginx-install.sh dest=/tmp/nginx-install.sh
- name: chomd a+x
shell: chmod +x /tmp/nginx-install.sh
- name: install nginx
shell: /tmp/nginx-install.sh
執(zhí)行 ansible-playbook
[shaolei@localhost ~]# ansible-playbook nginx-install.yml