自动化运维—ansible

本文详细介绍了Ansible自动化运维工具的使用,包括安装、远程执行命令、文件拷贝、脚本执行、任务计划管理、包管理和服务管理。此外,深入探讨了Playbook的配置、变量、循环、条件判断、handlers应用以及实战案例,如批量安装nginx和管理配置文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自动化运维—ansible

一、Ansible介绍

Ansilbe是一个部署一群远程主机的工具。远程的主机可以是远程虚拟机或物理机, 也可以是本地主机。

Ansilbe通过SSH协议实现远程节点和管理节点之间的通信,不需要安装客户端。

Ansible基于模块工作,模块可以由任何语言开发

Ansible不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读

Ansible的安装十分简单,centos上可直接通过yum安装。

Ansible有提供命令行版本,免费。也有提供UI(浏览器图形化)版本,网址: www.ansible.com/tower,但是收费的。 官方文档: http://docs.ansible.com/ansible/latest/index.html

Ansible已经被redhat公司收购,它在github上是一个非常受欢迎的开源软件,github地址https://github.com/ansible/ansible

一本不错的入门电子书 https://ansible-book.gitbooks.io/ansible-first-book/

二、ansible安装和远程执行命令

查看ansible 的yum清单,安装ansible ansible-doc(只需要在lin-01上面安装就可以了)

yum -y install ansible  ansible-doc

安装完成之后,查看lin-01上面有没有公钥,如果没有则生成公钥,生成公钥的命令:ssh-keygen

b38dd94b543a5f3dcc5ebcf096524b7f51c.jpg

把此公钥分别 存放在lin-02机器上面,同时还要在lin-01上面进行认证一下

8d63d7c300df4c537df9e61b4a9ae9430b4.jpg

之后再到lin-01上面进行测试看看能不能远程连接lin-02

082728530ebaa7dfccdd466c8ac2d6cf2cb.jpg

编辑/etc/ansible/hosts文件,添加以下语句(这里的)

195b6fb4bb0f269f0b91a4fcaa58e2b7bf4.jpg

在行testhost主机上,执行命令

a31cbe0841953876ff26f94c2a456d7aac6.jpg

语句释义:ansible 批量执行命令,testhost 是主机的集合,-m后面接调用module的名字, -a后面接调用module的参数

d51424e7d4ab1c92b1c924bb8669b28ca44.jpg

shell模块也可以执行命令

852d43b9861fb9e8832618081e9cfc6134d.jpg

错误解决

错误: "msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"

解决: yum install -y libselinux-python

三、 ansible拷贝文件或目录

ansible linux-02 -m copy -a "src=/etc/ansible dest=/tmp/ansibletest owner=root group=root mode=0755"

  • linux-02 : 指定认证主机,可以是testhost集合;
  • copy -a "定义内容" :复制定义的内容
  • src=/etc/ansible :定义复制的源目录及文件
  • dest=/tmp/ansibletest :定义要复制到的位置
  • owner=root :定义uid为root
  • group=root :组为root
  • mode=0755 :权限为755

整个语句意思为:把master机器的/etc/ansible目录复制到远程机器linux-02上的/tmp/ansibletest目录,并指定所有者、所有组及其权限;

 

48f887ed2829513cf02630bc71e7d5b507a.jpg 在另一台机器上进行查看刚才拷贝的结果

4b667370fd11cf1deba7e7aee6305a58ed8.jpg

注意:

  • 源目录会放到目标目录下面去,
  • 如果目标指定的目录不存在,它会自动创建。
  • 如果拷贝的是文件,dest指定的名字和源如果不同,并且它不是已经存在的目录,相当于拷贝过去后又重命
  • 但相反,如果desc是目标机器上已经存在的目录,则会直接把文件拷贝到该目录下面。

四、 ansible远程执行脚本

先编写一个脚本内容如下

6b02f538bd4d9fc315a0c49eabad9bcab89.jpg

由于ansible执行脚本的时候需要把脚本拷贝到别的机器上然后才能批量执行脚本所以我们先要进行考本脚本文件

69e0030df095041492d870ac187e613ee78.jpg

开始执行命令并到另一台机器上面进行查看

f4e27f84d92400822659fdef744e8e3728e.jpg

2fa931ea9f0883fb8005a27ed8fb33bf05e.jpg

注意:-m command 不支持管道符,而-m shell 支持管道

五、ansible管理任务计划

  • 新建管理任务计划

给102机器创建名为test cron 的管理认为计划

267c83c7029f0f3d4030628bb98191ecbf4.jpg

在另一台机器上进行查看任务计划

561477abbcac442dd7fb6811ef47ea816dd.jpg

  • 管理计划任务

state=absent 定义状态为无,即可删除此计划任务

2a52de8822796c908a9c87eb17d74611e80.jpg

在到另一台机器上面进行查看有没有任务计划

483c7017c61ee07cdb1b33d0c4a42f7608b.jpg

注意:由ansible管理的计划任务 (crontab -e),请不要手动修改,否则会导致ansible无法再管理相应的计划任务

六、ansible安装包和管理服务

我们做实验要删除一个安装包

7248ce375b81fc2095bc81ad55d76896dac.jpg

到另外一台机器上进行检验,查看有没有删除

62f8404bd6a36e1964f7966055e39a86f17.jpg

在给另外一台机器进行安装httpd

6c5cd6d339bf31c63dbf51f043143cd1767.jpg

05c8966ba3e7e0d5a48c5e5bdd9e7305f8b.jpg

ansible-doc cron :查看指定模块的文档

120f50aecbae7af4fec3d14795408421f67.jpg

ansible-doc -l : 列出所有的模块

73c6273aa68c9a0d793fd168e226ac9cb6a.jpg

七、使用ansible playbook

  • Playbooks 是 Ansible的配置,部署,编排语言.他们可以被描述为一个需要希望远程主机执行命令的方案,或者一组IT程序运行的命令集合.
  • 如果 Ansible 模块你是工作室中的工具,那么 playbooks 就是你设置的方案计划.
  • Playbooks 的格式是YAML。 

1.首先进行创建一个文件,之后再使用ansible进行执行文件

68db3b85b908d94845808014ec59715ae12.jpg 

24b07074120cc3c7b901ac915b939b61cdf.jpg

到另一台机器上进行验证有没有执行成功

f2316fb674941cf20086951d5eabc1d9fe6.jpg

八、playbook里的变量

先创建一个文件

b78447cc12926782c77c5f5d6b18f8a4c62.jpg

create_user.yml文件语句释义:

  • name参数对该playbook实现的功能做一个概述,后面执行过程中,会打印name变量的值,可以省略;
  • gather_facts参数指定了在以下任务部分执行前,是否先执行setup模块获取主机相关 信息,如果后面的task会使用到setup获取的信息时会用到;
  • vars参数,指定了变量,这里指字一个user变量,其值为test,需要注意的是,变量值一定要用引号引住;
  • user指定了调用user模块,name是user模块里的一个参数,而增加的用户名字调用了上面user变量的值。

执行文件

7097c6f53bbe3e057af9677b31704611a50.jpg f053f7ef9e74b2b9ebd65b2bc826d943b9c.jpg

九、playbook里的循环

创建while.yml文件

---
- hosts: 192.168.126.102
  user: root
  tasks:
    - name: change mode for files
      file: path=/tmp/{{ item }} state=touch mode=600
      with_items:
        - 1.txt
        - 2.txt
        - 3.txt

689b5132722931145fbfef7eafc76fa9528.jpg

查看执行结果

0f049760f40567cc3cb6122237357887061.jpg

十、playbook里的条件判断

创建when.yml条件判断的yml文本

---
- hosts: 192.168.126.102
  user: root
  gather_facts: True
  tasks:
    - name: use when
      shell: touch /tmp/when.txt
      when: ansible_ens33.ipv4.address == "192.168.126.102"

when: ansible_ens33.ipv4.address == "192.168.112.138" 释义:

  • when: 为ansble模块
  • ansible_ens33 :为一个1级范围
  • ipv4:为ansible_ens33范围内的子集;
  • address:为ipv4的一个子集;
  • == "192.168.112.138" :匹配此IP

上面的when条件语句,就通过查看facter信息,来设置条件;

查看所有的facter信息: ansible 主机名-m setup

01d7a42db3709bbdba0a3031bb221c1674e.jpg

执行when.yml文件并进行检测

c18b3a4f8cc3806a52085be8671d082c39f.jpg

cd6fd2984337a7c6994d204f0c6fabdfef6.jpg

十一、playbook中的handlers

Ansible playbook中的handlers可实现类似逻辑与的功能。(相当于shell中&&)

运用场景为:修改完配置文件后,重新加载配置文件;

创建handler.yml文件

---
- name: handlers test
  hosts: 192.168.126.102
  user: root
  tasks:
    - name: copy file
      copy: src=/etc/passwd dest=/tmp/bbb.txt
      notify: test handlers
  handlers:
    - name: test handlers
      shell: echo "111111" >> /tmp/bbb.txt

说明:此处必要copy步骤成功,handlers才能够继续执行

进行测试和查看

9bd7478a25febf9ab78eb532f1254c9f363.jpg

ca9792f6f20d87238248004ddf3aa443eb7.jpg

十二、 playbook安装nginx

  • 实战:批量安装源码nginx
  • 思路:先在一台机器上编译安装好nginx、打包,然后再用ansible去下发

第一步:创建/etc/ansible/nginx_install目录及其子目录

[root@linux-01 ansible]# mkdir nginx_install
[root@linux-01 ansible]# cd nginx_install/
[root@linux-01 nginx_install]# mkdir -p roles/{common,install}/{handlers,files,meta,tasks,templates,vars}

第二步:确定需要打包的nginx目录文件

[root@linux-01 nginx_install]# pwd
/etc/ansible/nginx_install
[root@linux-01 nginx_install]# ls
roles
[root@linux-01 nginx_install]# ls /usr/local/nginx
client_body_temp  conf  fastcgi_temp  html  logs  proxy_temp  sbin  scgi_temp  uwsgi_temp
[root@linux-01 nginx_install]# ls /etc/init.d/nginx
/etc/init.d/nginx
[root@linux-01 nginx_install]# ls /usr/local/nginx/conf/nginx.conf
/usr/local/nginx/conf/nginx.conf

第三步:打包nginx目录下,除vhost的所有有关nginxd文件;把nginx配置文件、启动脚本复制到roles/install/templates/下 

[root@linux-01 local]# tar czf nginx.tar.gz --exclude "nginx.conf" --exclude "vhost" nginx/
[root@linux-01 local]# mv nginx.tar.gz /etc/ansible/nginx_install/roles/install/files/
[root@linux-01 local]# cp nginx/conf/nginx.conf /etc/ansible/nginx_install/roles/install/templates/
[root@linux-01 local]# cp /etc/init.d/nginx /etc/ansible/nginx_install/roles/install/templates

9bf88f373aa8efab1956138c61affef3ee9.jpg

第四步:定义普通的tasks,创建main.yml文件

- name: Install initializtion require software
  yum: name={{ item }} state=installed
  with_items:
    - zlib-devel
    - pcre-devel

第五步:定义变量,创建/install/vars/main.yml 文件

[root@linux-01 common]# vim /etc/ansible/nginx_install/roles/install/vars/main.yml
nginx_user: www                         //用户
nginx_port: 800                         //端口
nginx_basedir: /usr/local/nginx         //nginx目录

第六步:定义文件拷贝配置文件

[root@linux-01 common]# vim /etc/ansible/nginx_install/roles/install/tasks/copy.yml
- name: Copy Nginx Software                 //把nginx包复制到指定目录
  copy: src=nginx.tar.gz dest=/tmp/nginx.tar.gz owner=root group=root  
- name: Uncompression Nginx Software         //用shell模块远程解压到/usr/local下
  shell: tar zxf /tmp/nginx.tar.gz -C /usr/local/                      
- name: Copy Nginx Start Script              //复制启动nginx脚本                     
  template: src=nginx dest=/etc/init.d/nginx owner=root group=root mode=0755  
- name: Copy Nginx Config                    //复制nginx配置文件,通过变量,即/usr/local/nginx下
  template: src=nginx.conf dest={{ nginx_basedir }}/conf/ owner=root group=root mode=0644

第七步:建立用户、启动服务。删除安装包

vim  /etc/ansible/nginx_install/roles/install/tasks/install.yml 

- name: Create Nginx User                   //创建用户信息等
  user: name={{ nginx_user }} state=present createhome=no shell=/sbin/nologin
- name: Start Nginx Service                 //远程启动nginx
  shell: /etc/init.d/nginx start
- name: Add Boot Start Nginx Service        //增加nginx服务,到启动项
  shell: chkconfig --level 345 nginx on
- name: Delete Nginx compression files        //删除nginx.tar.gz包
  shell: rm -rf /tmp/nginx.tar.gz

第八步:创建main.yml,调用copy和install

vim /etc/ansible/nginx_install/roles/install/tasks/main.yml
- include: copy.yml
- include: install.yml

第九步:创建入口文件

[root@linux-01 common]# vim /etc/ansible/nginx_install/install.yml
---
- hosts: 192.168.126.102
  remote_user: root
  gather_facts: True
  roles:
    - common
    - install

下面就要在linux-01上面使用ansible-playbook文件

0c2a20ac123f513fbcf218aacaf8c6edf73.jpg

另一台机器要关闭httpd,还有就是如果之前安装了nginx要先进行删除

6d31f942f80c21d99bda8cbe826e5bffb4c.jpg

十三、 playbook管理配置文件

生产环境中安装软件包只是在初始化环境的时候用一下,大多时候是需要管理配置文件的。此时可以用playbook功能。

创建playbook配置目录结构

[root@linux-01 ~]# mkdir  -p /etc/ansible/nginx_config/roles/{new,old}/{files,handlers,vars,tasks}
[root@linux-01 ~]# cd /etc/ansible/nginx_config/

把nginx虚拟主机,复制到nginx_config/roles/new/files/目录下

[root@linux-01 nginx_config]#  cd /usr/local/nginx/conf/
[root@linux-01 conf]# cp -r nginx.conf vhost  /etc/ansible/nginx_config/roles/new/files/
[root@linux-01 conf]# cd -

定义变量文件

[root@linux-01 conf]# vim /etc/ansible/nginx_config/roles/new/vars/main.yml

定义nginx重新加载配置

root@linux-01 nginx_config]# vim /etc/ansible/nginx_config/roles/new/tasks/main.yml 

- name: copy conf file
  copy: src={{ item.src }} dest={{ nginx_basedir }}/{{ item.dest }} backup=yes owner=root group=root mode=0644
  with_items:
    - { src: nginx.conf, dest: conf/nginx.conf }
    - { src: vhosts, dest: conf/ }
  notify: restart nginx

定义总入口配置,创建update.yml文件

[root@linux-01 nginx_config]# vim /etc/ansible/nginx_config/update.yml 

---
- hosts: 192.168.126.102
  user: root
  roles:
  - new

执行update.yml文件

[root@linux-01 nginx_config]# ansible-playbook /etc/ansible/nginx_config/update.yml

在另一台客户端机器上进行重新加载nginx服务

62ac7aea35dfa4921c04c93807fdf10abdd.jpg

文件的回滚测试

在linux-01机器上,把new文件夹备份到old文件夹

[root@linux-01 nginx_config]# rsync -av roles/new/ roles/old/

创建rollback.yml 文件

[root@linux-01 nginx_config]# vim /etc/ansible/nginx_config/rollback.yml 

---
- hosts: 192.168.126.102
  user: root
  roles:
  - old 

在linux-01上,配置文件nginx.conf,在include前面加上#号

[root@linux-01 nginx_config]# vim /etc/ansible/nginx_config/roles/new/files/nginx.conf

 # include vhost/*.conf;

执行rollback.yml 文件

[root@linux-01 nginx_config]# ansible-playbook /etc/ansible/nginx_config/rollback.yml 

 

 

 

转载于:https://my.oschina.net/u/4000361/blog/3019698

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值