【美高梅手机版4858】ansible介绍与安装,Ansible环境搭建

By admin in 美高梅手机版4858 on 2019年4月8日

一、什么是ansible

ansible是python中一套模块,系统中的一套自动化工具,可以用来作系统管理、自动化命令等任务。

1.概述

官网提供了不相同环境的安装方式,能够根据自个儿的具体景况,选用不相同安装格局。鉴于ansible是经过python开放的,笔者就选则通过pip来安装。

1、Ansible简介

Ansible是运转自动化学工业具,能够在三个主机上完毕对多台主机的操作。

  • 特性:
    模块化:调用特定的模块,完结一定职务;
    基于Python语言达成,由Paramiko, PyYAML和Jinja2七个关键模块;
    安排不难:agentless;
    援助自定义模块;
    支持playbook;
    幂等性:Ansible的操作必须是幂等的,不然会报错,幂等也便是不怕3个操作重复执行数次也不会报错,比如touch二个文书,就算那几个文件存在了,执行touch这一个文件反复,也不会报错,只是改变文件的小时戳而已,但useradd即使用户存在了再去创立就会报错,就不幂等了
  • 安装:
    epel, yum install ansible
    配置文件:/etc/ansible/ansible.cfg
    长机清单:/etc/ansible/hosts
    主程序:
    ansible
    ansible-playbook 使用剧本文件时选用此命令
    ansible-doc 能够赢得协助音信的授命
    ansible的回顾利用格式:
    ansible HOST-PATTERN -m MOD_NAME -a MOD_ARGS -f FORKS -C -u
    USERNAME
    HOST-PATTEOdysseyN钦赐主机清单 -m内定模块类型 -a 钦命模块所带的参数
    -f钦赐二回能够并行执行的主机数,私下认可为四个,能够在布署文件中期维修改,
    -C为测试用,即干跑而不实行,-u内定连接到长途主机的用户

ansible 系统架构

  • ansible简介
    ansible是新面世的自动化运行工具,ansible是三个配备管理和平运动用陈设工具,基于Python开发,集合了重重运转工具(puppet、cfengine、chef、func、fabric.SaltStack
    )的长处,达成了批量种类布局、批量程序布置、批量运转命令等职能。ansible是依照模块工作的,自个儿没有批量配备的能力。真正拥有批量布置的是ansible所运维的模块,ansible只是提供1种框架,依据官方提供的信息,当前采纳ansible的用户有:
    美利坚合众国国家航空航天局(NASA /ˈnæsə/)
    evernote(印象笔记),rackspace(满世界三大云总结核心之1),atlassian,twitter(环球互连网上访问量最大的十二个网址之一)等
    ansible在生养条件当中的运用
  • 自动化安顿应用
  • 自动化管理配置
  • 自动化持续交付
  • 自动化(aws)云服务器管理
  • ansible的优点
  1. ansible糅合了好多知名运维工具的帮助和益处,基本上pubbet和saltstack能兑现的效能全部能落到实处
  2. 轻量级,无需在客户端安装agent,更新时,只需在操作机上举办壹遍立异即可;
  3. ansible是一个工具,ansible不需求运营服务,仅仅只是3个工具,能够轻松的落成分布式扩展
  4. 批量职务执行能够写成脚本,而且不要分发到长途就足以推行
  5. ansible是壹致性,高可相信性,安全性设计的轻量级自动化学工业具
  6. 采用python编写,维护更简明,ruby语法过于复杂;
  • 特性
    (一)、no agents:不必要在被管理控制主机上安装其余客户端;
    (2)、no server:无劳动器端,使用时一贯运维命令即可;
    (三)、modules in any
    languages:基于模块工作,可应用任意语言开发模块;
    (4)、yaml,not code:使用yaml语言定制剧本playbook;
    (5)、ssh by default:基于SSH工作;
    (陆)、strong multi-tier solution:可达成多重指挥。

【美高梅手机版4858】ansible介绍与安装,Ansible环境搭建。ansible的骨干架构
一.老是插件(connectior plugins) 用于连接主机 用来三番五次被管理端
2.主旨模块(core modules) 连接主机达成操作,
它借助于现实的模块来做具体的政工
三.自定义模块(custom modules) 依据自身的急需编写制定具体的模块
四.插件(plugins) 完毕模块成效的填补
五.playbooks(剧本)
ansible的配备文件,将多个任务定义在本子中,由ansible自动执行
6.host inventory(主机清单)定义ansible必要操作主机的限制
最要害的壹些是 ansible是模块化的 它具备的操作都凭借于模块
架构图

美高梅手机版4858 1

image

譬如说作者急需创建三个文本 那么自身就须要调用file模块
作者索要copy文件,那么自身就须求copy模块
自家急需测试机器的存活率,那么就必要ping模块
ansible all -m ping

美高梅手机版4858 2

image.png

二、ansible优势

1、ansible是Python中一套完整的自动化执行任务模块
2、ansible的play_book模式,采用yaml配置,对于自动化任务执行一目了然
3、自动化场景支持丰富

2.设置正视

反省环境重视,借使没有则必要设置,不然在安装ansible时会报错

yum -y install gcc python-devel openssl-devel

2、Ansible的常用模块举例

尝试环境:准备四台主机,分别为node1、node2、node3、node4,node一主机为ansible主机,在node一上可以达成对别的三台主机的操作

实验准备
在node1主机上的操作
[root@node1 ~]#ssh-keygen    ---生成公钥私钥对,并将公钥传给其他主机
[root@node1 .ssh]#for i in {2..4};do ssh-copy-id root@node$i:;done
[root@node1 .ssh]#vim /etc/ansible/hosts   ---修改配置文件,设置主机清单,也就是对哪些主机进行操作
[websrvs]
172.18.21.100
172.18.21.200
[dbsrvs]
172.18.21.100
172.18.21.7
[root@node1 .ssh]#ansible all --list-hosts
  hosts (3):
    172.18.21.100
    172.18.21.7
    172.18.21.200
[root@node1 .ssh]#ansible websrvs --list-hosts
  hosts (2):
    172.18.21.100
    172.18.21.200
[root@node1 .ssh]#ansible dbsrvs --list-hosts
  hosts (2):
    172.18.21.100
    172.18.21.7
1、ping模块:探测远程主机网络是否畅通;
[root@node1 .ssh]#ansible all -m ping
172.18.21.7 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
172.18.21.200 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
172.18.21.100 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
2、command模块:在远程主机运行命令
[root@node1 .ssh]#ansible-doc -s command   ---可以查看这个模块的帮助信息
[root@node1 .ssh]#ansible 172.18.21.100 -m command -a "pwd chdir=/tmp"     ---在172.18.21.10主机切换到/tmp目录执行pwd命令
[root@node1 .ssh]#ansible 172.18.21.100 -m command -a "mkdir mydir chdir=/app"    ---在远程主机创建目录
[root@node1 .ssh]#ansible 172.18.21.100 -m command -a "mkdir mydir chdir=/app creates=mydir"   ---creates表示此文件或者目录如果存在就不执行
172.18.21.100 | SUCCESS | rc=0 >>
skipped, since mydir exists
[root@node1 .ssh]#ansible 172.18.21.100 -m command -a "touch f1 chdir=/app removes=f1"  ---removes表示文件或者目录不存在就不执行,也就是存在才执行
172.18.21.100 | SUCCESS | rc=0 >>
skipped, since f1 does not exist
3、shell模块:在远程主机的shell进程下运行命令,支持shell特性,如管道等
[root@node1 .ssh]#ansible-doc -s shell
[root@node1 .ssh]#ansible websrvs -m command -a "useradd user1"   ---在远程的两个主机上创建一个用户
[root@node1 .ssh]#ansible websrvs -m shell -a "echo magedu|passwd --stdin user1"  ---创建一个密码
[root@node1 .ssh]#ansible websrvs  -m shell -a "echo magedu|passwd --stdin user1 executable=/bin/tcsh"   ---也可以指定其他的shell类型,只要这个shell类型可以解析里面的命令即可
4、group模块:管理组账号
[root@node1 .ssh]#ansible websrvs -m group -a "name=haproxy system=no state=present"   state为状态,指明是创建还是删除,创建用present,删除用absent
[root@node1 .ssh]#ansible websrvs -m group -a "name=haproxy system=no state=absent"   ---删除组
[root@node1 .ssh]#ansible websrvs -C -m group -a "name=haproxy system=no state=present"   ---先干跑一遍看有没有错误
5、user模块:管理用户账号
[root@node1 .ssh]#ansible websrvs -m user -a "name=tom groups=haproxy state=present uid=3000 shell=/usr/bin/sh"
[root@node1 .ssh]#ansible websrvs -m user -a "name=tom groups=haproxy state=present uid=3000 shell=/usr/bin/sh  generate_ssh_key=true"   ---创建用户并生产公钥私钥对
6、copy模块: 复制文件或者目录到远程
[root@node1 app]#vim /app/test.txt
hello magedu
welcome
[root@node1 app]#ansible all -m copy -a "src=/app/test.txt dest=/app/ owner=daemon group=nobody mode=664"
[root@node1 app]#ansible all -m copy -a "content='hello true\n how are you\n' dest=/app/test2.txt"   ---也可以复制一个内容到一个文件中
7、fetch模块:从远程主机取文件
[root@node1 app]#ansible 172.18.21.7 -m fetch -a "src=/etc/fstab dest=/app/fstab"    ---注意这里只能到一台主机上去取
8、file模块:设置文件的属性、创建空文件和目录软连接等
[root@node1 app]#ansible all -m file -a "path=/app/hidir state=directory owner=nobody mode=700"  ---在远程主机创建一个空目录,并指定权限
[root@node1 app]#ansible all -m file -a "path=/app/ff state=touch owner=nobody mode=770"   ---创建空文件并指定权限,注意这里能用touch
[root@node1 app]#ansible all -m file -a "path=/app/ff state=file owner=daemon mode=770"    ---file只能用于已经存在文件修改权限,如果文件不存在不会创建
[root@node1 app]#ansible all -m file -a "path=/app/fff src=/app/ff state=link"   ---创建一个软连接文件/app/fff指向源文件/app/ff
注意:state属性的可用值:file,directory,link,hard,touch,absent
[root@node1 app]#ansible all -m file -a "path=/app/fff state=absent"   ---删除文件
9、get_url模块: Downloads files from HTTP, HTTPS, or FTP to node
[root@node1 app]#ansible all -m get_url -a "url=http://mirrors.sohu.com/centos/7/os/x86_64/RPM-GPG-KEY-CentOS-7 dest=/app"    ----下载网上的文件到多台主机
常用的参数: *url, *dest,sha256sum,owner, group, mode,*表示必须给定的
10、cron 模块:Manage cron.d and crontab entries.
[root@node1 app]#ansible all -m cron -a "name=timecron job='/usr/sbin/ntpdate 172.18.0.1 &>/dev/null' minute=*/5 disabled=true state=present"   disabled=true表示创建的时候加注释
[root@node2 network-scripts]#crontab  -l   
#Ansible: timecron
#*/5 * * * * /usr/sbin/ntpdate 172.18.0.1 &>/dev/null   ---前面带注释,没有生效
[root@node1 app]#ansible all -m cron -a "name=timecron job='/usr/sbin/ntpdate 172.18.0.1 &>/dev/null' minute=*/5 disabled=false state=present"   ---创建的时候不带注释,如果不加disabled,默认是不加注释的
[root@node2 network-scripts]#crontab  -l
#Ansible: timecron
*/5 * * * * /usr/sbin/ntpdate 172.18.0.1 &>/dev/null 
[root@node1 app]#ansible all -m cron -a "name=timecron job='/usr/sbin/ntpdate 172.18.0.1 &>/dev/null' minute=*/5 state=absent"  ---删除
11、yum模块:在远程主机安装软件包
[root@node1 app]#ansible websrvs -m yum -a "name=nginx state=latest"  ---latest指安装最新版本
12、pip模块:在远程主机安装python库
常用参数name,state,version
13、npm模块:在远程主机安装node.js库
常用参数name,state,version
14、service模块:管理服务
[root@node1 app]#ansible websrvs -m service -a "name=nginx enabled=true state=started"   ---在远程的两个主机上启动nginx服务
15、git模块:Deploy software (or files) from git checkouts
在websrvs每个节点上yum install git
访问此https://github.com/
搜索fastdfs

点击如下复制链接

美高梅手机版4858 3

image.png

[root@node1 app]#ansible websrvs -m git -a "repo=https://github.com/happyfish100/fastdfs.git dest=/app/fastdfs"  ---可以在github上下载软件或者文件到远程多台主机
16、haproxy模块:Enable, disable, and set weights for HAProxy backend servers using socket commands.
常用参数: backend、 host、 state、 weight
可以标记多台后端主机的状态,实现灰度发布
17、setup模块:可以收集远程主机的系统信息,包括cup核心数、可用物理内存等等
[root@node1 app]#ansible 172.18.21.100 -m setup   ---收集远程
主机的系统信息,这些信息是由特定格式的键和值组成的,键可
以做为ansible的系统内建变量,可以调用这些变量使用,以后想
使用哪些变量,可以用这种方式查找变量,相当于查字典的方
式,如果要调用变量里面嵌套的变量可以使用外面的变量名[嵌套
的变量]的方式实现
18、 template模块:基于模板方式生成一个文件复制到远程主机
主要参数:*src,*dest,owner,group,mode
注意此模块只能在playbook中使用,而不能在命令行中使用,因
为只有ansible-playbook才能收集内建变量。

ansible安装

  • ansible只是一个进程不需求加上数据库也不供给运行和运营守护进度它只是三个经过你可以轻松利用它安装在别的一点主机上边(除了windows)ansible管理机不能够安装到windows下面
  • 本子的采取 因为二.0有充足大的修正 1般都会接纳2.0以上的本子
  • 控制机的要求 因为ansible是python写的
    所以必要在装置了python二.六要么贰.7上述的python版本才得以设置
  • 治本节点的需要 须求安装ssh python版本在二.5之上
  • 安装有3个方式
  1. yum -y install ansible wget -O /etc/yum.repos.d/epel.repo
    (下载yum源)
  2. pip install ansible
  3. 从github下载

$ git clone git://github.com/ansible/ansible.git --recursive
$ cd ./ansible
$ make rpm
$ sudo rpm -Uvh ./rpm-build/ansible-*.noarch.rpm

三、ansible安装

一、通过系统方法:yum,apt-get等

2、通过Python的方式

软件包下载地址: wget https://github.com/ansible/ansible/archive/v2.4.1.0-0.4.rc2.tar.gz
(本文采用)python3 ./setup.py install
easy_install ansible
pip3 install ansible

叁、安装成功

devops@devops-virtual-machine:~/devops/ansible-2.4.1.0-0.4.rc2$ which ansible
/usr/local/bin/ansible

devops@devops-virtual-machine:~$ ansible --version
ansible 2.4.1.0
  config file = None
  configured module search path = ['/home/devops/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.6/dist-packages/ansible-2.4.1.0-py3.6.egg/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.6.5 (default, Apr  1 2018, 05:46:30) [GCC 7.3.0]

点名陈设文件

devops@devops-virtual-machine:~/devops$ export ANSIBLE_CONFIG=/home/devops/devops/test.cfg
devops@devops-virtual-machine:~/devops$ ansible --version
ansible 2.4.1.0
  config file = /home/devops/devops/test.cfg
  configured module search path = ['/home/devops/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.6/dist-packages/ansible-2.4.1.0-py3.6.egg/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.6.5 (default, Apr  1 2018, 05:46:30) [GCC 7.3.0]

2.安装pip

反省下环境是还是不是已设置有pip,如若未有,可通过如下格局安装

sudo easy_install pip

3、Ansible的Playbook

Playbook:是YAML[jæməl]格式,格式module:
arguments,注意:shell和command模块前面一贯跟命令,而非key=value类的参数列表
Playbook的为主成分:
Hosts:主机
Tasks:任务列表
Variables:变量
Templates:包括了模版语法的文书文件;
Handlers:由特定条件触发的天职;
Roles:角色
示范一:在websrvs上设置并运营nginx,在dbsrvs上安装并运行redis

[root@node1 app]#vim nginx.yaml ---创建一个playbook
- hosts: websrvs
  remote_user: root
  tasks:
  - name: install nginx package
    yum: name=nginx state=latest
  - name: start nginx
    service: name=nginx state=started
- hosts: dbsrvs
  remote_user: root
  tasks:
  - name: install redis package
    yum: name=redis state=latest
  - name: install conf file
    copy: src=/app/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644
  - name: start redis
    service: name=redis enabled=true state=started
[root@node1 app]#ansible-playbook --syntax-check nginx.haml  ---检查语法
[root@node1 app]#ansible-playbook --list-hosts nginx.haml ---查看远程主机
[root@node1 app]#ansible-playbook --list-tasks nginx.haml   ---查看任务
[root@node1 app]#ansible-playbook -C nginx.yaml  ---发现干跑时执行第二个
任务启动服务时会报错,说没有找到服务,因为干跑的时候第一个任务并没有
真正的执行,没有安装服务,所以第二个任务会出错,说明干跑的时候如果只
有一个任务不会出错,任务多了干跑就会出错,所以没什么作用,直接下面的
操作就行了
PLAY [websrvs] *****************************************************************
TASK [setup] *******************************************************************
ok: [172.18.21.200]
ok: [172.18.21.100]
TASK [install nginx package] ***************************************************
changed: [172.18.21.200]
changed: [172.18.21.100]
TASK [start nginx] *************************************************************
fatal: [172.18.21.200]: FAILED! => {"changed": false, "failed": true, "msg": "Could not find the requested service nginx: cannot check nor set state"}
fatal: [172.18.21.100]: FAILED! => {"changed": false, "failed": true, "msg": "Could not find the requested service nginx: cannot check nor set state"}
    to retry, use: --limit @/app/nginx.retry
PLAY RECAP *********************************************************************
172.18.21.100              : ok=2    changed=1    unreachable=0    failed=1   
172.18.21.200              : ok=2    changed=1    unreachable=0    failed=1   
[root@node1 app]#ansible-playbook  nginx.yaml   ---执行操作

总结:一定要注意yaml格式,后面包车型大巴空格要对齐,不然总会出错,创设好playbook先进行语法,playbook文件一般是以.yaml或然.yml结尾,不以那五个结尾也得以辨别,只是一种习惯而已。
演示二:添加tags和handlers执行一定的任务

[root@node1 app]#vim nginx.yaml 
- hosts: websrvs  ---指明要操作的远程主机
  remote_user: root   ---指明以哪个用户登录到远程主机
  tasks:    ----任务列表
  - name: install nginx package  ---任务的名称
    yum: name=nginx state=latest   ---执行任务使用的模块和参数
  - name: start nginx
    service: name=nginx state=started
- hosts: dbsrvs
  remote_user: root
  tasks:
  - name: install redis package
    yum: name=redis state=latest
  - name: install conf file
    copy: src=/app/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644
    tags: chconfig   ---当配置文件改变了,要重新复制配置文件到远程主机,给这个任务增加一个标签
    notify: restart redis   ---条件式触发,只要配置文件改变了,就会通知给handlers
  - name: start redis
    service: name=redis enabled=true state=started
  handlers:  ---handlers也是一个任务,只不过这个任务是条件式触发的
  - name: restart redis   ---任务是只要配置文件改变了就进行重启操作
    service: name=redis state=restarted       
[root@node1 app]#ansible-playbook --list-tags nginx.yaml  ---查看添加的标签
[root@node1 app]#vim /app/redis.conf ---更改配置文件
requirepass "linux"    ---添加一个密码
[root@node1 app]#ansible-playbook -t chconfig  nginx.yaml    ---发现只执行复制配置文件到远程主机和重启操作
如果添加了多个标签想要一并执行,在-t后面指定标签的名称并用逗号隔开即可

总计:在有些职责后边添加tags能够兑现只举办一定的天职,此试验是更改redis的安插文件后,只进行重新复制配置文件到长途主机,使用handlers能够兑现条件式触发任务执行,本实验是若是配置文件改变了,重新复制配置文件到长途主机就触发handlers任务,重启服务
演示三:在playbook、命令行及主机清单文件中定义变量

[root@node1 app]#vim pkg.yaml 
- hosts: websrvs
  remote_user: root
  vars:     ---定义变量
  - pkgname: tree    ---变量的名为pkgname,值为tree
  tasks:
  - name: install package {{ pkgname }}  ---变量引用时要用两个大括号,并且大括号前后要有空格
    yum: name={{ pkgname }} state=latest
[root@node1 app]#ansible-playbook --syntax-check pkg.yaml  ---检查语法
[root@node1 app]#ansible-playbook -C pkg.yaml   ---测试干跑一下
[root@node1 app]#ansible-playbook -e "pkgname=memcached" -C pkg.yaml   --也可以用-e选项在命令行定义变量,在命令行定义的变量会优先于playbook中定义的变量

PLAY [websrvs] *****************************************************************

TASK [setup] *******************************************************************
ok: [172.18.21.200]
ok: [172.18.21.100]

TASK [install package memcached]    ---发现安装的是memcached而不是tree了
changed: [172.18.21.100]
changed: [172.18.21.200]

PLAY RECAP *********************************************************************
172.18.21.100              : ok=2    changed=1    unreachable=0    failed=0   
172.18.21.200              : ok=2    changed=1    unreachable=0    failed=0  
[root@node1 app]#vim /etc/ansible/hosts  ---在主机清单中定义变量
[websrvs]
172.18.21.100 pkgname=memcached  不同的主机设置不同的变量
172.18.21.200 pkgname=haproxy
[root@node1 app]#ansible-playbook -C pkg.yaml ---在这里要将剧本中的变量去掉,否则不会生效,说明剧本中的变量优先于主机清单中的变量
[root@node1 app]#vim /etc/ansible/hosts ---也可以这样定义在同一个组内的主机定义相同的变量
[websrvs]
172.18.21.100 
172.18.21.200 
[websrvs:vars]
pkgname=memcached
[root@node1 app]#ansible-playbook -C pkg.yaml ---测试

总计:定义变量有两种办法,分别是在playbook中、命令行和主机清单配置文件中定义,在指令行中定义的变量优先于在playbook中定义的变量,在playbook中定义的变量优先于在主机清单中定义的变量,调用变量要运用双大括号,并且大括号前后都要有空格,以上定义的变量都是自定义变量。
示例四:定义ansible远程连接目的主机时采用的参数
如上用ssh连接到远程主机进行操作时行使的是依照key的认证办法,实际上也得以使用如下情势连接,给定用户名和密码的办法ssh连接到远程主机
美高梅手机版4858 ,ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansbile_sudo_pass

[root@node1 app]#vim /etc/ansible/hosts 
[websrvs]
172.18.21.100 ansible_ssh_user=root ansible_ssh_pass=magedu  ---在主机清单中给定用户名和密码的方式ssh连接远程主机

计算:此种方法不可取,因为会暴露密码,一般都是遵照key的评释办法进行ssh连接,知道有这种格局就足以。
以身作则伍:使用模板文件

[root@node1 app]#ansible 172.18.21.100 -m setup |grep mem  ---查看ansible和内存有关的内建变量,不同的主机,因为系统信息不同,内建变量的值是不相同的
        "ansible_memfree_mb": 272, 
        "ansible_memory_mb": {
        "ansible_memtotal_mb": 976, 
[root@node1 app]#cp /app/redis.conf /app/redis.conf.j2  
[root@node1 app]#vim /app/redis.conf.j2
maxmemory {{ ansible_memtotal_mb / 2 }}mb    ---调用这个内建变量创建一个.j2格式的模板文件,注意模板文件的后缀必须为.j2
[root@node1 app]#vim redis_conf.yml   ---创建一个剧本
- hosts: dbsrvs
  remote_user: root
  tasks:
  - name: change config
    template: src=/app/redis.conf.j2 dest=/etc/redis.conf owner=redis group=root mode=644 
[root@node1 app]#ansible-playbook --syntax-check redis_conf.yml 
[root@node1 app]#ansible-playbook -C redis_conf.yml 
[root@node1 app]#ansible-playbook  redis_conf.yml 

PLAY [dbsrvs] ******************************************************************

TASK [setup]  ---可以看到在执行时,playbook会利用setup模块收集远程主机的系统信息*******************************************************************
ok: [172.18.21.7]
ok: [172.18.21.100]

TASK [change config] ***********************************************************
changed: [172.18.21.7]
changed: [172.18.21.100]

PLAY RECAP *********************************************************************
172.18.21.100              : ok=2    changed=1    unreachable=0    failed=0   
172.18.21.7                : ok=2    changed=1    unreachable=0    failed=0   
在远程主机上打开redis的配置文件
[root@node2 ~]#less /etc/redis.conf
maxmemory 488.0mb    ---是运算后的结果了
备注:常用的内建变量
[root@node1 ~]#ansible 172.18.21.200 -m setup |grep vcpu
        "ansible_processor_vcpus": 4,   ---cpu核心数
[root@node1 ~]#ansible 172.18.21.200 -m setup |grep fqdn
        "ansible_fqdn": "node4.magedu.com",   ---主机名
[root@node1 ~]#ansible 172.18.21.200 -m setup |grep memtotal
        "ansible_memtotal_mb": 1823,   ---系统的总内存
[root@node1 ~]#ansible 172.18.21.200 -m setup |grep version
        "ansible_bios_version": "6.00", 
        "ansible_distribution_major_version": "7",   ---系统版本
        "ansible_distribution_version": "7.4", 
[root@node1 ~]#ansible 172.18.21.7 -m setup|grep -A 2 "default_ipv4"
        "ansible_default_ipv4": {
            "address": "172.18.21.7",    ---使用的ip地址
            "alias": "ens38", 
模板文件里都可以调用这些变量,来进行不同的配置,通常在模板中调用内建变量

小结:template模块会基于上边的沙盘文件进行处理后再生成2个文本复制到远程主机,假诺不是根据template模块实行处理后转变的文书发放远程主机,而是平昔将模板文件用copy模块复制给长途主机,远程主机是甄别不了的,利用模板的主意得以兑现基于分裂主机的系统新闻举行不一样的布局。比如各种主机的ansible_memtotal_mb是差异的,调用这几个变量并开始展览演算就能够使分裂主机有例外的配置。

任务执行形式

ansible系统由决定主机对被管节点的操作方法有二种ad_hoc和playbook

  • ad_hoc单命令形式 能够对多台主机执行单个命令

ansible all -a "/bin/echo hello"
  • playbook通过八个tasks的汇集完结一类效能如web的装置配备,数据库服务器的批量备份等

---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: name=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 (and enable it at boot)
    service: name=httpd state=started enabled=yes
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

设置完ansible后,发现ansible一共为我们提供了七个指令:ansible、ansible-doc、ansible-galaxy、ansible-lint、ansible-playbook、ansible-pull、ansible-vault
。那里我们只查看usage部分,详细部分能够经过 “指令 -h” 的主意赢得。
1、ansible
[root@localhost ~]# ansible -h Usage: ansible <host-pattern> [options]

ansible是指令核心部分,其重点用以实践ad-hoc命令,即单条命令。默许前面需求跟主机和甄选部分,默许不点名模块时,使用的是command模块。如:
[root@localhost ~]# ansible 127.0.0.1 -a ‘date‘ 127.0.0.1 | SUCCESS | rc=0 >>Sun May 28 11:00:40 CST 2017

暗中认可使用的模块是足以在ansible.cfg
中举行修改的。ansible命令下的参数部分解释如下

参数:
 -a ‘Arguments‘, --args=‘Arguments‘ 命令行参数
 -m NAME, --module-name=NAME 执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数 
-i PATH, --inventory=PATH 指定库存主机文件的路径,默认为/etc/ansible/hosts. 
-u Username, --user=Username 执行用户,使用这个远程用户名而不是当前用户 
-U --sud-user=SUDO_User sudo到哪个用户,默认为 root -k --ask-pass 登录密码,提示输入SSH密码而不是假设基于密钥的验证 
-K --ask-sudo-pass 提示密码使用sudo -s --sudo sudo运行 
-S --su 用 su 命令 -l --list 显示所支持的所有模块 
-s --snippet 指定模块显示剧本片段 
-f --forks=NUM 并行任务数。NUM被指定为一个整数,默认是5。 #ansible testhosts -a "/sbin/reboot" -f 10 重启testhosts组的所有机器,每次重启10台
 --private-key=PRIVATE_KEY_FILE 私钥路径,使用这个文件来验证连接
-v --verbose 详细信息 all 针对hosts 定义的所有主机执行 
-M MODULE_PATH, --module-path=MODULE_PATH 要执行的模块的路径,默认为/usr/share/ansible/ 
--list-hosts 只打印有哪些主机会执行这个 playbook 文件,不是实际执行该 playbook 文件 
-o --one-line 压缩输出,摘要输出.尝试一切都在一行上输出。 
-t Directory, --tree=Directory 将内容保存在该输出目录,结果保存在一个文件中在每台主机上。 
-B 后台运行超时时间 -P 调查后台程序时间 -T Seconds, --timeout=Seconds 时间,单位秒s 
-P NUM, --poll=NUM 调查背景工作每隔数秒。需要- b 
-c Connection, --connection=Connection 连接类型使用。可能的选项是paramiko(SSH),SSH和地方。当地主要是用于crontab或启动。 
--tags=TAGS 只执行指定标签的任务 例子:ansible-playbook test.yml --tags=copy 只执行标签为copy的那个任务 
--list-hosts 只打印有哪些主机会执行这个 playbook 文件,不是实际执行该 playbook 文件
--list-tasks 列出所有将被执行的任务 
-C, --check 只是测试一下会改变什么内容,不会真正去执行;相反,试图预测一些可能发生的变化 
--syntax-check 执行语法检查的剧本,但不执行它 
-l SUBSET, --limit=SUBSET 进一步限制所选主机/组模式 --limit=192.168.0.15 只对这个ip执行 
--skip-tags=SKIP_TAGS 只运行戏剧和任务不匹配这些值的标签 --skip-tags=copy_start 
-e EXTRA_VARS, --extra-vars=EXTRA_VARS 额外的变量设置为键=值或YAML / JSON 
#cat update.yml 
--- 
- hosts: {{ hosts }} 
  remote_user: {{ user }} 
  .............. 
  #ansible-playbook update.yml --extra-vars "hosts=vipers user=admin" 传递{{hosts}}、{{user}}变量,hosts可以是 ip或组名 
-l,--limit 对指定的 主机/组 执行任务 --limit=192.168.0.10,192.168.0.11 或 -l 192.168.0.10,192.168.0.11 只对这个2个ip执行任务

2、ansible-doc

[root@localhost ~]# ansible-doc -hUsage: ansible-doc [options] [module...]Options: -a, --all Show documentation for all modules -h, --help show this help message and exit -l, --list List available modules -M MODULE_PATH, --module-path=MODULE_PATH specify path(s) to module library (default=None) -s, --snippet Show playbook snippet for specified module(s) -v, --verbose verbose mode (-vvv for more, -vvvv to enable connection debugging) --version show program‘s version number and exit

该指令用于查看模块新闻,常用参数有多少个-l 和 -s ,具体如下
//列出全数已设置的模块# ansible-doc
-l//查看具体某模块的用法,那里如查看command模块# ansible-doc -s command

3、ansible-galaxy
ansible-galaxy 指令用于方便的从
站点下载第叁方扩张模块,我们能够形象的知晓其类似于centos下的yum、python下的pip或easy_install
。如下示例:

[root@localhost ~]# ansible-galaxy install aeriscloud.docker- downloading role ‘docker‘, owned by aeriscloud- downloading role from https://github.com/AerisCloud/ansible-docker/archive/v1.0.0.tar.gz- extracting aeriscloud.docker to /etc/ansible/roles/aeriscloud.docker- aeriscloud.docker was installed successfully

以此装置了二个aeriscloud.docker组件,前边aeriscloud是galaxy上开创该模块的用户名,后边对应的是其模块。在实质上选拔中也能够内定txt或yml
文件举行八个零件的下载安装。这一部分可以参考官方文书档案。
4、ansible-lint
ansible-lint是对playbook的语法实行检查的3个工具。用法是ansible-lint
playbook.yml 。
5、ansible-playbook
该指令是使用最多的命令,其通过读取playbook
文件后,执行相应的动作,那一个前边会做为三个珍视来讲。
6、ansible-pull
该指令使用必要说起ansible的另一种形式---pull
方式,那和我们平日平时用的push格局刚好相反,其适用于以下情形:你有数据巨大的机械必要配置,即使使用越来越高的线程仍然要耗费很多岁月;你要在3个向来不网络连接的机器上运转Anisble,比如在开发银行之后安装。那部分也会独自做壹节来讲。
7、ansible-vault
ansible-vault首要利用于配置文件中富含敏感音讯,又不期待他能被人见到,vault可以帮你加密/解密那几个布局文件,属高级用法。首要对于playbooks里比如涉及到布署密码或其余变量时,能够因而该指令加密,那样大家通过cat看到的会是一个密码串类的文书,编辑的时候要求输入事先设定的密码才能打开。这种playbook文件在实行时,须要丰盛–ask-vault-pass参数,同样须求输入密码后才能健康实施。具体该片段能够参查合法博客。

四、配置文件常用项表明

1)inventory 该参数表示资源清单inventory文件的位置,资源清单就是一些Ansible需要连接管理的主机列表 inventory = /root/ansible/hosts 
2)library Ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码称为模块,这个library参数就是指向存放Ansible模块的目录 library = /usr/share/ansible 
3)forks 设置默认情况下Ansible最多能有多少个进程同时工作,默认设置最多5个进程并行处理。具体需要设置多少个,可以根据控制主机的性能和被管理节点的数量来确定。 forks = 5 
4)sudo_user 这是设置默认执行命令的用户,也可以在playbook中重新设置这个参数 sudo_user = root //注意:新版本已经作了修改,如ansible2.4.1下已经为: default_sudo_user = root 
5)remote_port 这是指定连接被关节点的管理端口,默认是22,除非设置了特殊的SSH端口,不然这个参数一般是不需要修改的 remote_port = 22

官方文书档案:

 

3.安装ansible

sudo pip install ansible

四、条件测试

示例1:

when语句:在task中使用,jinja2的语法格式
tasks: 
- name: install conf file to centos7
  template: src=files/nginx.conf.c7.j2
  when: ansible_distribution_major_version == "7"
- name: install conf file to centos6
  template: src=files/nginx.conf.c6.j2
  when: ansible_distribution_major_version == "6"
表示不同的操作系统复制的配置文件是不一样的               

示范二:完毕在分化的主机上复制分裂的文件

[root@node1 app]#vim diff.txt
host1
[root@node1 app]#vim diff2.txt
host2
[root@node1 app]#vim copy_file.yaml
- hosts: websrvs
  tasks:
  - name: copy file1
    copy: src=/app/diff.txt dest=/app/
    when: ansible_default_ipv4['address'] == '172.18.21.100'
  - name: copy file2
    copy: src=/app/diff2.txt dest=/app/
    when: ansible_default_ipv4['address'] == '172.18.21.200'
[root@node1 app]#ansible-playbook --syntax-check copy_file.yaml 
[root@node1 app]#ansible-playbook  copy_file.yaml 
测试:
在两个主机分别查看,发现复制的文件不同

ansible配置文件 ansible.cfg

查阅配置文件设置

* inventory–这个参数表示资源清单inventory文件配置,资源清单就是一些ansible需要链接管理的主机列表。安装完ansible之后默认所在的inventory列表配置如下:  

inventory = /etc/ansible/hosts    

* library–Ansible的操作动作,无论是本地或远程,都使用一小段代码来执行。这小段代码成为模块,这个library参数就是只想存放在Ansible模块的目录。Ansible支持多个目录方式,只要用冒号(:)隔开就可以,同时也会检查当前执行playbook位置下的./library位置。默认的配置如下:

library = /usr/share/ansible  

* forks–设置默认情况下Ansible最多能有多少个进程同时工作,默认设置最多5个进程并行处理。具体需要设置多少个,可以根据控制主机的性能和被管理节点的数量来确定。默认参数配置如下: forks=20 你没有优化的优化的情况下执行比较慢

forks = 5

* sudo_user–这个设置默认执行命令的用户,在playbook中重新设置这个参数。默认参数配置如下:

sudo_user = root  

* remote_port–这个是指定链接被管节点的管理端口,默认22。除非设置了特殊的SSH端口,不然这个参数一般是不需要修改的。默认配置如下:

remote_port = 22

* host_key_checking–这个设置是否检查SSH主机的秘钥。可以设置为True或者False。默认配置如下:

host_key_checking = false  

* timeout–这是设置SSH链接的超时间隔,单位是秒。默认配置实例如下:

timeout = 60

* log_path–Ansible系统默认是不记录日志的,如果想把Ansible系统的输出记录到日志文件中,需要设置log\_path来指定一个存储Ansible日志的文件。配置实例如下:

log_path = /var/log/ansible.log  
poll_interval 异步执行任务的时候多久检查一次任务装填
poll_interval = 15

选择远程的工具   默认情况下就是smart(智能)模式  自动选择连接方式
只有当你需要优化执行速度的时候才需要修改这个选项
transport = smart 

module_set_locale  设置本地的环境变量  
inventory      = /etc/ansible/hosts     这个是默认库文件位置,脚本,或者存放可通信主机的目录  
#library        = /usr/share/my_modules/   Ansible默认搜寻模块的位置  
remote_tmp     = $HOME/.ansible/tmp   Ansible 通过远程传输模块到远程主机,然后远程执行,执行后在清理现场.在有些场景下,你也许想使用默认路径希望像更换补丁一样使用  
pattern        = *    如果没有提供“hosts”节点,这是playbook要通信的默认主机组.默认值是对所有主机通信  
forks          = 5    在与主机通信时的默认并行进程数 ,默认是5d  
poll_interval  = 15    当具体的poll interval 没有定义时,多少时间回查一下这些任务的状态, 默认值是5秒  
sudo_user      = root   sudo使用的默认用户 ,默认是root  
#ask_sudo_pass = True   用来控制Ansible playbook 在执行sudo之前是否询问sudo密码.默认为no  
#ask_pass      = True    控制Ansible playbook 是否会自动默认弹出密码  
transport      = smart   通信机制.默认 值为’smart’。如果本地系统支持   ControlPersist技术的话,将会使用(基于OpenSSH)‘ssh’,如果不支持讲使用‘paramiko’.其他传输选项包括‘local’, ‘chroot’,’jail’等等  
#remote_port    = 22    远程SSH端口。 默认是22  
module_lang    = C   模块和系统之间通信的计算机语言,默认是C语言  
gathering = implicit   控制默认facts收集(远程系统变量). 默认值为’implicit’, 每一次play,facts都会被收集
#roles_path    = /etc/ansible/roles   roles 路径指的是’roles/’下的额外目录,用于playbook搜索Ansible roles
#host_key_checking = False    检查主机密钥
sudo_exe = sudo     如果在其他远程主机上使用另一种方式执sudu操作.可以使用该参数进行更换
#what flags to pass to sudo   传递sudo之外的参数
#sudo_flags = -H

#SSH timeout    SSH超时时间
timeout = 10
#remote_user = root   使用/usr/bin/ansible-playbook链接的默认用户名,如果不指定,会使用当前登录的用户名
#log_path = /var/log/ansible.log     日志文件存放路径
#module_name = command     ansible命令执行默认的模块
#executable = /bin/sh     在sudo环境下产生一个shell交互接口. 用户只在/bin/bash的或者sudo限制的一些场景中需要修改
#jinja2_extensions = jinja2.ext.do,jinja2.ext.i18n      允许开启Jinja2拓展模块
#private_key_file = /root/.ssh/id_rsa        私钥文件存储位置
ansible_managed = Ansible managed: {file} modified on %Y-%m-%d %H:%M:%S by {uid} on {host}   这个设置可以告知用户,Ansible修改了一个文件,并且手动写入的内容可能已经被覆盖.
#display_skipped_hosts = True     显示任何跳过任务的状态 ,默认是显示
#error_on_undefined_vars = False      如果所引用的变量名称错误的话, 将会导致ansible在执行步骤上失败
#system_warnings = True    允许禁用系统运行ansible相关的潜在问题警告
#deprecation_warnings = True     允许在ansible-playbook输出结果中禁用“不建议使用”警告
#command_warnings = False    当shell和命令行模块被默认模块简化的时,Ansible 将默认发出警告
#nocows = 1    默认ansible可以调用一些cowsay的特性   开启/禁用:0/1
#nocolor = 1  输出带上颜色区别, 开启/关闭:0/1

4.配置ansible

ansible的部分的安装能够经过配备文件完结。在抢先四五%气象下私下认可的铺排就能满意大部分用户的急需,在局地非正规现象下,用户依旧供给活动修改这一个安排文件。倘若设置进程中绝非ansible.cfg文件,能够团结成立。
系统读取配置文件的相继:

* ANSIBLE_CONFIG (an environment variable)
* ansible.cfg (in the current directory)
* .ansible.cfg (in the home directory)
* /etc/ansible/ansible.cfg

本子1.5在此之前的读取顺序如下:

* ansible.cfg (in the current directory)
* ANSIBLE_CONFIG (an environment variable)
* .ansible.cfg (in the home directory)
* /etc/ansible/ansible.cfg

开创布局文件

mkdir -p /etc/ansible
vi /etc/ansible/ansible.cfg

摩登安顿文件:https://raw.githubusercontent.com/ansible/ansible/devel/examples/ansible.cfg
听别人说必要,能够调动参数。

参考地址:
ansible安装http://docs.ansible.com/ansible/latest/intro\_installation.html
ansible配置http://docs.ansible.com/ansible/latest/intro\_configuration.html

5、循环

迭代,要求再行执行的职务
对迭代项的引用,固定变量名称为”item”,而后要在task中接纳with_items给定要迭代的因素列表
示例

- name: install some packages
  yum: name={{ item }} state=present
  with_items:
  - nginx
  - memcached
  - php-fpm   
- name: add some groups
  group: name={{ item }} state=present
  with_items:
  - group11
  - group12
  - group13
- name: add some users
  user: name={{ item.name }} group={{ item.group }}  state=present    ---定义item的两个子健
  with_items:
  - { name: 'user11', group: 'group11' }    ---指明每个子健的值
  - { name: 'user12', group: 'group12' }
  - { name: 'user13', group: 'group13' }

演示二:在websrvs主机上安装tomcat组件

[root@node1 app]#vim tomcat.yml
- hosts: websrvs
  remote_user: root
  vars:
  - jdk_version: 1.8.0    ---注意变量名里面不能使用-,否则会报错,下划线可以使用
  tasks:
  - name: install tomcat package
    yum: name={{ item }} state=latest
    with_items:
    - nginx
    - tomcat
    - java-{{ jdk_version }}-openjdk
    - tomcat-webapps
    - tomcat-admin-webapps
[root@node1 app]#ansible-playbook  tomcat.yml 

以身作则3:安装不相同版本

[root@node1 app]#vim tomcat2.yml 
- hosts: 172.18.21.200
  remote_user: root
  tasks:
  - name: install tomcat package
    yum: name={{ item.name }}-{{ item.version }} state=latest ---定义item的子健为name和version
    with_items:
    - { name: 'nginx',version: '1.12.2' }    ---给定子健的值
    - { name: 'tomcat',version: '7.0.76' }
可以实现在远程主机上安装指定版本的包

示例四:达成将tomcat的八个不等的安插文件拷贝到远程主机

[root@node1 app]#vim tomcat.yml 
- hosts: websrvs
  remote_user: root
  vars:
  - jdk_version: 1.8.0
  tasks:
  - name: install tomcat package
    yum: name={{ item }} state=latest
    with_items:
    - nginx
    - tomcat
    - java-{{ jdk_version }}-openjdk
    - tomcat-webapps
    - tomcat-admin-webapps
  - name: install conf file
    copy: src={{ item.f1 }} dest={{ item.f2 }}
    with_items:
    - { f1: '/app/server.xml',f2: '/etc/tomcat/server.xml' }
    - { f1: '/app/tomcat-users.xml',f2: '/etc/tomcat/tomcat-users.xml' }

叁. 配备Linux主机SSH无密码访问

三.壹 生成秘钥

#ssh-keygen -t rsa

三.二 将秘钥拷贝到预管理的节点上

#ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.116.130

6、Ansible的角色(roles)

[root@node1 app]#mkdir -pv /app/nginx/{tasks,handlers,vars,files,templates}   ---创建 一个角色,角色名叫nginx
[root@node1 nginx]#mv /app/nginx/ /etc/ansible/roles/   ---把角色
目录移动到此目录下,因为ansible的配置文件中规定了角色的默
认目录在此目录下,也可以不移动,而把配置文件中roles_path修
改为相应的目录即可
[root@node1 roles]#cd /etc/ansible/roles/nginx/
[root@node1 nginx]#ls
files  handlers  tasks  templates  vars
[root@node1 nginx]#vim /etc/ansible/roles/nginx/files/nginx.conf  ---存放的是nginx的根目录下的主站点的文件
[root@node1 nginx]#vim /etc/ansible/roles/nginx/handlers/main.yml    ---注意只能是mai.yml,是固定格式,此文件中定义了条件式触发的任务
- name: reload nginx
  service: name=nginx state=reloaded
[root@node1 nginx]#vim /etc/ansible/roles/nginx/tasks/main.yml  ---创建任务文件main.yml  
- name: install nginx package
  yum: name=nginx state=latest
- name: install conf template
  template: src=nginx.j2 dest=/etc/nginx/conf.d/web.conf
  notify: reload nginx
  tags: change conf
- name: install conf file
  copy: src=nginx.conf dest=/etc/nginx/nginx.conf
  notify: reload nginx
  tags: change conf
- name: create docroot
  file: path={{ ngx_doc_root }} state=directory
- name: start nginx
  service: name=nginx enabled=true state=started
[root@node1 nginx]#vim /etc/ansible/roles/nginx/templates/nginx.j2   ---创建模板文件,此文件必须被template模块处理后生成一个文件再传给远程主机
server {
        listen {{ ngx_server_port }};
        server_name {{ngx_server_name }};
        root {{ ngx_doc_root }};
}
[root@node1 nginx]#vim /etc/ansible/roles/nginx/vars/main.yml --创建变量文件main.yml,注意变量文件中前面不需要用"-"引导
ngx_server_port: 80  ---注意冒号后面要有空格
ngx_server_name: wwww.magedu.com
ngx_doc_root: /app/website
[root@node1 nginx]#vim nginx.yml   ---最后在playbook中调用这个角色就可以了
- hosts: websrvs
  remote_user: root
  roles:
  - nginx
[root@node1 nginx]#ansible-playbook -C  nginx.yml 
[root@node1 nginx]#ansible-playbook nginx.yml 
备注:在playbook中调用角色的方法
在playbook调用角色方法1:
- hosts: websrvs
  remote_user: root
  roles:
  - mysql
  - memcached
  - nginx
在playbook调用角色方法2:传递变量给角色
- hosts: 
  remote_user:
  roles:
  - { role: nginx,ngx_server_port: 8080 }   ---在此处定义的变量,比在/vars/main.yml文件定义的变量的优先级高
还可以基于条件测试实现角色调用;
roles:
- { role: nginx, when: "ansible_distribution_major_version == '7' " }

只顾:在ansible中负有的冒号前边都要有空格,”-“前边也要有空格。

4. ansible执行

肆.一测试主机连通性

修改主机和布置

#vim /etc/ansible/hosts

[xxx]

10.0.0.1

10.0.0.2

ansible all -m ping -k -k指令是增加密码验证

4.2批量执行命令

ansible all -m shell -a '/bin/echo hello ansible'

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有