自动化运维群管工具ansible

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

没有红色则成功~

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值