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.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 <host-pattern> [-m module_name] [-a args] [options]

  • <host-pattern> : 事先定义在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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容

  • Ansible简介 Ansible是2013年推出的一款IT自动化和DevOps软件,目前由Redhat已签署An...
    魏镇坪阅读 2,335评论 1 6
  • 作为背锅侠运维工作的基本流程 运维工具的分类 : ansible的模块化: ansible密钥登陆 ansible...
    二郎5阅读 4,083评论 0 10
  • 一.ansible (1) ansible: ansible是一款新出现的自动化运维系统,基于python开发并集...
    楠人帮阅读 1,875评论 0 8
  • ansible介绍ansible常用模块使用playbooktemplates,模板条件测试和循环迭代roles,...
    哈喽别样阅读 1,370评论 0 3
  • NSPredicate就是一种正则表达式 http://blog.csdn.net/ztp800201/artic...
    百思不得解阅读 195评论 0 0