Linux之Ansible

Ansible简介

Ansible是2013年推出的一款IT自动化和DevOps软件,目前由Redhat已签署Ansible收购协议。其是基于Python研发,糅合了人多老运维工具的优点实现了批量操作系统配置,批量程序的部署,批量运行命令等功能。

Ansible的特性:

  • 模块化设计
    • 调用特定的模块来完成特定任务
  • 基于pythone语言实现
    • 由paramiko,PyYAML(半结构化语言)和jinja2三个关键模块实现
  • 部署简单
    • 是agent less类型
  • 主从模式工作
  • 支持自定义模块
  • 支持playbook
  • 易于使用
  • 支持多层部署
  • 支持异构IT环境

Ansible的组件

img
img
  • ansible core
    • 核心模块
  • host inventory
    • 主机库,能够管控的主机列表,没有放进这个列表的,都不能进行管控
  • connection plugins
    • 连接插件,一般默认基于ssh协议连接
  • modules
    • core modules(自带模块)
    • custom modules(自定义模块)
  • plugins
    • 为ansible扩展功能
  • playbook
    • 剧本,按照所设定编排的顺序执行完成安排的任务

ansible的配置文件

  • 主配置文件
    • /etc/ansible/ansible.cfg
  • host inventory定义管控主机
    • /etc/ansible/hosts (遵循INI风格,中括号中的字符是组名,一个主机 可以属于多个组)
    [webservers]
    node1.zhenping.me
    node2.zhenping.me
    172.16.36.70
    172.16.36.71
    

ansible安装

  • yum install ansible

ansible命令

  • 使用格式
    • ansible <host-pattern> [-f forks] [-m module_name] [-a args]
      • -a :指定模块的参数
      • -f # :一次要管理几个主机,默认为5个
      • -m MOUDULE : 指定模块
      • <host-pattern> : 事先需要定义的hosts文件中的主机列表
      • -i PATH : 指明使用的host inventory文件路径

ansible-doc命令

获取模块列表,及模块使用格式

  • 使用格式
    • ansible-doc [-l] [-m MODULE]
      • -l : 列出支持的核心模块
      • -s MODULE : 查看模块的用法

ansible常用模块

一、command模块

  • 功能
    • 能在远程节点运行一个命令,但不能运行有管理的命令,command模块的参数非为kv格式,而是直接给出要执行的命令
  • 使用示例
    • ansible all -a 'ntpdate 172.16.0.1' (其是默认模块,可省略模块名称)
[root@Centos7 ~]# ansible all -a 'ntpdate 172.16.0.1'
172.16.36.61 | success | rc=0 >>
29 Feb 19:36:07 ntpdate[2360]: step time server 172.16.0.1 offset 135.642843 sec

172.16.36.60 | success | rc=0 >>
29 Feb 19:36:07 ntpdate[2402]: step time server 172.16.0.1 offset 135.687205 sec

172.16.36.71 | success | rc=0 >>
29 Feb 19:36:13 ntpdate[2345]: step time server 172.16.0.1 offset -28665.158303 sec

172.16.36.70 | success | rc=0 >>
29 Feb 19:36:13 ntpdate[32087]: step time server 172.16.0.1 offset -28664.450998 sec

二、user模块

  • 功能

管理用户

  • 使用格式
    • ansible all -m user -a "name= state={present | absent} force= system= uid= shell= home= "
      • name= : 创建的用户名
      • state= : present新增,absent删除
      • force= : 删除用户的时候删除家目录
      • system= : 创建系统用户
      • uid= : 指定UID
      • shell= : 指定shell
      • home= : 指定用户家目录
  • 使用示例
    • ansible webserver -m user -a "name=zhenping state=present system=true"
    • ansible webserver -m user -a "name=zhenping state=absent"

三、group模块

  • 功能

组管理

  • 使用格式
    • -a "name= state={present|absent} gid= system="
  • 使用示例
    • ansible webserver -m group -a "name=user1 state=present system=true"

四、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"

五、ping模块

  • 功能

测试网络连通性, ping模块没有参数

  • 使用格式
    • ansible all -m ping
  • 使用示例
[root@Centos7 ~]# ansible all -m ping
172.16.36.61 | success >> {
    "changed": false,
    "ping": "pong"
}

172.16.36.60 | success >> {
    "changed": false,
    "ping": "pong"
}

172.16.36.70 | success >> {
    "changed": false,
    "ping": "pong"
}

172.16.36.71 | success >> {

六、file模块

功能

文件创建和删除

使用格式
  • -a "path= mode= owner= group= state={directory|link|hard|touch|file|absent} src= "
    • path= : 目标
    • src= : 原文件
    • state= : 文件类型
使用示例
  • ansible webserver -m file -a "path=/root/fstab src=/etc/fstab state=link"
  • ~]# ansible webserver -m file -a "path=/root/testfile state=directory"

七、copy模块

功能

文件复制,把管理端的文件复制到远程主机各一份

使用格式
  • -a "src= dest= mode= owner= "
使用示例
  • ansible webserver -m copy -a "src=/root/testfile.txt dest=/root/testfile.ansible"

八、yum模块

功能

实现程序包安装及管理

使用格式
  • -a "name= conf_file= state={present|latest|absent} enablerepo= disablerepo= "
    • state=latest : 安装最新版本
    • conf_file= : 使用指定repo的配置文件
使用示例
  • ansible webserver -m yum -a 'name=nginx state=absent'

九、service模块

功能

实现服务管理

使用格式
  • -a "name= state={started|stoped|restarted} enabled= runlevel= "
使用示例
  • ansible webserver -m service -a "name=nginx state=started enabled=true

十、shell模块

功能

运行shell命令,其是启动一个子shell进程来运行命令,它可以支持管道传送

使用格式
  • -a 'command'
使用示例
  • ansible webserver -m shell -a "echo "zhenping.me" | passwd --stdin user1"

十一、script模块

功能

指定本地的脚本文件,到远程主机运行一次

使用格式
  • -a "/path/to/script"
使用示例

*ansible webserver -m script -a '/root/test.sh'

十二、setup模块

功能

收集远程指定主机的facts信息,其将收集的信息保存在各变量中,变量引用方法为:直接引用名称

使用示例
  • ansible 172.16.36.71 -m setup
[root@Centos7 ~]# ansible 172.16.36.71 -m setup
172.16.36.71 | success >> {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "172.16.36.71"
        ],
        "ansible_all_ipv6_addresses": [
            "fe80::20c:29ff:fed1:dcb5"
        ],
        "ansible_architecture": "x86_64",
        "ansible_bios_date": "05/20/2014",
        "ansible_bios_version": "6.00",
        "ansible_cmdline": {
            "BOOT_IMAGE": "/vmlinuz-3.10.0-229.el7.x86_64",
            "LANG": "zh_CN.UTF-8",
            "crashkernel": "auto",
            "quiet": true,
            "rhgb": true,
            "ro": true,
            "root": "UUID=cdd3548e-caf3-46cb-b81c-03f443325edc"
        },
        "ansible_date_time": {
            "date": "2016-02-29",
            "day": "29",
            "epoch": "1456751201",
            "hour": "21",
            "iso8601": "2016-02-29T13:06:41Z",
            "iso8601_micro": "2016-02-29T13:06:41.194636Z",
            "minute": "06",
            "month": "02",
            "second": "41",
            "time": "21:06:41",
            "tz": "CST",
            "tz_offset": "+0800",
            "weekday": "Monday",
            "year": "2016"
        },
        "ansible_default_ipv4": {
            "address": "172.16.36.71",
            "alias": "eno16777736",
            "gateway": "172.16.0.1",
            "interface": "eno16777736",
            "macaddress": "00:0c:29:d1:dc:b5",
            "mtu": 1500,
            "netmask": "255.255.0.0",
            "network": "172.16.0.0",
            "type": "ether"
        },
        
        .........

playbooks剧本

简介

playbooks是ansible更为强大的配置管理组件,实现基于文本文件编排执行的多个任务,且多次重复执行。其是使用YAML(Yet Another Markup Language),类似于半结构化语言,声明式配置,可读性较高。易于与脚本语言交互

核心组件

  • Tasks :任务
  • Variables : 变量
    • inventory参数:(用于hosts定义的主机后面,多个使用空格分隔)

      • ansible_ssh_port : 指定ssh端口
      • ansible_ssh_user : 指定ssh用户
      • ansible_ssh_pass : 指定ssh用户登录认证密码,明文密码
      • ansible_sudo_pass : 指明sudo时候的密码
      [webserver]
      172.16.36.70 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=zhenping.me
      
  • template : 模板
  • Handles : 处理器
  • Roles : 角色,用于调度不同的playbooks

YAML语法格格式

  • 任何数据结构都用缩进进来标识,可以嵌套

  • 每一行是一个键值数据key:value,使用冒号分隔,若想在一行标识需要使用{}和,将多个kv分隔开

  • 列表使用-标识

  • 示例:

- hosts: webserver
  remote_user: root
  tasks:
    -  name: install nginx
       yum: name=nginx state=present
    -  name: start nginx
       service: name=nginx state=started enabled=true
    -  name: install php-fpm
       yum: name=php-fpm state=present
    -  name: start php-fpm
       service: name=php-fpm state=started enabled=true
   vars
   handlers
-  hosts: dbserver
   remote_user: root
   tasks:
     -  name: install mysql
        yum: name=mysql state=present

playbook的变量

变量命名方式

字母、数字和下划线组成,仅能以字母开头

变量的各类
  • facts

    • 由远程主机发回的主机特有的属性信息,这些信息被保存在ansible变量中,无须声明,可直接调用
  • 自定义变量

    • 通过命令行传递
      • ~]# ansible-playbook test.yml -extra-vars "hosts=www user=zhenping"
    • 通过roles传递
  • 主机变量

    • 定义在inventory中的主机之后的变量,直接传递给单个主机的变量
    [webserver]
    172.16.36.70 username=zhenping pass=zhenping
    172.16.36.71
    
  • 主机组变量

    • 定义在inventory中的组上的变量
    [webserver]
    172.16.36.70
    172.16.36.60
    [webserver:vars]
    var1=value
    var2=value
    
playbook调用变量的示例
-  hosts: webserver
   remote_user: root
   vars:
     user: user2
     pass: 123321
   tasks:
       - name: add user
         user: name={{ user }} state=present
       - name: set password
         shell: /bin/echo {{ pass }} | passwd --stdin {{ user }}
手动运行playbook脚本时,传递变量(手动传递时,优先级要高于脚本中的变量)
  • ansible-playbook script.yml --extra-vars "username=ubunt"
  • ansible-playbook script.yml -e VARS

playbook的条件测试

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

####当主机的操作系统为redhat系列操作系统时,才执行yum安装
- hosts : webserver
  remote_user : root
  tasks :
     - name: yum install keepalived
       yum: name=keepalived state=present
       when: ansible_os_family == "ReaHat"
     - name: say hello
       shell: /bin/echo "hello world"

playbook的迭代

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

- hosts: webserver
  remote_user: root
  tasks:
    - name: user add
      user: name={{ item }} state=present
      with_items:
         - testuser1
         - testuser2
         - testuser3
         - testuser4
- hosts: webserver
  remote_user: root
  tasks:
  - name: user add
    user: name={{ item.name }} state=present group={{ item.groups }}
    with_items:
    - { name: 'tom2', groups: 'tom' }
    - { name: 'tom2', groups: 'tom2' }

playbook--handlers: 处理器、触发器

只有在其关注的条件满足时,才会被触发执行的任务

示例:只有原配置文件被修改了,才会重新加载服务
- hosts: webserver
  remote_user: root
  tasks:
  - name: yum install nginx
    yum: name=nginx state=present
  - name: start nginx
    service: name=nginx state=started enabled=true
  - name: copy configuration file
    copy: src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf
    notify: restart nginx
  handlers:
  - name: restart nginx
    service: name=nginx state=reloaded

Roles: 角色

roles用于实现“代码复用”,让playboo中的各元素组织起来,roles以特定的层次型格式组织起来的playbook元素(vars,tasks,template,handlers),可被playbook以roles的名字直接调用

roles目录结构
  • webserver/ : 主机组文件夹
    • files/ : 存放文件,此角色中用到的所有文件均放置于此目录中
    • templates/ : jinja2模板文件存放位置
    • tasks/ : 任务列表文件,可以有多个,但至少有一个叫做main.yml的文件,其它文件要被main.yml包含
    • handlers/ : 处理器列表文件,可以有多个,至少有一个叫做main.yml的文件,其它文件要被main.yml包含
    • vars/ : 变量字典文件,可以有多个, 但至少有一个叫做main.yml的文件,其它文件要被main.yml包含
    • meta/ : 元数据,用于定义此角色的特殊设定及依赖关系等
示例:

~]# cd /etc/ansible/soles   
~]# mkdir -pv webserver/{files,vars,tasks,handlers,meta,templates}
~]# cd webserver/
~]# vim vars/main.yml
user: daemon
group: daemon
~]# vim tasks/main.yml
- name: remove nginx
  yum: name=nginx state=absent
- name: install apache
  yum: name=httpd state=present
- name: start & enable httpd
  service: name=httpd state=started enabled=true
- name: install configuration file
  template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
  notify: restart httpd servic
~]# vim handlers/main.yml
- name: restart httpd service
  service: name=httpd state=restarted
~]# cp /etc/httpd/conf/httpd.conf /root/webserver/template/httpd.conf.j2  #准备示例文档
~]# vim templates/http.conf.j2
....
User {{ user }}
Group {{ group }} 
....
~]# cd ../.. #与roles同级的目录
~]# vim webserver.yml
- hosts: webserver
  remote_user: root
  roles:
  - webserver
  
~]# ansible-playbook webserver.yml
PLAY [webserver] **************************************************************

GATHERING FACTS ***************************************************************
ok: [172.16.36.70]
ok: [172.16.36.71]

TASK: [webserver | remove nginx] **********************************************
ok: [172.16.36.70]
ok: [172.16.36.71]

TASK: [webserver | install apache] ********************************************
ok: [172.16.36.70]
ok: [172.16.36.71]

TASK: [webserver | start & enable httpd] **************************************
ok: [172.16.36.71]
ok: [172.16.36.70]

TASK: [webserver | install configuration file] ********************************
ok: [172.16.36.70]
ok: [172.16.36.71]

PLAY RECAP ********************************************************************
172.16.36.70               : ok=5    changed=0    unreachable=0    failed=0
172.16.36.71               : ok=5    changed=0    unreachable=0    failed=0


#####可以为roles传递变量
~]# vim dbserver.yml
- hosts: 172.16.36.60
  remote_user: root
  roles:
  - { role: webserver, user=nobody }
  - { role: dbserver, user=mysql }  #可以调用多个role
  
 
######使用tags参数,只调用某个tasks(以下示例只触发了install config的任务)
~]# vim roles/webserver/tasks/main.yml
- name: remove nginx
  yum: name=nginx state=absent
- name: install apache
  yum: name=httpd state=present
- name: start & enable httpd
  service: name=httpd state=started enabled=true
- name: install configuration file
  template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
  notify: restart httpd service
  tags: conf

[root@Centos7 ~]# ansible-playbook -t conf webserver.yml

PLAY [webserver] **************************************************************

GATHERING FACTS ***************************************************************
ok: [172.16.36.71]
ok: [172.16.36.70]

TASK: [webserver | install configuration file] ********************************
ok: [172.16.36.70]
ok: [172.16.36.71]

PLAY RECAP ********************************************************************
172.16.36.70               : ok=2    changed=0    unreachable=0    failed=0
172.16.36.71               : ok=2    changed=0    unreachable=0    failed=0

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

推荐阅读更多精彩内容

  • 一.ansible (1) ansible: ansible是一款新出现的自动化运维系统,基于python开发并集...
    楠人帮阅读 1,920评论 0 8
  • 作为背锅侠运维工作的基本流程 运维工具的分类 : ansible的模块化: ansible密钥登陆 ansible...
    二郎5阅读 4,139评论 0 10
  • 1、What's the Asible? Ansible是新出现的自动化运维工具,基于Python开发,集合了众多...
    Bruce_King阅读 499评论 0 1
  • 本文主要内容均收集于网络上的博文资料,仅以此文作为学习总结。BTW,目前Ansible对python3的支持还不是...
    qiuyi943阅读 18,201评论 1 15
  • ###### Ansible总结 ##### 运维工作: 系统安装(物理机、虚拟机)-->程序包安装、配置、服务启...
    二郎5阅读 2,007评论 0 4