Ansible安装配置和基本使用

Ansible安装配置和基本使用,第1张

http://www.tuicool.com/wx/vUfYVfA

一、ansible 安装

ansible 依赖于python2.6或更高的版本、paramiko、PyYAML及Jinja2。

https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz

将python头文件拷贝到标准目录,以避免编译ansible时,找不到所需的头文件

备份旧版本的python,并符号链接新版本的python

修改yum脚本,使其指向旧版本的python,已避免其无法运行

1.1 编译安装

解决依赖关系

解压安装包

https://github.com/ansible/ansible/archive/v1.7.2.tar.gz

编译安装

拷贝配置文件

1.2 rpm包安装

使用阿里云镜像源即可,这里为了方便使用,就直接使用yum安装了。

Fedora 用户可直接安装Ansible, 但RHEL或CentOS用户,需要 配置 EPEL # yum install -y epel-release # yum install -y ansible

注意:不同版本的ansible的功能差异可能较大。

二、配置

配置文件:/etc/ansible/ansible.cfg

hostfile=/etc/ansible/hosts #指定默认hosts配置的位置 host_key_checking = False #不进行host_key检查,省去目标key发生变化时输入(yes/no)的步骤 ask_pass=True # 每次执行ansible命令是否询问ssh密码 ask_sudo_pass=True # 每次执行ansible命令时是否询问sudo密码

主机清单:/etc/ansible/hosts

主程序:ansible、ansible paly-book、ansible-doc

1、将要管理的主机纳入 /etc/ansible/hosts配置文件中,可以填写IP或是主机名

[WebServers] 10.10.10.3 10.10.10.4

2、.基于ssh的方式与被管理的主机进行通信,在管理的主机上(部署ansible的主机上)生成一对非对称密钥,将公钥发给被管理的主机。

a,生成密钥对:ssh-keygen -t rsa

b,将密钥发放到要管理的主机:ssh-copy-id -i 10.10.10.3 或 ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.10.10.3

3、使用ansible命令测试

[root@wlm yum.repos.d]# ansible all -m ping 10.10.10.4 | SUCCESS =>{ "changed": false, "ping": "pong" }

三、基本使用

1、常用命令

ansible-doc 命令:获取模块列表、模块使用格式。

ansible-doc -l :获取列表

ansible-doc -s module_name:获取指定模块信息

2、ansible 命令格式

ansible <host-pattern>[-f forks] [-m module_name] [-a args]

<host-pattern>指明管控主机,以模式表示或者直接指定ip,必须事先指定在文件中;all所有

[-f forks] 指明每批管控多少主机,默认是5个主机一批次

[-m module_name] 使用何种模块 *** 作,所有 *** 作都需要通过模块指定

[-a args] 指明模块专用参数;args 一般是 key=value格式。注:command模块的参数不是kv模式,而是直接给出要执行的命令。

注意:<host-pattern>默认读取/etc/ansible/hosts,也可以指明自定义文件路径 -iPATH,--inventory=PATH:指明使用的 host inventory文件路径;

3、常用模块介绍

1、command模块:远程主机上运行命令

例:ansible hosts -m command -a "ls /tmp" 注:command模块也可以省略。

给远程主机添加用户、设置密码:

ansible hosts -a 'useradd user1'

ansible hosts -a 'echo abc | passwd --stdin user1'

2、shell模块:远程主机在shell进程下运行命令,支持shell特性,也支持管道符。

10.10.10.4 | SUCCESS | rc=0 >>

3、copy模块:把当前主机文件复制到远程主机位置,可以指定mode、own、group

10.10.10.4 | SUCCESS =>{ "changed": true, "checksum": "325287cee456533bf76025312e5d05e842cb43a9", "dest": "/root/abc.txt", "gid": 0, "group": "root", "md5sum": "1c6d47c6e4d59c630751b47fff140b89", "mode": "0644", "owner": "ansible", "size": 15, "src": "/root/.ansible/tmp/ansible-tmp-1484639082.19-114656107854348/source", "state": "file", "uid": 0 }

4、cron模块:在远程主机指定crontab周期性计划任务

minute= hour= day= month= weekday= job= name= (必须填写) state=

ansible all -m cron -a "minute=*/10 job='/sbin/ntpdate 10.10.10.10 &>/dev/null' name=synctime" 可使用crontab -l查看

在管理的主机上可以删除制定的计划任务

10.10.10.4 | SUCCESS =>{ "changed": true, "envs": [], "jobs": [] }

5、fetch模块:和copy相反,从远程主机拷贝文件到本地主机

可以不要flat=yes参数,但作用:

当dest=/root/kel/ ,abc.txt会保存在/root/kel/目录下

当dest=/root/kel ,会拷贝abc.txt文件,并命名成kel

6、file模块:file模块包含了文件、文件夹、超级链接类的创建、拷贝、移动、删除

path=/etc/foo.conf owner=foo group=foo mode=0644

src=/file/to/link/to dest=/path/ro/symlink owner=foo group=foo state=link

src=/tmp/{{item.path}} dest={{item.dest}} state=link with_items:

path=/etc/foo.conf state=touch mode="u=rw,g=w,o=r"

path=/etc/foo.conf state=touch mode="u+w,g-w,o-rw"

7、yum模块:用于yum安装安装和卸载

8、service模块:服务管理

9、user/group模块:user模块管理用户;group模块管理group

四、Playbook剧本

playbook 是ansible更强大的配置管理组件,实现基于文本文件编排执行的多个任务,且多次重复执行。playbook组织格式为使用YAML语言来编写的。

playbook 是由一个或多个“play”组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上讲,所谓的task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让他们联通起来按事先编排的机制生效。

1、例子:

在ansible主机上的root目录下创建httpd目录,将本机的httpd.conf文件拷贝到该目录下,修改配置文件里的监听端口是8081

remote_user:root #root前不能有空格

tasks: #任务列表

yum name=httpd state=present #yum后的: 删除掉

copy src=/root/httpd/httpd.conf dest=/etc/httpd/conf

service name=httpd state=started

注意:yaml文件中支持#;下面的 *** 作要跟上面的name对齐。

测试:

ansible-playbook --check playbook :只检测可能会发生的改变,但不真正执行 *** 作

ansible-playbook playbook :直接执行

ansible-playbook --list-hosts :列出运行任务的主机

2、playbook介绍

设置在特定条件下触发:

a,某任务的状态在运行后为changed时,可通过“notify”通知给相应的handles;

handles:任务在特定条件下触发;接收到其他任务的通知是被触发;

b,任务可以通过“tags”打标签,而后可在ansible-playbook命令上使用-t指定进行调用;

Ansible 和 SaltStack 都提供了 Python 直接调用的API, 这方便了 Pythoner 对这些软件进行二次开发和整合, 此功能着实方便了不少, 比起 Python 代码中调用 shell 也略显专业!

然而 Ansible 在2.0版本后重构了大部分的代码逻辑, 启用了2.0版本之前的 Runner 和 Playbook 类, 使得广大同学之前的代码运行错误. 择日不如撞日, 今天中午对照 官方的文档 , 结合源代码, 对2.0版本之后的 Python API 做了下探究

Adhoc

adhoc 其实就是执行 Ansible 模块, 通过 adhoc 我们可以方便快捷的完成一些临时的运维 *** 作.

2.0 之前的调用

import ansible.runner

import json

runner = ansible.runner.Runner(

module_name='ping', # 模块名

module_args='', # 模块参数

pattern='all', # 目标机器的pattern

forks=10

)

datastructure = runner.run()

data = json.dumps(datastructure,indent=4)

当然这里会去加载默认的 inventory

如果不想使用 inventory 文件或者想使用动态的 inventory, 则可以使用 host_list 参数代替

import ansible.runner

import json

runner = ansible.runner.Runner(

host_list=["10.10.0.1"], # 这里如果明确指定主机需要传递一个列表, 或者指定动态inventory脚本

module_name='ping', # 模块名

module_args='', # 模块参数

extra_vars={"ansible_ssh_user":"root","ansible_ssh_pass":"xx"},

forks=10

)

datastructure = runner.run()

data = json.dumps(datastructure,indent=4)

2.0 之后的调用

import json

from ansible.parsing.dataloader import DataLoader

from ansible.vars import VariableManager

from ansible.inventory import Inventory

from ansible.playbook.play import Play

from ansible.executor.task_queue_manager import TaskQueueManager

from ansible.executor.playbook_executor import PlaybookExecutor

loader = DataLoader() # 用来加载解析yaml文件或JSON内容,并且支持vault的解密

variable_manager = VariableManager() # 管理变量的类,包括主机,组,扩展等变量,之前版本是在 inventory 中的

inventory = Inventory(loader=loader, variable_manager=variable_manager)

variable_manager.set_inventory(inventory) # 根据 inventory 加载对应变量

class Options(object):

'''

这是一个公共的类,因为ad-hoc和playbook都需要一个options参数

并且所需要拥有不同的属性,但是大部分属性都可以返回None或False

因此用这样的一个类来省去初始化大一堆的空值的属性

'''

def __init__(self):

self.connection = "local"

self.forks = 1

self.check = False

def __getattr__(self, name):

return None

options = Options()

def run_adhoc():

variable_manager.extra_vars={"ansible_ssh_user":"root" , "ansible_ssh_pass":"xxx"} # 增加外部变量

# 构建pb, 这里很有意思, 新版本运行ad-hoc或playbook都需要构建这样的pb, 只是最后调用play的类不一样

# :param name: 任务名,类似playbook中tasks中的name

# :param hosts: playbook中的hosts

# :param tasks: playbook中的tasks, 其实这就是playbook的语法, 因为tasks的值是个列表,因此可以写入多个task

play_source = {"name":"Ansible Ad-Hoc","hosts":"10.10.0.1","gather_facts":"no","tasks":[{"action":{"module":"shell","args":"w"}}]}

play = Play().load(play_source, variable_manager=variable_manager, loader=loader)

tqm = None

try:

tqm = TaskQueueManager(

inventory=inventory,

variable_manager=variable_manager,

loader=loader,

options=options,

passwords=None,

stdout_callback='minimal',

run_tree=False,

)

result = tqm.run(play)

print result

finally:

if tqm is not None:

tqm.cleanup()

if __name__ == '__main__':

run_adhoc()

Playbook

playbook 则类似于 SaltStack 中的 state

2.0 之前的调用

from ansible import callbacks

from ansible import utils

from ansible.playbook import PlayBook

stats = callbacks.AggregateStats()

callback = callbacks.PlaybookCallbacks()

runner_callbacks = callbacks.PlaybookRunnerCallbacks(stats)

pb = ansible.playbook.PlayBook(

playbook="tasks.yml",

stats=stats,

callbacks=playbook_cb,

runner_callbacks=runner_cb,

check=True

)

pb.run()

2.0 之后的调用

import json

from ansible.parsing.dataloader import DataLoader

from ansible.vars import VariableManager

from ansible.inventory import Inventory

from ansible.playbook.play import Play

from ansible.executor.task_queue_manager import TaskQueueManager

from ansible.executor.playbook_executor import PlaybookExecutor

loader = DataLoader() # 用来加载解析yaml文件或JSON内容,并且支持vault的解密

variable_manager = VariableManager() # 管理变量的类,包括主机,组,扩展等变量,之前版本是在 inventory 中的

inventory = Inventory(loader=loader, variable_manager=variable_manager)

variable_manager.set_inventory(inventory) # 根据 inventory 加载对应变量

class Options(object):

'''

这是一个公共的类,因为ad-hoc和playbook都需要一个options参数

并且所需要拥有不同的属性,但是大部分属性都可以返回None或False

因此用这样的一个类来省去初始化大一堆的空值的属性

'''

def __init__(self):

self.connection = "local"

self.forks = 1

self.check = False

def __getattr__(self, name):

return None

options = Options()

def run_playbook():

playbooks=['task.yaml'] # 这里是一个列表, 因此可以运行多个playbook

variable_manager.extra_vars={"ansible_ssh_user":"root" , "ansible_ssh_pass":"xxx"} # 增加外部变量

pb = PlaybookExecutor(playbooks=playbooks, inventory=inventory, variable_manager=variable_manager, loader=loader, options=options, passwords=None)

result = pb.run()

print result

if __name__ == '__main__':

run_playbook()

一、ansible入门

1.介绍

Ansible是一种IT自动化工具。它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部署,滚动更新。Ansible适用于管理企业IT基础设施,从具有少数主机的小规模到数千个实例的企业环境。Ansible也是一种简单的自动化语言,可以完美地描述IT应用程序基础结构。

具备以下三个特点:

2、组成

1.连接插件connection plugins用于连接主机 用来连接管理端

2.核心模块core modules连接主机实现 *** 作, 它依赖于具体的模块来做具体的事情

3.自定义模块custom modules根据自己的需求编写具体的模块

4.插件plugins完成模块功能的补充

5.剧本playbookansible的配置文件,将多个任务定义在剧本中,由ansible自动执行

6.主机清单inventor定义ansible需要 *** 作主机的范围

最重要的一点是 ansible是模块化的 它所有的 *** 作都依赖于模块

3、执行流程

1.Ansible读取playbook剧本,剧本中会记录对哪些主机执行哪些任务。

2.首先Ansible通过主机清单找到要执行的主机,然后调用具体的模块。

3.其次Ansible会通过连接插件连接对应的主机并推送对应的任务列表。

4.最后被管理的主机会将Ansible发送过来的任务解析为本地Shell命令执行。

二、ansible安装

三、主机清单配置

1.基于密码

2.基于密钥

四、主机分类

五、测试


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11484246.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存