什么是Ansible
Ansible是2013年推出的一款IT自劢化和DevOps软件,目前由Redhat已签署Ansible收购协议。其是基亍Python研发,糅合了很多老运维工具的优点实现了批量操作系统配置,批量程序的部署,批量运行命令等功能
一句话概括: 无主无从架构,开箱即用,用完就走。
工作原理
整个Ansible分为两个大块,主机和ansible本身
- ansible本身:核心模块如copy\shell\ping等,复杂应用部署playbook,主机清单hosts,定制化的模块,SSH
ansible可以让我们实现:
- 自劢化部署APP
- 自劢化管理配置项
- 自劢化的持续交付
- 自劢化的(AWS)于服务管理
为什么要选择ansible
• ansible优点
- 是仅需要ssh和Python即可使用
- 无客户端
- ansible功能强大,模块丰富
- 上手容易门槛低
- 基亍 python 开发,做二次开发更容易
- 使用公司比较多,社区活跃
• ansible缺点
– 对于几千台、上万台机器的操作情况,还不清楚性能、效率情况如何,需要进一步了解。
• ansible特性
- 部署简单
- 主从模式工作
- 支持自定义模块
- 支持playbook
- 易于使用
- 支持多层部署
- 支持异构IT环境
安装ansible
ansible是需要在ansible controller节点(造作机)安装即可,其他节点口语i直接通过SSH协议进行连接操作
1.1 ansible 源码下载安装
git clone git://github.com/ansible/ansible.git
yum install python-setuptools python-devel
python setup.py build
python setup.py install
1.2 pip 方式安装
pip install ansible
1.2: 安装ansible
yum list ansible #ansible版本,如果这个命令运行有问题的话,多运行几次
yum install ansible -y
安装完成以后验证
ansible -version
或者
rpm -qa | grep ansible
1.3 ansible查看帮助
ansible-doc -l #查看总帮助
ansible-doc -s shell #查看shell模块的帮助
ansible-doc -s raw
配置主机组(/etc/ansible/hosts)
ansible controller在对主机进行操作时,仅认在主机清单中定义的主机列表
主机清单的作用:
- 用于ansible controller配置主机时读取主机列表
- 实现主机分组
直接在主机清单hosts文件中写入主机IP地址或主机名(需要能够解析出)
[testgroup]
192.168.56.40
192.168.56.41
192.168.56.42
[test41]
192.168.56.41
[test42]
192.168.56.42
配置ssh免密码登录
ssh-keygen -t rsa -f /root/.ssh/id_rsa -N '' #按回车即可
ssh-copy-id -i 远程主机IP #同步密钥到远程主机
ansible模块
1. ansible语法
ansible 主机组或者主机 -m 模块 -a 命令
2. ping模块测试主机之间互通性
ansible testgroup -m ping
3. cron模块实现配置多主机时间同步
ansible testgroup -m cron -a 'name="test_cron1" job="ntpdate time1.aliyun.com" minute=0 hour=*/1'
# time1.aliyun.com阿里的时钟源
设置完之后可以查看:
crontab -l # 查看设置的定时任务
4. ansible模块command(不支持管道,不建议使用)
ansible testgroup -m command -a "pwd"
ansible testgroup -m command -a "echo testa|grep a" #这个不能正常使用
ansible testgroup -m command -a "echo bb >>/tmp/testansible" #重定向也无法正常使用
5. ansible模块shell(支持管道),批量执行shell指令
ansible testgroup -m shell -a "echo testa|grep a" #支持管道
ansible testgroup -m shell -a "echo bb >>/tmp/testansible" #支持重定向
ansible testgroup -m shell -a "cat /etc/passwd|awk -F':' '{print \$1}'" #遇到特殊符号需要加入\转义,这样子ansible才能正常运行
6. ansible模块raw(如果运行命令,一般使用shell模块)
说明为什么会有raw,由于ansible依赖python环境,例如需要有python-simplejson之类的包,如果没安装的话,就无法使用shell等模块,就需要先用raw安装一下。
ansible testgroup -m raw -a "yum install python-simplejson -y"
ansible testgroup -m raw -a "yum install libselinux-python -y"
7. ansible模块copy(下放文件)
ll -h /usr/local/src/
cat /tmp/testdir/test.txt
ansible testgroup -m copy -a "src=/tmp/testdir/test.txt dest=/usr/local/src/"
#src指定本地的文件
#dest指定远程主机的目录或者文件
8. 拷贝文件夹
ll -h /usr/local/src/
ansible testgroup -m copy -a "src=/tmp/testdir/ dest=/usr/local/src/" #testdir文件夹没拷贝
ansible testgroup -m copy -a "src=/tmp/testdir dest=/usr/local/src/" #testdir文件夹也拷贝了
9. 备份文件
ansible testgroup -m copy -a "src=/tmp/testdir/test.txt dest=/usr/local/src/ backup=yes"?
10. 指定用户和权限
ansible testgroup -m copy -a "src=/tmp/testdir/test.txt dest=/usr/local/src/ backup=yes owner=nobody group=nobody mode=0600"
11: ansible模块script(远程机器运行ansible主控端的脚本)
实现的方案: 把脚本下发到所有的服务器,然后再运行脚本。copy+shell+delete
cat /usr/local/src/script
chmod a+x /usr/local/src/script
ansible testgroup -m script -a "/usr/local/src/script"
12: ansible-playbook(把ansible执行命令写入文件中)
#cat /usr/local/src/test.yaml
- hosts: testgroup
tasks:
- name: test ansible
shell: echo "shell 1" >>/tmp/a
- name: test2
shell: echo "shell 2" >>/tmp/a
运行:ansible-playbook /usr/local/src/test.yaml
#cat /usr/local/src/test_copy.yaml
- hosts: testgroup
tasks:
- name: test ansible
shell: echo "shell 1" >>/tmp/a
- name: test copy
copy: src=/tmp/a dest=/usr/local/src/
#下发nginx配置,对nginx进行检测
#cat /usr/local/src/test_nginx.yaml
- hosts: testgroup
tasks:
- name: copy nginx conf
copy: src=/tmp/nginx.conf dest=/usr/local/nginx/conf/ backup=yes
- name: nginx conf check
shell: /usr/local/nginx/sbin/nginx -t
register: nginx_result
- debug: var=nginx_result
#可只输出stdout_lines或者stderr_lines