《Ansible_Up-And-Running》笔记1-Ansible超详细使用指南

本文是一份详尽的Ansible使用教程,涵盖了从安装配置到自动化部署的全过程。介绍了Ansible的语法简易性、分布式系统管理和对多服务器的并行处理能力。详细讲解了playbook、模块、变量、Facts、Roles、加速技巧等内容,并提到了Docker的集成。适合Linux运维人员和自动化部署需求者阅读。
摘要由CSDN通过智能技术生成

在工作中有用到ansible用于自动部署和环境配置,这里整理了一份很详尽的使用指南,如果有用到的可以看看。关于使用ansible自动部署一个网站和docker化,将在下一篇文章中介绍,敬请期待。文章内容主要翻译整理自ansible官方网站推荐的Ansible-Up and Running一书。

1 为什么选择Ansible

来源:ansible一词源于科幻小说,是一种超光速通信设备。
Ansible is the simplest way to automate apps and IT infrastructure。
750+模块,19000+ github stars。

图1 ansible的使用场景

配置管理、应用部署等。配置管理工具有Chef, Puppet, Salt等,应用部署(将代码编译或打包然后传输到服务器部署并启动服务)工具有Capistrano,Fabric等,ansible集两者于一身,操作很简单但是功能强大。此外,还可以对多个服务器进行服务编排,支持openstack,amazon ec2, docker等。

ansible使用了一个DSL(domain-specific language)描述服务器状态。执行的文件称为playbook,文件格式为yaml。ansible简约而不简单。比起puppet的繁琐的配置和复杂语法( Puppet基础篇4-安装、配置并使用Puppet | Puppet运维自动化经验分享 ),简直是一股清流。 图2描述了ansible执行过程,执行了两个task和一个handler,先是使用了一个apt模块在web1,web2,web3上面执行了安装nginx的任务,再是用template模块拷贝了配置文件。另外,执行了一个notify nginx的handler重启了nginx。

图2 ansible执行流程示意图

执行流程:

1. 创建一个python脚本用于安装nginx包。
2. 拷贝python脚本到web1,web2,web3。
3. 分别在web1,web2,web3上执行该脚本。
4. 等待脚本在所有服务器上执行完毕。
5. 接着执行下一个task。

注意的几点:
- 1.在各个服务器执行脚本的过程是并行的,有个forks参数可以指定,默认是5,即一次可以在5个服务器上并行执行脚本。
- 2.要在所有的服务器都执行完第一个task后才会接着执行第二个task。(新版本新增了异步参数,一个服务器在执行完了它的任务后可以不等其他服务器执行完直接执行下一个task)。
- 3.ansible执行任务顺序与playbook中的顺序一致。

优势:
- 语法易读。yaml->json好比markdown->html。ansible的playbook可以被称之为可以执行的README。
- 远程主机不需要安装任何东西。(这有点夸大了,python2.5+(python2.4+simplejson模块)和ssh是必须的,当然这现在已经是Linux服务器标配了)
- push-based。如chef和puppet是pull-based,先将文件修改推送到中心服务器,其他服务器的agent定期拉取新的配置管理脚本并在本机执行。而在ansible是push-based的,先在中心服务器修改playbook,执行该playbook,ansible会连接到各个服务器并执行模块改变服务器状态。push-based的好处就是只在需要的时候才操控去改变目标服务器状态。如果你更倾向于pull-based模式,可以用ansible-pull。
- ansible可以很方便的scaled down,单机跟多机没有什么区别。 Simple things should be simple, complex things should be possible 。
- 很轻量级的抽象。不像puppet之类的工具,有很高的抽象,比如有package这个概念,用于不用区分服务器版本来安装模块。但是在ansible中,提供的是apt和yum模块,由你自己采用,不要再额外学一些抽象的语法,简化你的学习成本。也有人觉得这是ansible的缺点,优缺点与否,各有评判。

2 安装配置

2.1 安装

pip install ansible
依赖环境:python

2.2 配置

配置ansible.cfg文件,ansible配置文件寻找路径:

1. File specified by the ANSIBLE_CONFIG environment variable 
2. ./ansible.cfg (ansible.cfg in the current directory)
3. ~/.ansible.cfg (.ansible.cfg in your home directory)
4. /etc/ansible/ansible.cfg

ansible.cfg配置文件实例

[defaults]
hostfile=/etc/ansible/hosts
private_key_file = /Users/ssj/.ssh/id_rsa_ansible
remote_user = ssj
remote_port = 22 
host_key_checking = False

注意,如果是在服务器上,不要放置private key,可以通过ssh forward。

2.3 测试

简单执行命令测试是否成功 ( -vvvv可以看到更多细节信息),”changed”:false表示执行ping模块没有改变服务器状态,”ping”:pong表示模块执行后输出结果为pong。你也可以将ping模块改成command,加上参数执行指定命令。比如 ansible testserver -m command -a uptime ,当然,command是默认模块,因此还可以简化为 ansible testserver -a uptime

#hosts
[testserver]
127.0.0.1

#run command,-i hosts可以省去。
ssj@ssj-mbp ~/ansible $ ansible testserver -i hosts -m ping
127.0.0.1 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

3 实体关系图

图3 实体关系图

  • playbook包含很多个play
  • play中包含name,tasks,hosts,vars,handles属性。
  • tasks中包含各个真正执行的module,如apt,copy,file, git, svn,service,command,notify,mysql等。具体的模块参数和使用文档在这里

4 一个例子

---
- name: Configure webserver with nginx and tls
  hosts: webservers
  sudo: True
  vars:
    key_file: /etc/nginx/ssl/nginx.key
    cert_file: /etc/nginx/ssl/nginx.crt
    conf_file: /etc/nginx/sites-available/default
    server_name: localhost
  tasks:
    - name: Install nginx
      apt: name=nginx update_cache=yes cache_valid_time=3600
    - name: create directories for TLS certificates
      file: path=/etc/nginx/ssl state=directory
    - name: copy TLS key
      copy: src=files/nginx.key dest={
  { key_file }} owner=root mode=0600
      notify: restart nginx
    - name: copy TLS certificate
      copy: src=files/nginx.crt dest={
  { cert_file }}
      notify: restart nginx
    - name: copy nginx config file
      template: src=templates/nginx.conf.j2 dest={
  { conf_file }}
      notify: restart nginx
    - name: enable configuration
      file: dest=/etc/nginx/sites-enabled/default src={
  { conf_file }} state=link
      notify: restart nginx
    - name: copy index.html
      template: src=templates/index.html.j2 dest=/usr/share/nginx/html/index.html mode=0644
  handlers:
    - name: restart ng
Java 调用 Ansible Playbook 可以通过调用命令行的方式实现,例如使用 ProcessBuilder 类来执行命令行。下面是一个简单的示例代码: ```java public static void runAnsiblePlaybook(String playbookPath, String inventoryPath) throws IOException, InterruptedException { ProcessBuilder pb = new ProcessBuilder("ansible-playbook", "-i", inventoryPath, playbookPath); pb.redirectErrorStream(true); Process process = pb.start(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } process.waitFor(); } ``` 在这个示例中,我们使用 ProcessBuilder 类来创建一个命令行进程。我们将 Ansible Playbook 命令 `ansible-playbook` 作为参数传递给 ProcessBuilder 构造函数,并使用 `-i` 选项指定主机清单文件的路径,以及使用第二个参数 `playbookPath` 指定要执行的 Playbook 文件的路径。我们还将 `redirectErrorStream` 设置为 true,以便将标准输出和标准错误流合并到一个流中。 接下来,我们使用 `start()` 方法启动进程,并使用 `getInputStream()` 方法获取进程的标准输出流。我们使用 `BufferedReader` 逐行读取输出,并将其打印到控制台上。 最后,我们使用 `waitFor()` 方法等待进程完成执行。 需要注意的是,在实际应用中,我们可能需要为 Ansible Playbook 设置其他参数,例如 `--extra-vars` 或 `--tags` 等。我们可以将这些参数作为命令行参数传递给 ProcessBuilder。同时,我们还需要处理进程的错误输出流,以便及时发现和处理错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值