9159.com官网链接,Ansible于2015年10月被开源巨头R

作者: 编程  发布:2019-09-21

官网链接:

使用命令生成秘钥(机器互信)

[root@ansible ~]# ssh-keygen 

将公钥发送到所有安装 客户端的主机

[root@ansible ~]# ssh-copy-id 192.168.163.170

[root@ansible ~]# ssh-copy-id 192.168.163.171

一、Ansible简介
Ansible是一个开源的配置管理引擎,使用Python编写,是一个无代理的解决方案,通过默认的OpenSSH连接到一个受控节点。由Cobbler的作者和Func框架的合作者Michael DeHaan开发。Ansible于2015年10月被开源巨头RedHat收购,希望未来Ansible能结合RedHat系统发挥巨大作用。

Ansible是新出现的自动化运维工具,基于Python研发。糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。仅需在管理工作站上安装ansible程序配置被管控主机的IP信息,被管控的主机无客户端。ansible应用程序存在于epel(第三方社区)源,依赖于很多python组件。主要包括:

ansible python module location = ~/python3.x/site-packages/ansible-2.7.8.post0-py3.x.egg/ansible/modules/

安装 Ansible 软件

[root@ansible ~]# yum install -y ansible

修改配置文件,将客户机添加进组,

(在文末添加即可)

[root@ansible ~]# vim /etc/ansible/hosts 

[webserver]

192.168.163.170

192.168.163.171

9159.com 1
二、安装Ansible
1.环境
角色 主机名 IP 组名 系统
Master test.elisun.com 192.168.1.209 ———— CentOS 6.5
Node1 test1.elisun.com 192.168.1.210 webservers CentOS 6.5
Node2 test2.elisun.com 192.168.1.211 dbservers CentOS 6.5

(1)、连接插件connection plugins:负责和被监控端实现通信;

File模块

  在目录主机创建文件或目录,并赋予其系统权限

  - name: create file

   file: 'path=/tmp/test.txt state=touch mode=0755 owner=user01 group=user01'

ansible(主)命令体验:

1.ping

ansible all -m ping 

!检测机器是否可登录,ping模块不需要传送参数

!注:这里的ping模块并非调用了系统的ping命令,而是类似于登录到远程机器再echo出一个信息。

2.command

!可以执行任意命令,但不接受管道命令和重定向符号,如果想使用这些,则需要使用Shell模块。

ansible all -m command -a "ls" #在所有匹配主机上执行ls命令

playbook:

- name: test for command

command: ls

3.copy

#复制一个文件到远程服务器

ansible all -m copy -a "src=/tmp/text.txt dest=/home/tmp/"

#将本地text.txt文件复制到所有匹配主机的/home/tmp/路径下。

playbook:

- name: test for copy

copy: src=/tmp/text.txt dest=/home/tmp/ force=yes

4.file

这个模块这次构建系统中并没有用到,官方的解释是用来设置文件、文件夹或快链的属性,或者删除文件、快链、文件夹。

创建一个文件夹,如果目标不存在

ansible webservers -m file -a "path=/tmp/tdir state=directory mode=0755"

playbook

- name: create a directory if it doesn't exist

- file:

path: /etc/some_directory

state: directory

mode: 0755

5.get_url

!从服务器上下载一个文件到远程主机指定的目录

ansible webservers -m get_url -a "url=' dest=/tmp/ba.html"

playbook

- name: download foo.conf

get_url:

url:

dest: /etc/foo.conf

mode: 0440

6.yum

特别适用于批量安装一些依赖包的时候

ansible webservers -m yum -a "name=httpd state=latest"

ansible webservers -m yum -a "name=httpd state=absent" !删除包

playbook

- name: install the latest version of Apache

yum:

name: httpd

state: latest 

7.service

控制远程服务器上的服务

ansible webservers -m service -a "name=nginx state=restart"

playbook

- name: restart rmote nginx

service: name=nginx state=restart

8.setup

收集远程服务器信息

ansible all -m setup

在playbook中,这项任务默认是执行的,不需要列出。

9.server start

ansbile all -m service -a 'name=httpd state=started

10.script

ansibleall -m script -a '/root/123.sh

11.shell

ansible all -m shell -a "echo $RANDOM | tr'0-9' 'a-z' > /root/123"

2.安装Ansible
由于目前ansible还没有被集成到红帽的默认yum仓库中,所以需要安装epel。
# rpm -Uvh
# yum install ansible
三、Ansible基本配置
1.ansible主机和主机组定义
默认定义主机的文件为/etc/ansible/hosts
192.168.1.210
test2.elisun.com
test[1:2].elisun.com
[webservers]
192.168.1.210
[dbservers]
192.168.1.211
[WebsAndDbs:children]
webservers
dbservers
定义规则:
主机可以用域名、IP、别名进行标识,[webservers]、[dbservers]为组名,组名的下方为组的成员,所以对于单个主机来说,一定要靠上写。
可以使用通配符、范围等表示主机群(例如test[1:2].elisun.com,表示两个主机)。
支持组嵌套,父组名+":children",如[WebsAndDbs:children],其下跟上要包含的组名,可以用"ansible WebsAndDbs --list-hosts"命令列出其下包含的主机。
2./etc/ansible/ansible.cfg
ansible的主配置文件,可以修改许多默认配置,无需重启,例如可以打开日志记录,去掉'log_path = /var/log/ansible.log'前面的'#'即可。
3.配置SSH无密码验证
由于ansible是基于ssh进行操作的,所以每次操作都需要输入密码或者将密码写入到配置文件,所以为了方便和安全采用ssh无密码原则,配置请自行搜索。
四、 Ansible常用模块(命令行操作格式为:ansible 主机 -m 模块名 -a '模块参数')

(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;

Copy模块

  实现Ansible服务端到目标主机的文件传送

  - name: copy file

copy: 'remote_src=no src=/tmp/test.txt dest=/tmp/test.txt mode=0644 force=yes'

  1. Ping模块
    Ping模块验证与目标主机的连通性。
    # ansible webservers -m ping
  2. 远程命令模块
    模块包括command、script、shell,都可以实现远程shell命令运行。command作为Ansible的默认模块,可以运行远程权限范围内所有shell命令;script功能是在远程主机执行主控端存储的shell脚本;shell功能是执行远程主机的shell脚本文件。
    # ansible webservers -m command -a "df -h"
    # ansible webservers -m script -a "/tmp/test.sh"
    # ansible webservers -m shell -a "/tmp/test.sh"
  3. copy模块
    实现主控端向目标拷贝文件,类似于scp的功能。
    # ansible webservers -m copy -a "src=/etc/httpd/conf/httpd.conf dest=/tmp/ owner=www group=www mode=0644"
  4. stat模块
    获取远程文件状态信息,包括atime、ctime、mtime、md5、uid、gid等信息。
    # ansible webservers -m stat -a "path=/etc/passwd"
  5. get_url模块
    实现在远程主机下载指定URL到本地,支持sha256sum文件校验。
    # ansible webservers -m get_url -a "url= dest=/tmp/index.html mode=0440 force=yes"
  6. yum模块
    在远程机器上安装软件。
    # ansible webservers -m yum -a "name=httpd state=latest"
  7. cron模块
    远程主机定时任务。
    # ansible webservers -m cron -a "name='a job for time sync' minute=*/30 job='/usr/sbin/ntpdate 1.asia.pool.ntp.org && /sbin/hwclock -w'"
    效果如下:
    #Ansible: a job for time sync
    */30 * * * * /usr/sbin/ntpdate 1.asia.pool.ntp.org && /sbin/hwclock -w
  8. user模块
    远程主机用户管理。
    # ansible webservers -m user -a "name=eli comment=elisun" (创建)
    # ansible webservers -m user -a "name=eli state=absent remove=yes" (删除)
  9. Setup模块
    这个模块帮助我们收集系统的相关信息。
    # ansible webservers -m setup
  10. 模块帮助
    # ansible-doc -l //查看支持的模块
    # ansible-doc 模块名 //查看该模块的帮助信息
    五、 Ansible playbook
    剧本(playbook)是部署指令的集合,这些指令也称为演出(plays)。使用剧本的好处是可以组合多个Ansible模块。playbook是通过YAML格式进行描述定义的,文件名一般以yml为后缀。
  11. 剧本举例 web服务器剧本:apache.yml


    • hosts: webservers tasks:
    • name: deploy apache yum: pkg=httpd state=latest
    • name: apache config file copy: src='files/httpd.conf' dest='/etc/httpd/conf/httpd.conf' notify:
    • restart httpd
    • name: apache service runs service: name=httpd state=started handlers:
    • name: restart httpd service: name=httpd state=restarted

(3)、各种模块核心模块、command模块、自定义模块;

Stat模块

  获取远程文件状态信息

  - name: check if text.txt exists

stat: 'path=/tmp/text.txt'

register: script_stat # 将stat结果赋值给 script_stat

hosts关键字指定运行这些指令的主机(/etc/ansible/hosts文件中的webservers组)
tasks关键字表示webservers组中主机上将要执行的模块的开始。每个task至少包括两个部分,name:是一个标识,让阅读代码的人知道这个任务的作用;第二个部分是要执行的Ansible模块(我们上述第一个任务是执行yum模块)。
notify表示响应配置文件更改时执行某些功能的Ansible处理程序名称。
handlers和tasks部分很类似,但是handlers起着特殊的作用——响应notify通知操作,即notify表示要干啥,而handlers负责怎么干。注意notify下指定的操作要和handler下的某个name关键字相匹配。
总结一下,一般的剧本文件包含四个主要部分:主机定义(hosts)、变量定义(vars)、任务定义(tasks)、处理程序定义(handles)。

(4)、借助于插件完成记录日志邮件等功能;

Debug模块

  打印语句到Ansible执行输出

  - debug: msg=text.txt exists

   when: script_stat.stat.exists  # 跟Stat模块配合使用

  1. 条件表达式和变量
    上面的例子我们的apache剧本已经准备好,针对的系统是RedHat。但是,如果我们的生产环境有基于Debian的系统(例如,Ubuntu)怎么办?我们需要优雅的处理多种操作系统。
    when:条件语句允许根据偏好调整主机上执行的Ansible任务。
    我们对上面的例子进行修改,以便能根据系统做相应的操作,如下代码。


    • hosts: webservers tasks: # Deploy the Web Server
    • name: Deploy Apache for Red Hat Systems yum: pkg=httpd state=latest when: ansible_os_family == 'RedHat'
    • name: Deploy Apache for Debian Systems apt: pkg=apache2 state=latest when: ansible_os_family == 'Debian'

      # Copy Config File

    • name: Apache Config File for Red Hat Systems copy: src='files/httpd.conf' dest='/etc/httpd/conf/httpd.conf' notify:
    • restart httpd redhat when: ansible_os_family == 'RedHat'
    • name: pache Config File for Debian Systems copy: src='files/apache2.conf' dest=/etc/apache2/apache2.conf notify:
    • restart httpd debian when: ansible_os_family == 'Debian'

      # Verify Web Service is running

    • name: Apache Service Runs for Red Hat Systems service: name=httpd state=started when: ansible_os_family == 'RedHat'
    • name: Apache Service Runs for Debian Systems service: name=apache2 state=started when: ansible_os_family == 'Debian'

      # Restart Web Service in response to config file change handlers:

    • name: restart httpd redhat service: name=httpd state=restarted
    • name: restart httpd debian service: name=apache2 state=restarted

(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

Command/Shell模块

  用来执行Linux目标主机命令,区别为:Shell —— 会调用系统中的/bin/bash,这样就可以使用系统中的环境变量,例如重新向,管道符。

  - name: run a script

   command: 'echo "hello world"'

'#'注释为便于理解。WEB服务器部署中的每个重要步骤都有两组指令,一组为RedHat系统,另一组为Debian系统。Ansible将求取when:语句的值,决定在目标节点上执行的任务,该语句使用ansible_os_family系统fact变量(ansible webservers -m setup | grep family)提供模块执行指导。
有木有发现一个问题,上述代码写的太冗余了,我们可以使用Ansible的group_by函数来简化代码,该函数能够自动根据某些条件(例如,ansible_os_family)创建更多的主机组。从来自/etc/ansible/hosts文件中webservers组开始,告诉ansible从该组中创建附加组,以ansible_os_family系统事实作为选择条件。对于我们的系统意味着运行时将创建两个组(RedHat and Debian),这些主机组将用于剧本的其余部分,代码如下。

下面来看下ansible的使用:

Template模块

  实现Ansible服务端到目标主机的jinja2模板传送

  - name: write the nginx config file

   template: src=/tmp/nginx.conf.j2 dest=/etc/nginx/nginx.conf

---
- hosts: webservers
tasks:
- name: Group Servers By Operating System Family
action: group_by key={{ ansible_os_family }}
- hosts: RedHat
- name: Deploy Apache
yum: pkg=httpd state=latest
- name: Apache Config File
copy: src='files/httpd.conf' dest='/etc/httpd/conf/httpd.conf'
notify:
- restart httpd
- name: apache service runs
service: name=httpd state=started
handlers:
- name: restart httpd
service: name=httpd state=restarted

- hosts: Debian
- name: Deploy Apache
apt: pkg=apache2 state=latest
- name: Apache Config File
copy: src='files/apache2.conf' dest='/etc/apache2/apache2.conf'
notify:
- restart httpd
- name: apache service runs
service: name=httpd state=started
handlers:
- name: restart httpd
service: name=apache2 state=restarted

一:首先安装ansible模块:apt install ansible

Packaging模块

  调用目标主机系统包管理工具进行安装

  - name: ensure nginx is at the latest version

yum: pkg=nginx state=latest

- name: ensure nginx is at the latest version

apt: pkg=nginx state=latest

when条件语句和group_by函数都可以解决根据操作系统类型来引导剧本执行的问题。
但是,关键的问题是尼玛代码还是那么多,我们接下来通过Ansible的其它能力来优化下代码,代码如下。
#apache.yml

二:配置Ansible以及测试。

Service模块

  管理目标主机系统服务

- name: start nginx service

service: name=nginx state=started

---
- hosts: webservers
vars_files: 
- "vars/{{ ansible_os_family }}.yml"
tasks:
- name: Deploy Apache for Red Hat Systems
yum: pkg=httpd state=latest
when: ansible_os_family == 'RedHat'
- name: Deploy Apache for Debian Systems
apt: pkg=apache2 state=latest
when: ansible_os_family == 'Debian'
- name: Apache Config File
copy: src=files/{{ conffile }} dest={{ confpath }}
notify:
- restart httpd
- name: Apache Service Runs
service: name={{ webserver }} state=started
handlers:
- name: restart httpd
service: name={{ webserver }} state=restarted

(1)第一步是修改主机与组配置。文件在/etc/ansible/hosts. 格式位ini。添加1台主机同时定义IP到werbserver组。

 

#green.example.com

#RedHat.yml

#blue.example.com

---
webserver: 'httpd'
conffile: 'httpd.conf'
confpath: '/etc/httpd/conf/httpd.conf'
contentpath: '/var/www/html/index.html'

192.168.0.9

 

# Ex 2: A collection of hosts belonging to the 'webservers' group

#Debian.yml

#[webservers]

webserver: 'apache2'
conffile: 'apache2.conf'
confpath: '/etc/apache2/apache2.conf'
contentpath: '/var/www/index.html'

#alpha.example.org

 

#beta.example.org

目录结构
├── apache.yml
├── files
│ ├── apache2.conf
│ └── httpd.conf
├── host
└── vars
├── Debian.yml
└── RedHat.yml
该代码示例中,我们加入了一个新元素:vars_files。这个关键字告诉Ansible我们在哪里保存剧本中使用的变量。变量必须包含在{{ }}中。直观来看,我们发现经过优化的代码好像还是不尽人意,但是不可否认的是我们的逻辑更加清晰了,重复的动作越来越少。因为这个案例的代码比较少,所以再怎么优化它也很难减少,但是在更大的剧本中,使用变量可能会带来更为显著的优化效果。
六、Ansible角色
目前,组织文件是个简单的任务,因为我们只处理Apache的部署,但是,如果我们想部署其它类型的服务呢?我们要不断地在当前YAML文件中添加用于数据库、应用服务等的附加演出吗?即使应用模块化设计,将演出分隔到单独的YAML文件中,那么组织文件(配置文件、变量文件等)的最佳方法又是什么?是将它们放在公共的目录中,还是根据功能创建不同的子目录?Ansible的作者考虑了这些问题,实现角色功能来实现它们。
Apache Web服务器角色示例:
├── apache.yml
└── roles
└── web
├── defaults
│ └── main.yml
├── files
│ ├── apache2.conf
│ └── httpd.conf
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
└── vars
├── Debian.yml
├── main.yml
└── RedHat.yml
roles目录和apache.yml文件在同级目录下,其余目录和文件在roles目录下。
defaults: 如果角色在调用时接受参数,可以将包含未在主剧本角色中指定的默认值的YAML文件放在这个目录下。
files: 打算复制到目标主机的任何文件。
handlers: 执行响应剧本任务通知的指令(例如,配置文件更改后重启服务)
meta: 当前角色所以来的其它Ansible角色引用。
tasks: 剧本任务位置。
templates: 可用于根据系统事实或者其它变量动态生成内容的Jinja2文件。
vars: 剧本使用的变量。

192.168.0.9

apache.yml

  • hosts: webservers
    roles:
  • web
    角色名字web必须与roles文件夹中的子目录名相符合(方能匹配)。剧本中的tasks和handlers分隔到了单独的文件,这些文件名都为main.yml,分别在tasks和handlers子目录下(roles/web/{tasks,handlers}/main.yml)
    roles/web/tasks/main.yml


    • name: Ansible OS Family include_vars: '{{ ansible_os_family }}.yml'
    • name: Deploy Apache for Red Hat Systems yum: pkg=httpd state=latest when: ansible_os_family == 'RedHat'
    • name: Deploy Apache for Debian Systems apt: pkg=apache2 state=latest when: ansible_os_family == 'Debian'
    • name: Apache Config File copy: src={{ conffile }} dest={{ confpath }} notify:
    • restart httpd
    • name: Apache Service Runs service: name={{ webserver }} state=started

 

roles/web/handlers/main.yml

---
- name: Ansible OS Family
include_vars: "{{ ansible_os_family }}.yml"
- name: restart httpd
service: name={{ webserver }} state=restarted

 

执行命令:# ansible-playbook apache.yml

9159.com 2

参考书籍:
《DevOps实战》
《Python自动化运维》

(二)通过ping模块测试主机的连通性。分别对单主机进行ping操作。出现如下结果表明测试成功。

root@zhf-linux:/home/zhf# ansible 192.168.0.9 -m ping

192.168.0.9 | SUCCESS => {

"changed": false,

"ping": "pong"

}

root@zhf-linux:/home/zhf# ansible webservers -m ping

192.168.0.9 | SUCCESS => {

"changed": false,

"ping": "pong"

}

Ansible是依赖于SSH通信,如果机器之间没有配置SSH证书访问的话,则需要用登录密码访问。命令需改为ansible 192.168.0.9 -m ping -k.

三:Ansible功能模块:

(1) 远程命令模块:

模块包括command,script,shell都可以实现远程shell命令运行。command作为ansible的默认模板,可以运行远程权限范围所有的shell命令,script是在远程主机执行主控端存储的shell脚本文件。相当于SCP+SHELL组合,shell功能是执行远程主机的shell脚本文件。

root@zhf-linux:/home/zhf# ansible webservers -m command -a "ls -al"

192.168.0.9 | SUCCESS | rc=0 >>

total 72

drwx------ 12 root root 4096 Nov 12 14:45 .

drwxr-xr-x 22 root root 4096 Jul 9 16:59 ..

drwxr-xr-x 3 root root 4096 Nov 12 14:45 .ansible

-rw------- 1 root root 5408 Nov 12 14:46 .bash_history

-rw-r--r-- 1 root root 3106 Feb 20 2014 .bashrc

drwx------ 5 root root 4096 Aug 31 21:47 .cache

drwx------ 4 root root 4096 Jul 26 10:47 .config

drwx------ 3 root root 4096 Jul 9 15:59 .dbus

drwx------ 2 root root 4096 Jul 9 16:23 .gvfs

drwxr-xr-x 3 root root 4096 Jul 26 11:23 .local

drwxr-xr-x 2 root root 4096 Jul 26 11:33 .pip

-rw-r--r-- 1 root root 140 Feb 20 2014 .profile

drwxr-xr-x 3 root root 4096 Jul 26 11:41 .python-eggs

drwxr-xr-x 2 root root 4096 Oct 30 21:18 .rpmdb

drwx------ 2 root root 4096 Oct 27 23:11 .ssh

-rw-r--r-- 1 root root 0 Oct 29 10:02 test.txt

-rw------- 1 root root 5439 Oct 31 22:07 .viminfo

在主机上建立一个sh文件,内容很简单,就是echo “hello ansible”。通过远程端也可以调用。

root@zhf-linux:/home/zhf# ansible webservers -m shell -a "/home/zhf/zhf/shell_prj/test1.sh"

192.168.0.9 | SUCCESS | rc=0 >>

hello ansible!

拷贝文件:

在上传文件的同时还可以设置上传文件的属主以及权限。格式为: owner=xxx group=xxx mode=0744

root@zhf-linux:/home/zhf/zhf# ansible webservers -m copy -a "src=/home/zhf/zhf/test2.txt dest=/home/zhf owner=root group=root mode=0744"

192.168.0.9 | SUCCESS => {

"changed": true,

"checksum": "07c0752c54e3883358ab0c8c6008004929954217",

"dest": "/home/zhf/test2.txt",

"gid": 0,

"group": "root",

"md5sum": "d2c01e6badaa08464b9e0cd578a5de8b",

"mode": "0744",

"owner": "root",

"size": 30,

"src": "/root/.ansible/tmp/ansible-tmp-1510471651.28-269106495340296/source",

"state": "file",

"uid": 0

}

stat模块:

获取远程文件的状态信息,包括ctime,mtime,atime,uid,gid等信息。我们用刚才上传的文件为例。

root@zhf-linux:/home/zhf/zhf# ansible webservers -m stat -a "path=/home/zhf/test2.txt"

192.168.0.9 | SUCCESS => {

"changed": false,

"stat": {

"atime": 1510471652.086876,

"checksum": "07c0752c54e3883358ab0c8c6008004929954217",

"ctime": 1510471652.130877,

"dev": 2054,

"exists": true,

"gid": 0,

"gr_name": "root",

"inode": 130813,

"isblk": false,

"ischr": false,

"isdir": false,

"isfifo": false,

"isgid": false,

"islnk": false,

"isreg": true,

"issock": false,

"isuid": false,

"md5": "d2c01e6badaa08464b9e0cd578a5de8b",

"mode": "0744",

"mtime": 1510471651.438875,

"nlink": 1,

"path": "/home/zhf/test2.txt",

"pw_name": "root",

"rgrp": true,

"roth": true,

"rusr": true,

"size": 30,

"uid": 0,

"wgrp": false,

"woth": false,

"wusr": true,

"xgrp": false,

"xoth": false,

"xusr": true

}

}

远程安装软件:将会远程主机安装上ansible模块。

root@zhf-linux:/home/zhf/zhf# ansible webservers -m apt -a "pkg=ansible state=latest"

cron模块:

root@zhf-linux:/home/zhf/zhf# ansible webservers -m cron -a "name=check dirs hour='5,2' job='ls -al'"

下一节讲介绍playbook模块

本文由9159.com发布于编程,转载请注明出处:9159.com官网链接,Ansible于2015年10月被开源巨头R

关键词: