什么是Ansible

Ansible是2013年推出的一款IT自劢化和DevOps软件,目前由Redhat已签署Ansible收购协议。其是基亍Python研发,糅合了很多老运维工具的优点实现了批量操作系统配置,批量程序的部署,批量运行命令等功能

一句话概括: 无主无从架构,开箱即用,用完就走。
工作原理
整个Ansible分为两个大块,主机和ansible本身

  • ansible本身:核心模块如copy\shell\ping等,复杂应用部署playbook,主机清单hosts,定制化的模块,SSH

Ansible 分发文件 ansible批量传输文件_Ansible 分发文件

ansible可以让我们实现:

  • 自劢化部署APP
  • 自劢化管理配置项
  • 自劢化的持续交付
  • 自劢化的(AWS)于服务管理

为什么要选择ansible

• ansible优点

  1. 是仅需要ssh和Python即可使用
  2. 无客户端
  3. ansible功能强大,模块丰富
  4. 上手容易门槛低
  5. 基亍 python 开发,做二次开发更容易
  6. 使用公司比较多,社区活跃

• ansible缺点

– 对于几千台、上万台机器的操作情况,还不清楚性能、效率情况如何,需要进一步了解。

• ansible特性

  1. 部署简单
  2. 主从模式工作
  3. 支持自定义模块
  4. 支持playbook
  5. 易于使用
  6. 支持多层部署
  7. 支持异构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