ansible

1、What's the Asible?

Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

1.1、Ansible's structure

  • Inventory
  • Modules
  • Ad Hoc Commands
  • Playbooks
    • Tasks
    • Variables
    • Templates
    • Handlers
    • Roles
ansible_第1张图片
ansible.png

Host Inventory : 主机库,用于存放管控的主机列表。
Core Modules : 核心模块
Custom Modules : 自定义模块
Ad Hoc Commands :
Playbooks : 剧本,按照设定的顺序执行完成任务。
  Tasks : 任务
  Variables : 变量
  Templates : 模板
  Handlers : 处理器
  Roles : 角色,用于调度不同的playbooks.

2、How to use Ansible?

安装环境 : CentOS7

所需软件包 : Ansible(epel源)

2.1、Ansible's configuration files

  • 主配置文件

    • /etc/ansible/ansible.cfg
  • Host Inventory

    [webserver]
    192.168.0.14
    192.168.0.15
    [dbserver]
    192.168.0.14
    

2.2、ansible命令

ansible [-m module_name] [-a args] [options]

  • : 事先定义在hosts文件中的主机列表
    -m module_name : 指定模块的名称
    -a args : 指定模块的参数
    [options] : 命令的其它参数

使用实例

    ansible webserver -m shell -a "ss -tnl"    #查看webserver主机列表中的主机的TCP端口是否处于监听状态
    ansible webserver -m yum -a "name=httpd state=present"    #安装httpd服务

2.3、ansible-doc命令

ansible-doc [-l] [-s] [module...]

  • -l : 列出可用的模块
  • -s Module : 查看指定模块的用法

2.4、ansible常用模块

2.4.1 command模块

  • 功能
    • 在远程主机上运行一个命令,直接给出要执行的命令,但不能运行管理
      类命令。
  • 使用示例
    • ansible all -a "ls /home" (默认模块,可以省略模块名称)

      [root@localhost ~]# ansible all -a "ls /home"
      192.168.0.15 | SUCCESS | rc=0 >>
      Packages
      test
      test1
      test2
      test3
      testfile
      
      192.168.0.14 | SUCCESS | rc=0 >>
      Packages
      test
      test1
      test2
      test3
      testfile
      

2.4.2 shell模块

  • 功能

    • 启动一个shell进程来执行命令,支持管道传送。
  • 使用示例

    • ansible 192.168.0.14 -m shell -a "ss -tnl | grep 80"
[root@localhost ~]# ansible 192.168.0.14 -m shell -a "ss -tnl | grep 80"
192.168.0.14 | SUCCESS | rc=0 >>
LISTEN     0      128          *:80                       *:*                  
LISTEN     0      128         :::80                      :::*   

2.4.3、copy模块

  • 功能
    • 复制文件,把管理端的文件复制到远程主机上
  • 使用格式
    • src : 管理端文件路径
    • dest : 目标主机文件存放路径
    • mode : 文件的权限
    • owner : 文件的属主
  • 使用示例
    • ansible 192.168.0.14 -m copy -a "src=/etc/ansible/ansible.file/httpd.conf dest=/etc/httpd/conf/httpd.conf"

2.4.4、cron模块

  • 功能

    • 定义cron任务
  • 使用格式

    • -a "name= state= minute= hour= day= month= weekday= job= state={present|absent"
  • 使用示例

    • ansible all -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &> /dev/null' name='sync time' state=present"

2.4.5、file模块

  • 功能
    • 文件的创建和删除
  • 使用格式
    • -a "path= mode= owner= group= state={directory|link|hard|touch|file|absent} src= "
  • 使用示例
    • ansible 192.168.0.14 -m file -a "path=/home/test1 state=directory"
    • ansible webserver -m file -a "src=/etc/fstab path=/home/fstab state=link"

2.4.6、yum模块

  • 功能
    • 程序包的管理
  • 使用格式
    • -a "name= conf_file= state={present|latest|absent} enablerepo= disablerepo= "
  • 使用示例
    • ansible webserver -m yum -a "name=httpd state=absent"

2.4.7、service模块

  • 功能
    • 管理服务
  • 使用格式
    • -a "name= state={started|stoped|restarted} enabled= runlevel= "
  • 使用示例
    • ansible webserver -m service -a "name=httpd state=started"

2.4.8、user模块

  • 功能
    • 管理用户
  • 使用格式
    • ansible all -m user -a "name= state={present | absent} force= system= uid= shell= home= "
  • 使用示例
    • ansible webserver -m user -a "name=jrc system=true shell=/sbin/nologin uid=333"

2.4.9、group模块

  • 功能
    • 管理组
  • 使用格式
    • -a "name= state={present|absent} gid= system="
  • 使用示例
    • ansible webserver -m group -a "name=jrcgroup state=present system=true"

2.4.10、ping模块

  • 功能
    • 测试与被管理主机的连通性
  • 使用示例
    • ansible all -m ping

      [root@localhost ~]# ansible all -m ping
      192.168.0.14 | SUCCESS => {
      "changed": false, 
      "ping": "pong"
      }
      192.168.0.15 | SUCCESS => {
      "changed": false, 
      "ping": "pong"
      }
      

2.4.11、script模块

  • 功能
    • 指定本地的脚本文件,到远程主机上执行一次
  • 使用示例
    • ansible webserver -m script -a "/root/useradd.sh"

2.4.12、setup模块

  • 功能
    • 收集指定远程主机上的facts信息,将其收集的信息保存在各变量当中。
  • 使用示例
    • ansible webserver -m setup

3、Playbooks剧本

  Playbooks是ansible更为强大的配置管理组件,实现基于文本文件编排执行的多个任务,而且可以多次执行。Playbooks使用YAML,类似于半结构化语言,声明式配置,可读性很高,易于与脚本语言交互。

3.1核心组件

  • Tasks : 任务
  • Variables : 变量
    • facts : 可直接调用
    • 自定义变量 : 通过命令行传递
      • -e VARS, --extra-vars=VARS
    • 主机变量 : 定义在Inventory中的主机之后的变量,直接传递给当个主机变量
      • IP/HOSTNAME varaiable=value var2=value2
    • 主机组变量 : 定义在主机组上的变量
      • [groupname:vars]
        variable=value
  • Templates : 模板
    • 包含了模板的文本文件
  • Handlers : 处理器
    • 在特定条件下触发
      • 任务可通过"tags"打标签,而后可在ansible-playbook命令上使用-t指定进行调用
    • 接收到其它任务的通知时触发
      • 某任务的状态在运行为change时,可通过"notify
  • Roles : 角色

Playbooks的基本示例

- hosts: webserver
  remote_user: root
  tasks:
  - name: install nginx
    yum: name=nginx state=present
  - name: start nginx
    service: name=nginx state=started
  - name: change nginx
    template: src=/etc/ansible/ansible.file/nginx.conf.j dest=/etc/nginx/nginx.conf
    tags: change_conf
    notify: restart nginx
 handlers:
 - name: restart nginx
   service: name=nginx state=restarted

3.2、Playbook的条件测试

 在某个tasks后面添加when子句,即可实现条件测试功能,when语句支持jinja2语法。

示例

- hosts: webserver
  remote_user: root
  tasks:
  - name: install_httpd
    yum: name=httpd state=present
    when: ansible_os_family == "CentOS7"
  - name: start_nginx
    service: name=nginx state=started

3.2、Playbook的迭代

 在task中调用内置的item变量,在某task后面使用with_items语句来定义元素列表。

示例

- hosts: webserver
  remote_user: root
  tasks:
  - name: install some packages
    yum: name={{ item }} state=present
    with_items:
    - nginx
    - memcached
    - php-fpm


- hosts: webserver
  remote_user: root
  tasks:
  - name: add some groups
    user: name={{ item.name }} group={{ item.group }} state=present
    with_items:
     - { name: 'user11',group: 'group11' }
     - { name: 'user12',group: 'group12' }
     - { name: 'user13',group: 'group13' }

3.3、Roles 角色

  roles实现了"代码复用",让playbook中的各元素组织起来,roles是以特定的层级结构组织起来的playbook元素。

注意 : 在/etc/ansible目录下,有roles的目录,在此目录下为每个不同的服务提供不同的目录,每一个服务相当于一个角色,这样就能实现管理的标准化和便捷化。

  • webserver/

    • file/ : 用于存放文件,此角色用到的文件都应该放在此目录下。
    • templates/ : jinja2模板文件存放位置。
    • task/ : 存放任务列表文件,至少有一个main.yml的文件。
    • handlers/ : 存放处理器列表文件,至少有一个叫做main.yml的文件。
    • vars/ : 变量字典文件,至少有一个叫做main.yml的文件。
    • meta/ : 元数据,用于定义角色的特殊设定及依赖关系。
  • dbserver/
    ....

  • nginxserver/
    ....

示例 :

[root@localhost nginx]# vi tasks/main.yml

- name: install_nginx
  yum: name=nginx state=present
- name: start_nginx
  service: name=nginx state=started
- name: change_conf
  template: src=nginx.conf dest=/etc/nginx/nginx.conf
  notify: restart_nginx

[root@localhost nginx]# vi handlers/main.yml

- name: restart_nginx
  service: name=nginx state=restarted

[root@localhost nginx]# vi vars/main.yml
user: daemon
group: daemon

将nginx.conf文件复制到templates目录下,作为模板,并将其中的 user nginx
改为 user {{ user }}  {{ group }} ,作为一个变量使用。


在roles同级目录下创建 nginx.yml,调用角色nginx

 - hosts: webserver
   remote_user: root
   roles:
   - nginx

你可能感兴趣的:(ansible)