Ansible 手册

简介

本文档从实战的角度展示ansible,不对ansible进行大而全的讲解,够用就好。

安装

  # pwd
  /etc/yum.repos.d

  # cat aliBase.repo
  [aliBase]
  name=aliBase
  baseurl=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/
  enabled=1
  gpgcheck=1
  gpgkey=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/RPM-GPG-KEY-CentOS-$releasever

  # cat aliEpel.repo
  [aliEpel]
  name=aliEpel
  baseurl=https://mirrors.aliyun.com/epel/$releasever\Server/$basearch/
  enabled=1
  gpgcheck=0
  下载ansible软件,然后制作私有yum源,安装
  yum install --downloadonly --downloaddir=./ ansible


配置文件

ansible安装完成后,默认使用的配置文件:/etc/ansible/hosts

  [web]
  10.1.1.60 ansible_port=22 ansible_user=root ansible_ssh_pass=123123
  [db]
  10.1.1.61 ansible_port=22 ansible_user=root ansible_ssh_pass=123123
  [web]
  10.1.1.[59:60] ansible_port=22 ansible_user=root    ansible_ssh_pass=123123
  [GroupA]
  10.1.1.44
  10.1.1.34
  [GroupB]
  10.1.1.55
  10.1.1.56
  [Total:children]
  GroupA
  GroupB

  备注:有三个组GroupA, GroupB, Total,其中”children”关键字表示当前组中存在子组。GroupA和GroupB就是Total的子组,操作Total就相当于操作GroupA和GroupB。
  [GroupA]
  10.1.1.44
  [GroupB]
  10.1.1.44
  #YAML示例
  all:
    hosts:
      10.1.1.60:
      10.1.1.61:
  #上例相当于如下INI配置
  10.1.1.60
  10.1.1.61

  备注:all表示组,hosts是关键字,当我们需要在组中定义受管主机时,就需要使用到hosts关键字,当我们进行自定义分组时,也需要使用hosts关键字,每个分组指明自己组内的受管主机时,都要使用到hosts关键字
  #先看一个INI风格的配置,示例如下
  10.1.1.61
  [test1]
  10.1.1.60
  [test2]
  10.1.1.70
  #上述配置表示当前清单中有3台受管主机,主机61不属于任何组,主机60属于test1组,主机70属于test2组
  #使用YAML语法进行同等效果的配置如下
  #注意,为了使缩进显得更加明显,此处每次缩进使用两个空格
  all:
    hosts:
      10.1.1.61:
    children:
      test1:
        hosts:
          10.1.1.60:
      test2:
        hosts:
          10.1.1.70:
  #从上例可以看出,当直接在清单中创建组时,需要在all关键字内使用children关键字,而定义每个组时,有必须使用hosts关键字,指明组内的主机

样例

  10.1.1.60 ansible_port=22 ansible_user=root ansible_ssh_pass=123123
  ansible 10.1.1.60 -m ping

设置免密

 # ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.1.1.60
  10.1.1.60 ansible_port=22
  或者
  test60 ansible_host=10.1.1.60 ansible_port=22

常用命令

检查所有主机的存活性

# ansible all -m ping 
all: 表示对/etc/ansible/hosts中的所有主机执行操作

按照分组检查

  [web]
  10.1.1.60 ansible_port=22 ansible_user=root ansible_ssh_pass=123123
  [db]
  10.1.1.61 ansible_port=22 ansible_user=root ansible_ssh_pass=123123
  # ansible db -m ping

检查主机的存活性

> # ansible 'apache:!nginx' -m ping -o
* host.ini

# ansible -i ./hosts --connection=local local -m ping
* --connection=local的意思是不需要通过ssh连接,因为我们针对的就是本地,还可以是--connection=ssh意思是需要ssh连接
* -i ./hosts指定Inventory file,告诉我们连接到哪里
* remote,local,all指明使用哪个标签下面的服务器清单,all表示针对每个服务器运行
* -m ping表示使用ping模块,会返回ping结果

Ansible-playbook

常用参数

  --inventory=path,指定inventory文件,默认是在/etc/ansible/hosts下面。
  --verbose,显示详细的输出,使用-vvvv显示精确到每分钟的输出。
  --extra-vars=vars:定义在playbook使用的变量。
  --forks:指定并发的线程数,默认是5.
  --connection=type:指定远程连接主机的方式,默认是ssh,设置为local时,则只在本地执行playbook、
  --check:检测模式,playbook中定义的所有任务将在每台主机上检测,但是并不执行。

handlers

  [root@LOCALHOST ~]# cat yaml/httpd.yaml 
  ---
  - hosts: control-node
    remote_user: root
    vars:
      - pkg: httpd
    tasks:
      - name: "install httpd package."
        yum: name={{ pkg }}  state=installed
      - name: "copy httpd configure file to remote host."
        copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
        notify: restart httpd
      - name: "boot httpd service."
        service: name=httpd state=started
    handlers:
      - name: restart httpd
        service: name=httpd state=restarted

tags

  [root@LOCALHOST ~]# cat yaml/httpd.yaml 
  ---
  - hosts: control-node
    remote_user: root
    vars:
      - pkg: httpd
    tasks:
      - name: "install httpd package."
        yum: name={{ pkg }}  state=installed
      - name: "copy httpd configure file to remote host."
        copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
        notify: restart httpd
      - name: "start httpd service."
        tags:
          - start_httpd     # 给“start httpd service”这个任务打个标签
        service: name=httpd state=started
    handlers:
      - name: restart httpd
        service: name=httpd state=restarted

结语