1 引言
基于Python开发,集合了众多运维工具(puppet、func、fabric)的优点,实现了通过各种模块批量系统配置、批量程序部署、批量运行命令等功能。
默认通过SSH连接受控机执行任务,无需代理。多并发。
2 安装
管理机应安装Python 2(2.7)或Python 3(3.5或更高版本),另外,管理机不支持Windows控制节点。
通过Pip安装:
pip install ansible
源码安装:
git clone github.com/ansible/ansible.git
cd ./ansible
source ./hacking/env-setup
- 下载安装程序(适合生产离线场景):
https://mirrors.huaweicloud.com/ansible/
tar xzvf ansible_v2.9.9_install.tar.gz
sh ansible_v2.9.0_install.sh
安装完毕,添加测试受控机进行简单的测试。
vi /etc/ansible/hosts 添加以下内容
[iweb]
10.0.0.111
10.0.0.112
[root]# ansible all -m ping -k
SSH password:
10.0.0.112 | FAILED! => {
"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."
}
10.0.0.111 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
管理机生成SSH密钥,然后将SSH公钥复制到所有客户机(112报错就是因为无ssh公钥)。
ssh-keygen -t rsa
[root]# ll /root/.ssh/
-rw------- 1 root root 1675 Nov 3 18:06 id_rsa
-rw-r--r-- 1 root root 401 Nov 3 18:06 id_rsa.pub
-rw-r--r-- 1 root root 348 Feb 3 2021 known_hosts
[root]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.0.0.112
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@10.0.0.112'"
and check to make sure that only the key(s) you wanted were added.
加完公钥,再次测试,发现两台受控机均成功返回机器名。
[root]# ansible all -a "uname -a"
10.0.0.111 | CHANGED | rc=0 >>
Linux dbjf-ebus-mnt 2.6.32-573.el6.x86_64 #1 SMP Thu Jul 23 15:44:03 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
10.0.0.112 | CHANGED | rc=0 >>
Linux dbjf-istp-lvs1 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
批量授权方案
hosts
[nginx]
172.0.0.1
[jboss]
10.10.0.1
initial-ssh.sh
#!/bin/bash
user=''
password=''
for host in $(cat hosts|grep -v '\[')
do
sshpass -p ${password} ssh-copy-id -o StrictHostKeyChecking=no root@${host}
done
3 升级中常用的模块
- command:在远程主机中执行命令,不经过远程主机的shell处理。不支持重定向、管道符。如远程节点是windows,则使用win_command模块。
- shell:在远程主机中执行命令时,会经过远程主机上的/bin/sh程序处理。
- script:脚本只存在于ansible主机本地,无需手动拷贝到远程主机后再执行。
3.1 调用本地脚本在受控机执行
[root]# ansible iweb -m script -a "./back-all.sh"
10.0.0.111 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 10.0.0.111 closed.\r\n",
"stderr_lines": [
"Shared connection to 10.0.0.111 closed."
],
"stdout": "",
"stdout_lines": []
}
3.2直接调用受控机的脚本执行
10.0.0.111 | CHANGED | rc=0 >>
3.3 远程复制过程中利用copy自带的backup参数备份
- name: configure httpd
copy: src=/etc/ansible/files/httpd.conf dest=/etc/httpd/conf/ backup=yes
notify: restart httpd
3.4 分发文件到受控机可以使用copy或rsync模块。
[root]# ansible web_jboss_gmjj -m copy -a "src=/data/down/php-5.4.16-42.el7.x86_64.rpm dest=/upgrade/ owner=root group=root mode=755"
10.0.0.0 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "7d9868a58c2e2aa6a434c4fb8819c0eebedd391d",
"dest": "/upgrade/php-5.4.16-42.el7.x86_64.rpm",
"gid": 0,
"group": "root",
"md5sum": "0334e09f8c56b261eb7f762bcc027f89",
"mode": "0755",
"owner": "root",
"size": 1419816,
"src": "/root/.ansible/tmp/ansible-tmp-1636009694.72-34754-140290725324375/source",
"state": "file",
"uid": 0
}
3.5 checksum文件对比校验。
[root@dbjf-istp-lvs2 down]# sha1sum php-5.4.16-42.el7.x86_64.rpm
7d9868a58c2e2aa6a434c4fb8819c0eebedd391d php-5.4.16-42.el7.x86_64.rpm
[root@dbjf-istp-lvs2 down]# ansible web_jboss_gmjj -m stat -a "path=/upgrade/php-5.4.16-42.el7.x86_64.rpm"
10.0.0.111 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"stat": {
"atime": 1636009555.3919408,
"charset": "binary",
"checksum": "7d9868a58c2e2aa6a434c4fb8819c0eebedd391d",
"ctime": 1636009555.3969407,
"isuid": false,
"mimetype": "application/x-rpm",
"mode": "0755",
"mtime": 1636009555.065942,
"nlink": 1,
"path": "/upgrade/php-5.4.16-42.el7.x86_64.rpm",
"pw_name": "root",
"readable": true,
"size": 1419816,
}
3.6 下载文件到指定目录:
ansible all -m get_url -a "url=http://www.mp4.com dest=/tmp/mp4 mode=0440 force=yes"
3.7 解压ansible管理机上的压缩文件到远程主机:
ansible all -m unarchive -a "src=/tmp/install/zabbix-3.0.4.tar.gz dest=/tmp/ mode=0755 copy=yes"
3.8 解压远程主机上的文件到目录:
ansible all -m unarchive -a "src=/tmp/install/zabbix-3.0.4.tar.gz dest=/tmp/ mode=0755 copy=no"
4 playbook
将多个play组织在一个playbook中,即可以让它们联合起来按事先编排的机制完成某一任务。
Playbook核心元素
- Hosts 执行的远程主机列表
- Tasks,playbook的核心,定义顺序执行的动作 action,调用ansbile module。
- Varniables 内置变量或自定义变量在playbook中调用
- Templates 模板,即使用模板语法的文件,比如配置文件等
- Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
Handlers will only be fired for tasks which report a changed state.
只有当 task 执行状态显示是 changed 时,handler 动作才会被触发
handlers是按照在handlers中定义个顺序执行的,而不是安装notify的顺序执行的。
- tags 标签,指定某条任务执行,用于选择运行playbook中的部分代码。
[root@dbjf-istp-lvs2 ansible-work]# vi playbooks/web.yml
- hosts: webservers
vars:
worker_processes: 4
num_cpus: 4
max_open_files: 65535
root: /upgrade
remote_user: root
tasks:
- name: make sure ntpd is running
service: name=ntpd state=started
Tips:
当tasks 参数比较多时,为了美观和不易出错,建议用 yml的字典传参:
tasks:
- name: make sure ntpd is running
service:
name: ntpd
state: started
playbook语法:
ansible-playbook --** file.yml
-i hosts
-i hosts -l group1
-C
--list-tasks
--list-hosts #列出目标主机
--list-tags
--syntax-check
-f 10 #并行处理
--syntax-check #语法检验
yml语法一览:
- 大小写敏感
- 使用缩进表示层级关系.不允许使用Tab键,只允许使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可!
- '#'表示注释,从这个字符一直到行尾
- 开始行是
---
. 这是 YAML 格式的一部分, 表明一个文件的开始 - 列表中的所有成员都开始于相同的缩进级别, 并且使用一个
"- "
作为开头(一个横杠和一个空格) - 一个字典是由一个简单的 键: 值 的形式组成(这个冒号后面必须是一个空格)
- Ansible 使用
“{{ var }}”
来引用变量,foo: "{{ variable }}"
。
关闭facts
不收集系统信息可以加快执行效率。
- hosts: all
gather_facts: no
变量的注册和调试
---
- hosts: all
tasks:
- name: ls /tmp
shell: ls -l /tmp
register: result
ignore_errors: True
- name: echo result when rc==5
shell: echo "{{result}}"
when: result.rc == 5
- name: debug show stdout
debug:
msg: "{{result.stdout}}"