ansible可以同时操纵多台服务器的工具。
实验环境:
ansible控制端 1台
客户机2台
必要的软件和yum源
1.安装ansible
# yum install epel-release -y
# yum install ansible -y
# ansible --version
# vim /etc/ansible/ansible.cfg
激活
host_key_checking = False
保存
# vim /etc/ansible/hosts
通用写法如下:
别名 ansible_ssh_host=主机IP1 ansible_ssh_port=ssh的端口 ansible_ssh_user=用户 ansible_ssh_pass="密码"
[组名]
别名1
别名2
例如:
nginx1 ansible_ssh_host=10.1.1.13 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123"
nginx2 ansible_ssh_host=10.1.1.14 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123"
[nginx]
nginx1
nginx2
保存,检测
ansible -m ping nginx
检查所有
ansible -m ping all
2.使用
语法
# ansible 组名 -m 模块名 -a '参数=值 参数=值 参数=值'
https://docs.ansible.com/ansible/latest/modules/
参照官网文档。
此处重点介绍3个命令
1.copy,file
把ansible机的文件上传给每一台机器。
# ansible 组名 -m copy -a 'src=本机文件路径 dest=目标路径 backup=yes(可选是否备份) owner=daemon(可选主人) group=daemon(可选组) mode=1777(可选权限) force=yes(可选强制)'
# ansible group1 -m copy -a 'src=/etc/fstab dest=/tmp/333 backup=yes owner=daemon group=daemon mode=1777'
删除文件或目录
# ansible 组名 -m file -a "path=路径 state=absent"
# ansible group1 -m file -a "path=/etc/yum.repos.d/ state=absent"
2.fetch
把每台机器的同一个文件下载到ansible机器上。
# ansible 组名 -m fetch -a 'src=远程文件路径 dest=本机路径'
# ansible group1 -m fetch -a 'src=/tmp/1.txt dest=/tmp/'
最终路径格式其实是
/本机路径/机器别名/文件名
由此来区分下载文件同名问题。
3. shell
可以同时执行shell命令
# ansible -m shell 组名 -a "shell操作"
# ansible -m shell group1 -a "cat /etc/passwd |wc -l"
无法保证所有正常的命令都好使。
4.script
可以同时执行*.sh文件(先确保能用)
# ansible 组名 -m script -a '脚本路径.sh'
# ansible group1 -m script -a '/tmp/1.sh'
5.service
同时设置服务和开机启动。
# ansible 组名 -m service -a 'name=服务名 state=started enabled=on'
# ansible group1 -m service -a 'name=vsftpd state=started enabled=on'
服务命令为什么不用上面的shell命令呢,因为可能有兼容性的问题。
6.yum
# ansible 组名 -m yum -a 'name=模块名 state=行为或参数'
# ansible group1 -m yum -a 'name=httpd,httpd-devel state=latest'
卸载
# ansible group1 -m yum -a 'name=httpd,httpd-devel state=absent'
7.cron
# ansible 组名 -m cron -a 'name="计划名" user=执行用户 job="操作内容" minute=* hour=* day=* month=* weekday=*'
# ansible group1 -m cron -a 'name="test cron1" user=root job="touch /tmp/111" minute=*/1'
停止定时
# ansible group1 -m cron -a 'name="test cron1" state=absent'
3.playbook+roles工具
playbook:是ansible的一个脚本模块,可以执行一系列ansible命令
playbook是一种以.yaml或.yml为后缀的文件,他有自己的一套语法结构
大致描述如下:
1.开头---
2.key-value结构
3.数组成员前‘- ’
4.严格同级同缩进。
例如:
---
- hosts: group1
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum: name=httpd,httpd-devel state=latest
hosts是全文下的成员,要‘- ’开头。
name和yum是一组tasks下的成员,以‘- ’开头。
等等
roles:ansible将命令复用封装成roles。
观察playbook文件结构,会发现tasks下通常放置多个name元素,可以根据行为的类型将这些name组元素放在他们该在的文件夹里,然后tasks中调用他们,达成复用的目的。
例如:
*.yaml如下
---
- hosts: group1
remote_user: root
roles:
- AAA
- BBB
AAA,BBB是个啥?
roles有自己独立的目录结构
首先确保所有内容放在
/etc/ansible/roles/ 目录下
1.放什么?
在此处放置AAA,BBB。意思就是上面调用的方法名就是roles文件夹下的文件夹名字,名字自定义。
每个AAA文件夹里再放,如下6个文件夹:
files:用来存放由copy模块或script模块调用的文件。
tasks:至少有一个main.yml文件,定义各tasks。
handlers:有一个main.yml文件,定义各handlers。
templates:用来存放jinjia2模板。
vars:有一个main.yml文件,定义变量。
meta:有一个main.yml文件,定义此角色的特殊设定及其依赖关系。
如下可以一次性创建。
# mkdir /etc/ansible/roles/{AAA,BBB,CCC等等}/{files,tasks,handlers,templates,vars,meta} -p
# touch /etc/ansible/roles/{AAA,BBB,CCC等等}/{files,tasks,handlers,templates,vars,meta}/main.yml
4.配置文件编写与执行
先编写yml文件
例如:
# mkdir /etc/ansible/playbook/
# vi /etc/ansible/playbook/httpd.yaml
---
- hosts: group1 #你的组名
remote_user: root #你使用的linux用户
roles:
- httpd #你调用的模块
# mkdir /etc/ansible/roles/httpd/{files,tasks,handlers,templates,vars,meta} -p
# touch /etc/ansible/roles/httpd/{files,tasks,handlers,templates,vars,meta}/main.yml
# vi /etc/ansible/roles/httpd/tasks/main.yml
---
- name: 安装httpd
yum: name=httpd,httpd-devel state=present
- name: 同步httpd配置文件,这个文件自己准备,只是个范例
copy: src=/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart httpd
- name: 启动httpd并开机自启动
service: name=httpd state=started enabled=yes
notify是个啥?
notify好比触发器,他跟它上面的name,copy是一组的,表示执行了这个copy行动之后,出发执行一个notify。调用handlers里的restart httpd方法。
则编辑handlers里的main.yml
# vim /etc/ansible/roles/httpd/handlers/main.yml
---
- name: restart httpd
service: name=httpd state=restarted
最后执行
执行语法
# ansible-playbook /etc/ansible/playbook/httpd.yaml
ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
没有红色则成功~