ansible介绍

ansible是由python写的一个自动化管理工具,对it资源进行管理和配置,器同类的工具有puppet,chef,salt等。

功能                        特点
系统环境设置                无客户端
安装软件                    推送式
持续集成                   丰富的module
热回滚                   基于yaml的playbook

ansible安装和配置

三种安装方式

1、 pip安装ansible
ansible是用python写的,所以可以借助python的包管理工具进行安装

pip install ansible

如果没有安装pip,就需要先安装pip,下面两种任选一种安装pip

1、 yum install python-pip
2、 easy_install pip

2、 yum安装ansible

yum install ansible

3、从源码安装

$ git clone git://github.com/ansible/ansible.git --recursive
$ cd ./ansible
$ source ./hacking/env-setup

ansible配置文件

Ansible的一些的设置可以通过配置文件完成.在大多数场景下默认的配置就能满足大多数用户的需求,在一些特殊场景下,用户还是需要自行修改这些配置文件,yum安装的ansible的配置文件一般在/etc/ansible目录下,pip安装或其他方式安装的ansible配置文件则可能需要自行创建。ansible的配置文件是 ansible.cfg

配置文件不同字段详解
[defaults]        //默认配置设置
[inventory]
[privilege_escalation]    //执行命令的用户权限设置
[paramiko_connection]   //Paramiko 是商业版linux 6 的默认SSH链接.但在其他平台上不是默认使用的.请在[paramiko]头文件下激活它.
[ssh_connection]           //用来调整SSH的通信连接
[persistent_connection]  //持久连接配置
[accelerate]       //
[selinux]
[colors]
[diff]

在这里详细讲解一下默认字段下的各参数配置,其他各配配置段的详细参数设置可以参考配置字段参数详解

[defaults]
# some basic default values...
#inventory      = /etc/ansible/hosts      //定义主机文件的默认存放位置
#library        = /usr/share/my_modules/   //定义ansible各模块存放的地方
#module_utils   = /usr/share/my_module_utils/
#remote_tmp     = ~/.ansible/tmp
#local_tmp      = ~/.ansible/tmp
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml
#forks          = 5
#poll_interval  = 15
#sudo_user      = root
#ask_sudo_pass = True
#ask_pass      = True
#transport      = smart
#remote_port    = 22
#module_lang    = C
#module_set_locale = False
#gather_subset = all
# gather_timeout = 10
#roles_path    = /etc/ansible/roles
#host_key_checking = False
#stdout_callback = skippy
#callback_whitelist = timer, mail
#task_includes_static = False
#handler_includes_static = False
#sudo_exe = sudo
#sudo_flags = -H -S -n
#timeout = 10  //SSH timeout
#remote_user = root  // default user to use for playbooks if user is not specified
#log_path = /var/log/ansible.log
#module_name = command
#executable = /bin/sh  //use this shell for commands executed under sudo
#hash_behaviour = replace  //if inventory variables overlap, does the higher precedence one win
#private_role_vars = yes
#private_key_file = /path/to/file
...
Inventory 参数的说明
ansible_ssh_host
      将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.

ansible_ssh_port
      ssh端口号.如果不是默认的端口号,通过此变量设置.

ansible_ssh_user
      默认的 ssh 用户名

ansible_ssh_pass
      ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)

ansible_sudo_pass
      sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)

ansible_sudo_exe (new in version 1.8)
      sudo 命令路径(适用于1.8及以上版本)

ansible_connection
      与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.

ansible_ssh_private_key_file
      ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.

ansible_shell_type
      目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为 'csh' 或 'fish'.

ansible_python_interpreter
      目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如  \*BSD, 或者 /usr/bin/python
      不是 2.X 版本的 Python.我们不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).
一个主机文件的例子:
some_host         ansible_ssh_port=2222     ansible_ssh_user=manager
aws_host          ansible_ssh_private_key_file=/home/example/.ssh/aws.pem
freebsd_host      ansible_python_interpreter=/usr/local/bin/python
ruby_module_host  ansible_ruby_interpreter=/usr/bin/ruby.1.9.3

ansible两种使用方式

Ansible提供两种方式去完成任务,一是 ad-hoc 命令,一是写 Ansible playbook.前者可以解决一些简单的任务, 后者解决较复杂的任务.

1、 直接命令式即ad-hoc

命令格式:

ansible <pattern_goes_here> -m <module_name> -a <arguments>
  • pattern_goes_here //匹配的主机
  • module_name //使用的模块
  • arguments //执行的动作
介绍几个ansible模块

模块(也被称为 “task plugins” 或 “library plugins”)是在 Ansible 中实际在执行的.它们就 是在每个 playbook 任务中被执行的.你也可以仅仅通过 ‘ansible’ 命令来运行它们.

command
copy
stat
get_url
yum
corn
mount
service
sysctl
user
git
2、角色脚本式即编写Ansible playbook

Playbooks 是 Ansible的配置,部署,编排语言.他们可以被描述为一个需要希望远程主机执行命令的方案,或者一组IT程序运行的命令集合.在基础层面, playbooks 可以被用来管理用于部署到远程主机的配置文件.在更高的层面上,playbooks 可以依次对多层式架构上的服务器执行上线包括滚动更新在内的操作并可以将操作委托给其他主机包括在此过程中发生的与监视服务器,负载均衡服务器的交互操作在内.
我们使用 adhoc 时,主要是使用 /usr/bin/ansible 程序执行任务.而使用 playbooks 时,更多是将之放入源码控制之中,用之推送你的配置或是用于确认你的远程系统的配置是否符合配置规范.

Playbook 语言的示例
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running
    service: name=httpd state=started
  handlers:            #Handlers: 在发生改变时执行的操作
    - name: restart apache
      service: name=httpd state=restarted

每一个 play 包含了一个 task 列表(任务列表).一个 task 在其所对应的所有主机上(通过 host pattern 匹配的所有主机)执行完毕之后,下一个 task 才会执行.有一点需要明白的是(很重要),在一个 play 之中,所有 hosts 会获取相同的任务指令,这是 play 的一个目的所在,也就是将一组选出的 hosts 映射到 task.
每个 task 的目标在于执行一个 moudle, 通常是带有特定的参数来执行.在参数中可以使用变量(variables).

执行一个 playbook
ansible-playbook playbook.yml -f 10  #这里的示例是并行的运行 playbook,并行的级别 是10
roles

Roles 基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以及 handlers。基于 roles 对内容进行分组,使得我们可以容易地与其他用户分享 roles 。
个项目的结构如下:

site.yml
webservers.yml
fooservers.yml
hosts
roles/
   common/
     files/
     templates/
     tasks/
     handlers/
     vars/
     defaults/
     meta/
   webservers/
     files/
     templates/
     tasks/
     handlers/
     vars/
     defaults/
     meta/

一个 playbook 即site.yml如下:

- hosts: webservers
  roles:
     - common
     - webservers
补充
1、标签

如果你有一个大型的 playbook,那能够只运行其中特定部分的配置而无需运行整个 playbook 将会很有用.

tasks:

    - yum: name={{ item }} state=installed
      with_items:
         - httpd
         - memcached
      tags:
         - packages

    - template: src=templates/src.j2 dest=/etc/foo.conf
      tags:
         - configuration

如果你只想运行一个非常大的 playbook 中的 “configuration” 和 “packages”,你可以这样做:

ansible-playbook example.yml --tags "configuration,packages"

另一方面,如果你只想执行 playbook 中某个特定任务 之外 的所有任务,你可以这样做:

ansible-playbook example.yml --skip-tags "notification"

你同样也可以对 roles 应用 tags:

roles:
  - { role: webserver, port: 5000, tags: [ 'web', 'foo' ] }

你同样也可以对基本的 include 语句使用 tag:

- include: foo.yml tags=web,foo
2、 Vault

Ansible 1.5的新版本中, “Vault” 作为 ansible 的一项新功能可将例如passwords,keys等敏感数据文件进行加密,而非存放在明文的 playbooks 或 roles 中. 这些 vault 文件可以分散存放也可以集中存放.
vault 可以加密任何 Ansible 使用的结构化数据文件. 甚至可以包括 “group_vars/” 或 “host_vars/” inventory 变量, “include_vars” 或 “vars_files” 加载的变量, 通过 ansible-playbook 命令行使用 “-e @file.yml” 或 “-e @file.json” 命令传输的变量文件. Role 变量和所有默认的变量都可以被 vault 加密.