Ansible介绍:
ansible是新出现的自动化运维工具,基于Python开发,分布式,无需客户端,轻量级,实现了批量系统配置、批量程序部署、批量运行命令等功能,ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。

Ansible特性
1)、no agents:不需要在被管控主机上安装任何客户端,更新时,只需在操作机上进行一次更新即可(不用安装客户端。分布式的)
2)、no server:无服务器端,使用时直接运行命令即可
3)、modules in any languages:基于模块工作,可使用任意语言开发模块
4)、yaml,not code:使用yaml语言定制剧本playbook
5)、ssh by default:基于SSH工作
6)、strong multi-tier solution:可实现多级指挥

ansible部署(实验环境):
系统centos7u6
主机:四台 一个控制节点 三个被控制节点
解析:四台服务器之间互相做本地解析
保证防火墙,selinux关闭
网络,base仓库及epel仓库可用

安装ansible:

yum -y isntall ansible
ansible —version #测试

在进行多台主机实验时,需要在/etc/ansible/hosts内添加被控制服务器得ip地址
/etc/ansible/ansible.cfg 这是ansible得主配置文件
主要设置一些ansible初始化的信息,比如日志存放路径、模块、插件等配置信息

  1. 配置文件中常见参数:
  2. inventory = /etc/ansible/hosts
  3. #这个参数表示资源清单inventory文件的位置
  4. library = /usr/share/ansible
  5. #指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
  6. forks = 5
  7. #并发连接数,默认为5
  8. sudo_user = root
  9. #设置默认执行命令的用户
  10. remote_port = 22
  11. #指定连接被管节点的管理端口,默认为22端口,建议修改,能够更加安全
  12. host_key_checking = False
  13. #设置是否检查SSH主机的密钥,值为True/False。关闭后第一次连接不会提示配置实例
  14. timeout = 60
  15. #设置SSH连接的超时时间,单位为秒
  16. log_path = /var/log/ansible.log
  17. #指定一个存储ansible日志的文件(默认不记录日志)

vim /etc/ansible/hosts
添加被控制节点
可以添加在一个组内或者单独添加
[web]
ansible
web-1
web-2
保存退出
ssh-keygen #制作密钥
ssh-copy-id web-1
ssh-copy-id web-2

进行测试:

ansible web -m ping
语法:
ansible -m -a
pattern—主机清单里定义的主机组名,主机名,IP,别名等,all表示所有的主机,支持通配符,正则
: —多个组,组名之间用冒号隔开
web —组名或主机名中含web的
webservers[0] - webservers组中的第一台主机
以~开头,匹配正则
-m module_name: 模块名称,默认为command
-a arguments: 传递给模块的参数
例:
执行shell命令: -a 是传给模块的参数
[root@ansible ~]# ansible web1 -m shell -a ‘uptime’

给节点增加用户:
[root@vm20 ~]# ansible 192.168.245.143 -a “useradd tom”
[root@vm20 ~]# ansible 192.168.245.143 -a “grep tom /etc/passwd”

重定向输出到本地文件中:
[root@vm20 ~]# ansible 192.168.245.143 -a “df -h” > /tmp/a.txt

command模块:
[root@ansible ~]# ansible web1 -m command -a ‘uptime’

因为默认模块就是command,所以上面命令可以不加-m:
[root@ansible ~]# ansible web1 -a ‘uptime’

copy模块:

ansible weball -m copy -a ‘src=/root/a.txt dest=/opt owner=root group=root mode=644’ -o
src=:指定源文件路径
dest=:目标地址(拷贝到哪里)
owner:指定属主
group:指定属组
mode:指定权限,可以以数字指定比如0644
backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no

软件包管理 yum模块
安装apache
[root@ansible-server ~]# ansible webservers1 -m yum -a “name=httpd state=latest” -o
state= #状态是什么,干什么
state=absent 用于remove安装包
state=latest 表示最新的
state=removed 表示卸载
卸载软件:
[root@ansible-server ~]# ansible webservers1 -m yum -a “name=httpd state=removed” -o

服务管理service模块
[root@ansible-server ~]# ansible webservers1 -m service -a “name=httpd state=started” #启动
[root@ansible-server ~]# ansible webservers1 -m service -a “name=httpd state=stopped” #停止
[root@ansible-server ~]# ansible webservers1 -m service -a “name=httpd state=restarted” #重启
[root@ansible-server ~]# ansible webservers1 -m service -a “name=httpd state=started enabled=yes” #开机启动
[root@ansible-server ~]# ansible webservers1 -m service -a “name=httpd state=started enabled=no” #开机关闭

文件模块file
模块参数详解:
owner:修改属主
group:修改属组
mode:修改权限
path=:要修改文件的路径
recurse:递归的设置文件的属性,只对目录有效
yes:表示使用递归设置
state:
touch:创建一个新的空文件
directory:当目录存在时不会进行修改
[root@ansible-server ~]# ansible webservers1 -m file -a ‘path=/tmp/88.txt mode=777 state=touch’ #创建一个文件
[root@ansible-server ~]# ansible webservers1 -m file -a ‘path=/tmp/99 mode=777 state=directory’ #创建一个目录

收集信息模块setup
[root@ansible-server ~]# ansible webservers1 -m setup #收集所有信息
[root@ansible-server ~]# ansible webservers1 -m setup -a ‘filter=ansibleall_ipv4_addresses’ #只查询ipv4的地址
filter:过滤
[root@ansible-server ~]# ansible webservers1 -m setup -a ‘filter=ansible
*_mb’
[root@ansible-server ~]# ansible -i /home/ansible/hostlist web -m setup -a ‘filter=ansible_processor_cores’
[root@ansible-server ~]# ansible all -m setup —tree /tmp/facts

实战:批量安装apache服务,并使用浏览器访问到对应的项目[root@xingdian /]# vim apache.yml

  • hosts: web
    user: root
    tasks:

    • name: apache install
      yum: name=httpd state=latest
    • name: mkdir file
      file: path=/web1 state=directory mode=777
    • name: copy index
      copy: src=/apache/index.html dest=/web1
    • name: Listen
      shell: echo “Listen 81” >> /etc/httpd/conf/httpd.conf
    • name: copy conf
      copy: src=/apache/hello.conf dest=/etc/httpd/conf.d/
      notify: start httpd
      handlers:
    • name: start httpd
      service: name=httpd state=restarted
      保存退出

cd /apache
echo “so nice” > index.html
vim hello.conf


ServerName localhost
DocumentRoot /web1


AllowOverride all
Require all granted

检测语法:

ansible-playbook —syntax-check apache.yml
ansible-playbook apache.yml

自建变量实验:

vim /etc/ansible/aaa.yml

  • hosts: ‘{{ hosts }}’
    user: ‘{{ user }}’
    tasks:

    • name: test
      shell: free -m | grep Mem >> /root/a.txt
      保存退出
      使用ansible-playbook —syntax-check检测是会报错得
      使用时需要参数去指定变量得值:

ansible-playbook aaa.yml —extra-vars “hosts=web user=root”

set_fact自定义facts变量:
set_fact模块可以自定义facts,这些自定义的facts可以通过template或者变量的方式在playbook中使用。如果你想要获取一 个进程使用的内存的百分比,则必须通过set_fact来进行计算之后得出其值,并将其值在playbook中引用。

vim /etc/ansible/bbb.yml

  • hosts: web
    user: root
    tasks:

    • name: Calculate InnoDB buffer pool size
      set_fact: innodb_buffer_pool_size_mb=”{{ ansible_swapfree_mb / 2 }}”
    • name: nihao
      template: src=/my.cnf dest=/etc/my.cnf owner=root group=root mode=0644
      保存退出
      set_fact: innodb_buffer_pool_size_mb=”{{ ansible_memtotal_mb / 2 }}”
      通过sey_fact去定义,而不是直接执行
      template: src=templates/my.cnf dest=/etc/my.cnf owner=root group=root mode=0644
      template:这个是一个模板 可以传变量

vim /my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

Disabling symbolic-links is recommended to prevent assorted

security risks
symbolic-links=0

Configure the buffer pool

innodb_buffer_pool_size = {{ innodb_buffer_pool_size_mb|int }}M
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
保存退出

ansible-playbook —syntax-check bbb.yml
ansible-playbook bbb.yml

Ansible-role:
role 角色
roles是在ansible中,playbooks的目录组织结构。
每一个角色是有名字的 他是一个目录 , 可以包含子目录
以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等;

role_name/ 这个是角色的名称
files/:存储由copy或script等模块调用的文件;
tasks/: 专门存储任务的目录 一个角色可以定义多个任务
此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用;
handlers/: 条件 前一个任务执行成功去执行下面的 处理特定事物的文件
此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用;
vars/: 变量 定义变量的文件
此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用;
templates/: 模板 使用变量的文件存储由template模块调用的模板文本;
meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用;
default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;

利用rloe角色批量部署nginx并发布内容实验:
准备目录结构:

cd /etc/ansilbe/roles
mkdir nginx/{files,handlers,tasks,templates,vars} -p
创建文件:
touch site.yml nginx/{handlers,tasks,vars}/main.yml
检验:
yum install -y tree
tree nginx/
nginx/
├── files
├── handlers
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
└── vars
└── main.yml

5 directories, 3 files

创建nginx得测试文件

echo “so nice” > nginx/files/index.html
安装nginx并配置模板:
yum -y install nginx && cp /etc/nginx/nginx.conf nginx/templates/nginx.conf.j2
编写任务:
vim nginx/tasks/main.yml

  • name: install epel
    yum: name=epel-release state=latest
  • name: install nginx
    yum: name=nginx state=latest
  • name: copy nginx.conf templte
    template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  • name: copy index.html
    copy: src=index.html dest=/usr/share/nginx/html/index.html
    notify: start nginx
    保存退出
    准备配置文件:

vim /nginx/templates/nginx.cong.j2
注释掉worker_processes auto;
并在它下面添加worker_processes {{ worker_connections }};

编写变量:

vim nginx/vars/main.yml
添加以下内容:
worker_connections:2

编写handlers:

vim nginx/handlers/main.yml
添加:

  • name: start nginx
    service: name=nginx state=started

编写剧本:

vim site.yml

  • hosts: web
    user: root
    roles:

    • nginx

检测:

ansible-playbook site.yml —syntax-check
playbook: site.yml

执行脚本:

ansible-playbook site.yml
如有报错根据报错提示进行修正
随后查看被控制机即可或
ansible web -m shell -a “ss -antpl”