Ansible

Ansible

使用Ansible会提示UserWarning: Module import pkg_resources

运维 空心菜 回复了问题 2 人关注 1 个回复 4741 次浏览 2017-05-08 23:39 来自相关话题

Ansible Inventory详解

运维 空心菜 发表了文章 0 个评论 5082 次浏览 2015-10-15 18:50 来自相关话题

Inventory文件用来定义你想控制管理的服务器,默认配置文件是/etc/ansible/hosts,如下是一个简单的例子: [test] ...查看全部

Inventory文件用来定义你想控制管理的服务器,默认配置文件是/etc/ansible/hosts,如下是一个简单的例子:


[test]
10.0.3.56

[zabbix]
10.0.1.30

[web]
10.0.2.57

[zabbix], [web]是对服务器分组的名称,指定组名。主机可以直接用ip地址,也可以用域名,还可以用数字和字母指定一批连续的服务器,如:


blog[1:3].os.com  相当于blog1.os.com  blog2.os.com blog3.os.com

我们已经了解到,Ansible默认是通过ssh的方式来远程管理批量服务器的,所以我们这里使用ssh key加密的方式来进行ssh的认证会更方便,当然,你也可以选择使用Ansible的时候加-k选项,来通过交互的方式输入密码。


Ansible已经可以通过密钥的方式管理主机后,我们就可以用Ansible直接来做一些简单的测试,如下:


ansible all -m ping  # 用于检测所有的主机是否存活,all默认指所有主机

如果只想检测某个组的话,可以把all替换成组名,例如:


ansible test -m ping

当然也可以直接输入管理主机的ip地址,例如:


ansible 10.0.3.56 -m ping

在默认的情况下Ansible是使用root用户来进行远程管理的,在大多数情况下,为了安全起见,一般会使用一个普通账户来管理。


我们可以在所有的被管理的机器上面创建一个ansible的用户,并且可以使用sudo来提升权限到root。当然我们在Ansible主机上面也需要这样一个用户,并且为其生成ssh key


然后通过修改/etc/ansible/ansible.cfg配置文件中的remote_user = ansibleAnsible默认使用ansible用户来进行管理,然后使用--sudo参数来获取root权限。


你也可以通过修改/etc/ansible/ansible.cfg里的remote_port端口来修改默认远程管理的ssh22端口。


一切完成后你就可以测试了:


ansible all -m ping --sudo

如果多台主机的管理账户各有不同的话,我们也可以在Inventory文件中处理,分割进行设置,例子如下:


[webserver]
10.0.1.3 ansible_ssh_user=root
10.0.2.3 ansible_ssh_user=nock
10.0.3.3 ansible_ssh_host=10.0.3.3 ansible_ssh_port=22000

[production]
10.0.1.3
10.0.2.3
aliyun-bj-tomcat1 ansible_ssh_user=work ansible_ssh_private_key_file=/home/work/.ssh/id_rsa

简单说明:



ansible_ssh_user —-> 用于管理远程主机的用户名
ansible_ssh_host —-> 用于指定被管理主机的端口
ansible_ssh_port —-> 用于指定ssh连接端口
ansible_ssh_private_key_file —-> 指定ssh key文件
host_key_checking=False 当你第一次连接远程主机的时候,会提示yes/no,设置为False会跳过这个环节。


主机组直接还可以嵌套,需要使用关键字children,示例:


[aliyunhost:children]
aliyunhost-mysql
aliyunhost-web
aliyunhost-redis

[aliyunhost-mysql]
10.0.1.81
10.0.1.82
10.0.1.88
10.0.1.89
10.0.1.96
10.0.1.107

[aliyunhost-web]
10.0.1.104
10.0.1.105

[aliyunhost-redis]
10.0.1.181
10.0.1.18

我们也可以通过多个Inventory文件来进行主机管理,默认是/etc/ansible/hosts,如果多个管理文件,需要执行ansible命令的时候,通过-i参数来指定:


ansible -i /etc/ansible/hosts2 -m ping

关于host就讲到这里,这是用来管理客户端的。

Ansible常用模块介绍

运维 空心菜 发表了文章 0 个评论 7413 次浏览 2015-10-12 19:56 来自相关话题

之前文章http://openskill.cn/article/120已经介绍了what is ansible?下面给大家介绍介绍ansible常用的几个模块   Ansible通过模块的方式来完成一些远程的管理工作。可以通过ansib ...查看全部
之前文章http://openskill.cn/article/120已经介绍了what is ansible?下面给大家介绍介绍ansible常用的几个模块
 
Ansible通过模块的方式来完成一些远程的管理工作。可以通过ansible-doc -l查看所有模块,可以使用ansible-doc -s module来查看某个模块的参数具体用法,也可以使用ansible-doc help module来查看该模块更详细的信息。
 


setup


可以用来收集远程主机的一些基本信息:
ansible -i /etc/ansible/hosts test -m setup


ping


可以用来测试远程主机的运行状态:
ansible test -m ping


file


设置文件的属性
file模块包含如下选项:
force:需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group:定义文件/目录的属组
mode:定义文件/目录的权限
owner:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归的设置文件的属性,只对目录有效
src:要被链接的源文件的路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:
directory:如果目录不存在,创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
示例:
ansible test -m file -a "src=/etc/fstab dest=/tmp/fstab state=link"
ansible test -m file -a "path=/tmp/fstab state=absent"
ansible test -m file -a "path=/tmp/test state=touch"
ansible test -m file -a "path=/tmp/test state=directory"
ansible test -m file -a "path=/tmp/testd state=directory owner=root group=root mode=777"


copy


复制文件到远程主机
copy模块包含如下选项:
backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no
content:用于替代"src",可以直接设定指定文件的值
dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
directory_mode:递归的设定目录的权限,默认为系统默认权限
force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
others:所有的file模块里的选项都可以在这里使用
src:要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/"来结尾,则只复制目录里的内容,如果没有使用"/"来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
validate :The validation command to run before copying into place. The path to the file to validate is passed in via '%s' which must be present as in the visudo example below.
示例:
ansible test -m copy -a "src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode=0644"
ansible test -m copy -a "src=/mine/ntp.conf dest=/etc/ntp.conf owner=root group=root mode=644 backup=yes"
ansible test -m copy -a "src=/mine/sudoers dest=/etc/sudoers validate='visudo -cf %s'"


command


在远程主机上执行命令
command模块包含如下选项:
creates:一个文件名,当该文件存在,则该命令不执行
free_form:要执行的linux指令
chdir:在执行指令之前,先切换到该指定的目录
removes:一个文件名,当该文件不存在,则该选项不执行
executable:切换shell来执行指令,该执行路径必须是一个绝对路径
示例:
ansible test -a "ls /root"


shell


切换到某个shell执行指定的指令,参数与command相同。
示例:
ansible test -m shell -a "somescript.sh >> somelog.txt"


service


用于管理服务
该模块包含如下选项:
arguments:给命令行提供一些选项
enabled:是否开机启动 yes|no
name:必选项,服务名称
pattern:定义一个模式,如果通过status指令来查看服务的状态时,没有响应,就会通过ps指令在进程中根据该模式进行查找,如果匹配到,则认为该服务依然在运行
runlevel:运行级别
sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟
state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)
示例:
ansible test -m service -a "name=httpd state=started enabled=yes"
ansible test -m service -a "name=foo pattern=/usr/bin/foo state=started"
ansible test -m service -a "name=network state=restarted args=eth0"


cron


用于管理计划任务
包含如下选项:
backup:对远程主机上的原任务计划内容修改之前做备份
cron_file:如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划
day:日(1-31,[i],[/i]/2,……)
hour:小时(0-23,[i],[/i]/2,……)
minute:分钟(0-59,[i],[/i]/2,……)
month:月(1-12,[i],[/i]/2,……)
weekday:周(0-7,*,……)
job:要执行的任务,依赖于state=present
name:该任务的描述
special_time:指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly
state:确认该任务计划是创建还是删除
user:以哪个用户的身份执行
示例:
ansible test -m cron -a 'name="check dirs" hour="5,2" job="ls -alh > /dev/null"'
ansible test -m cron -a 'name="a job for reboot" special_time=reboot job="/some/job.sh"'
ansible test -m cron -a 'name="yum autoupdate" weekday="2" minute=0 hour=12 user="root" job="YUMINTERACTIVE=0 /usr/sbin/yum-autoupdate" cron_file=ansible_yum-autoupdate'
ansilbe test -m cron -a 'cron_file=ansible_yum-autoupdate state=absent'


filesystem


在块设备上创建文件系统
选项:
dev:目标块设备
force:在一个已有文件系统的设备上强制创建
fstype:文件系统的类型
opts:传递给mkfs命令的选项


user


管理用户
home:
groups:
uid
password:
name:
createhome:
system:
remove:
state:
shell:
需要特别说明的是,password后面指定的密码不能是明文,后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中,而登陆的时候输入的密码会被hash加密以后再去与/etc/shadow中存放的密码去做对比,会出现不一致的现象。所以需要先将密码字符串进行加密处理:openssl passwd -salt -1 "123456",然后将得到的字符串放到password中即可。


synchronize


使用rsync同步文件
archive
checksum
delete
dest
src
dest_port
existing_only: skip createing new files on receiver
links
owner
mode:(push, pull)
recursive
rsync_path
times:Preserve modification times
示例:
src=some/relative/path dest=/some/absolute/path rsync_path="sudo rsync"
src=some/relative/path dest=/some/absolute/path archive=no links=yes
src=some/relative/path dest=/some/absolute/path checksum=yes times=no
src=/tmp/helloworld dest=/var/www/helloword rsync_opts=--no-motd,--exclude=.git mode=pull


mount


配置挂载点
选项:
dump
fstype:必选项,挂载文件的类型
name:必选项,挂载点
opts:传递给mount命令的参数
passno
src:必选项,要挂载的文件
state:必选项
present:只处理fstab中的配置
absent:删除挂载点
mounted:自动创建挂载点并挂载之
umounted:卸载
示例:
name=/mnt/dvd src=/dev/sr0 fstype=iso9660 opts=ro state=present
name=/srv/disk src='LABEL=SOME_LABEL' state=present
name=/home src='UUID=b3e48f45-f933-4c8e-a700-22a159ec9077' opts=noatime state=present

ansible test -a 'dd if=/dev/zero of=/disk.img bs=4k count=1024'
ansible test -a 'losetup /dev/loop0 /disk.img'
ansible test -m filesystem 'fstype=ext4 force=yes opts=-F dev=/dev/loop0'
ansible test -m mount 'name=/mnt src=/dev/loop0 fstype=ext4 state=mounted opts=rw'


raw


类似command,可以传递管道
原文地址:http://devopsh.com/774.html 

Ansible工作原理

运维 空心菜 发表了文章 0 个评论 4220 次浏览 2015-09-27 10:39 来自相关话题

Ansible是一款非常简单的IT自动化引擎,可自动执行 云配置 , ...查看全部

Ansible是一款非常简单的IT自动化引擎,可自动执行 云配置配置管理应用程序部署服务内编排和许多其他IT需求。


从第一天开始,Ansible就专为多层部署而设计,它通过描述所有系统之间的相互关系来建模IT基础架构,而不仅仅是一次管理一个系统。


它不使用任何代理程序,也不使用其他自定义安全性基础结构,因此易于部署-最重要的是,它使用一种非常简单的语言(YAML,以Ansible Playbooks的形式)。


高效的架构

Ansible通过连接到节点并向其推出称为Ansible模块的小程序来工作。这些程序被编写为系统所需状态的资源模型。然后,Ansible执行这些模块(默认情况下通过SSH),并在完成后将其删除。


您的模块库可以驻留在任何计算机上,并且不需要服务器,守护程序或数据库。通常,您将使用自己喜欢的终端程序,文本编辑器以及可能的版本控制系统来跟踪内容的更改。


友好的SSH密钥

支持密码,但是带有ssh-agent的SSH密钥是使用Ansible的最佳方法之一。尽管如果您想使用Kerberos,那也很好。很多选择!


不需要root用户登录,您可以以任何用户身份登录,然后以su或sudo身份登录到任何用户。


Ansible的authorized_key模块是使用ansible控制哪些机器可以访问哪些主机的好方法。也可以使用其他选项,例如kerberos或身份管理系统。


ssh-agent bash
ssh-add〜/ .ssh / id_rsa

以简单的文本文件管理库存

默认情况下,Ansible使用一个非常简单的INI文件表示要管理的计算机,该文件将所有受管计算机放入您自己选择的组中。


要添加新计算机,无需使用其他SSL签名服务器,因此,毫无疑问可以确定为什么特定的计算机由于NTP或DNS问题而无法链接。


如果您的基础架构中还有其他来源,Ansible也可以对此进行插件,例如从EC2,Rackspace,OpenStack等来源中绘制库存,组和变量信息。


纯文本清单文件如下:


[webservers]
www1.example.com
www2.example.com

[dbservers]
db0.example.com
db1.example.com

一旦列出清单主机,就可以在简单的文本文件(在名为“ group_vars /”或“ host_vars /”的子目录中)中或直接在清单文件中为它们分配变量。


或者,正如已经提到的,使用动态清单从EC2,Rackspace或OpenStack等数据源中提取清单。


使用Ansible AD DOC并发执行任务

有了可用实例后,您可以立即与其进行对话,而无需进行任何其他设置:


ansible all -m ping 
ansible foo.example.com -m yum -a "name=httpd state=installed"
ansible foo.example.com -a "/usr/sbin/reboot"

请注意,我们有权访问基于状态的资源模块以及运行原始命令。这些模块非常易于编写,Ansible附带了许多模块,因此您的大部分工作已经完成。
Ansible包含一个巨大的内置模块工具箱,其中有750多个。


手册:简单而强大的自动化语言

PLaybook可以很好地协调基础结构拓扑的多个部分,并且可以非常详细地控制一次要处理的计算机数量。这是Ansible开始变得最有趣的地方。


Ansible的编排方法是微调的简单方法之一,因为我们相信您的自动化代码对您来说很有意义,而且对于特殊的语法或功能,您应该几乎不需要记住。


这是一本剧本的样子。提醒一下,这仅是预告片-跳至 docs.ansible.com 以获取完整的文档以及所有可能的方法。


---
- hosts: webservers
serial: 5 # update 5 machines at a time
roles:
- common
- webapp
- hosts: content_servers
roles:
- common
- content

例如app_config.yml可能看起来像:


---
- yum: name={{contact.item}} state=installed
with_items:
- app_server
- acme_software


- service: name=app_server state=running enabled=yes


- template: src=/opt/code/templates/foo.j2 dest=/etc/foo.conf
notify:
- restart app server

该Ansible文档更加深入探讨了这一点。您还可以做很多事情,包括:


  • 从负载均衡器和监视窗口中取出机器
  • 使用收集到的有关特定服务器的事实,让一台服务器知道所有其他服务器的IP地址-并使用这些服务器动态构建配置文件
  • 设置一些变量并提示其他变量,并设置未设置时的默认值
  • 使用一个命令的结果来决定是否运行另一个命令
  • 有许多先进的可能性,但是很容易上手。

最重要的是,该语言保持可读性和透明性,并且您无需执行诸如声明显式排序关系或使用编程语言编写代码之类的事情。


扩展可扩展性:模块,插件和API

如果您想编写自己的模块,则可以使用任何可返回JSON的语言(Ruby,Python,bash等)编写Ansible模块。库存还可以通过编写与该数据源对话并返回JSON的程序来插入任何数据源。还有各种Python API用于扩展Ansible的连接类型(SSH并非唯一的传输方式),回调(Ansible日志的方式等),甚至用于添加新的服务器端行为。


原文: https://www.ansible.com/overview/how-ansible-works

Ansible介绍

运维 空心菜 发表了文章 0 个评论 4564 次浏览 2015-09-27 10:25 来自相关话题

Ansible是一个自动化工具。它可以配置系统,部署软件,编排更高级的任务,比如连续部署或零停机时间滚动更新。 Ansible的目标是最简单和最易用。它也有一个强烈关注安全性和可靠性,以最少的移动部件,使用OpenSSH运输(加 ...查看全部

Ansible是一个自动化工具。它可以配置系统,部署软件,编排更高级的任务,比如连续部署或零停机时间滚动更新。


Ansible的目标是最简单和最易用。它也有一个强烈关注安全性和可靠性,以最少的移动部件,使用OpenSSH运输(加速插座模式和拉模式选择),和设计语言,人类可审核性的 - 甚至是那些不熟悉程序。


我们认为简单是所有大小的环境和相关的设计对于忙碌的所有类型的用户——这是否意味着开发人员、系统管理员,发布工程师,经理,无处不在。Ansible适合管理小设置少量的实例以及与许多成千上万的企业环境。


Ansible管理机器以最好的方式。没有一个问题如何升级远程守护进程或无法管理系统的问题因为守护进程是卸载。OpenSSH是最同行评议的开源组件,使用该工具的安全风险大大降低。Ansible是分散的,它依赖于现有的操作系统凭证来控制访问远程机器,如果需要使用Kerberos,它可以很容易地连接LDAP和其他管理系统的集中式身份验证。


Ansible是一个彻底的简单自动化引擎,自动化云配置,配置管理、应用程序部署,intra-service编排,以及许多其他的需求。


被设计为多层部署自第一天,Ansible模型你的IT基础设施,描述如何推动你所有的系统,而不仅仅是管理一个系统。


它使用没有代理,没有额外的自定义安全基础设施,所以很容易部署,最重要的是,它使用一个非常简单的语言(YAML Ansible Playbooks的形式),让你描述你的自动化工作的方式方法简明英语。


我们利用Ansible主要是作为内网服务器的一些管理,因为他用ssh来管理配置,内网同学还是很快速的,外网主要是利用Saltstack,利用消息队列远程通信,我感觉是比Ansible好的。

"msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"

运维 空心菜 回复了问题 2 人关注 1 个回复 6497 次浏览 2015-07-26 23:56 来自相关话题

使用ansible的copy模块报错

运维 Ansible 回复了问题 2 人关注 1 个回复 5845 次浏览 2021-03-23 22:26 来自相关话题

ansible安装过程中常遇到的错误

运维 空心菜 发表了文章 0 个评论 6031 次浏览 2015-06-29 11:03 来自相关话题

1.安装完成后允许命令报错 Traceback (most recent call last): File "/usr/bin/ansible", line 197, in (runner, r ...查看全部
1.安装完成后允许命令报错
Traceback (most recent call last):
File "/usr/bin/ansible", line 197, in
(runner, results) = cli.run(options, args)
File "/usr/bin/ansible", line 163, in run
extra_vars=extra_vars,
File "/usr/lib/python2.6/site-packages/ansible/runner/__init__.py", line 233, in __init__
cmd = subprocess.Popen(['ssh','-o','ControlPersist'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
File "/usr/lib64/python2.6/subprocess.py", line 639, in __init__
errread, errwrite)
File "/usr/lib64/python2.6/subprocess.py", line 1228, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
解决方法:
# yum install openssh-clients
2.出现Error: ansible requires a json module, none found!
SSH password:
10.0.1.110 | FAILED >> {
"failed": true,
"msg": "Error: ansible requires a json module, nonefound!",
"parsed": false
}
解决方法:
python版本过低,要不升级python要不就升级安装python-simplejson。
3.安装完成后连接客户端服务器报错
FAILED => Using a SSH password insteadof a key is not possible because Host Key checking is enabled and sshpass doesnot support this.  Please add this host'sfingerprint to your known_hosts file to manage this host.
解决方法:
在ansible 服务器上使用ssh 登陆下/etc/ansible/hosts 里面配置的服务器。然后再次使用ansible 去管理就不会报上面的错误了!但这样大批量登陆就麻烦来。因为默认ansible是使用key验证的,如果使用密码登陆的服务器,使用ansible的话,要不修改ansible.cfg配置文件的ask_pass = True给取消注释,要不就在运行命令时候加上-k,这个意思是-k, --ask-pass ask for SSH password。再修改:host_key_checking= False即可
4.如果客户端不在know_hosts里将会报错
paramiko: The authenticity of host '192.168.24.15'can't be established.
The ssh-rsa key fingerprint is397c139fd4b0d763fcffaee346a4bf6b.
Are you sure you want to continueconnecting (yes/no)?

解决方法:
需要修改ansible.cfg的#host_key_checking= False取消注释
5.出现FAILED => FAILED: not a valid DSA private key file
解决方法:
需要你在最后添加参数-k
6.openssh升级后无法登录报错
PAM unable todlopen(/lib64/security/pam_stack.so): /lib64/security/pam_stack.so: cannot openshared object
file: No such file or directory
解决方法:
sshrpm 升级后会修改/etc/pam.d/sshd 文件。需要升级前备份此文件最后还原即可登录。
7.第一次系统初始化运行生成本机ansible用户key时报错
failed: [127.0.0.1] =>{"checksum": "f5f2f20fc0774be961fffb951a50023e31abe920","failed": true}
msg: Aborting, target uses selinux but pythonbindings (libselinux-python) aren't installed!
FATAL: all hosts have already failed –aborting
解决方法:
# yum install libselinux-python -y

使用Ansible会提示UserWarning: Module import pkg_resources

回复

运维 空心菜 回复了问题 2 人关注 1 个回复 4741 次浏览 2017-05-08 23:39 来自相关话题

"msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"

回复

运维 空心菜 回复了问题 2 人关注 1 个回复 6497 次浏览 2015-07-26 23:56 来自相关话题

使用ansible的copy模块报错

回复

运维 Ansible 回复了问题 2 人关注 1 个回复 5845 次浏览 2021-03-23 22:26 来自相关话题

Ansible Inventory详解

运维 空心菜 发表了文章 0 个评论 5082 次浏览 2015-10-15 18:50 来自相关话题

Inventory文件用来定义你想控制管理的服务器,默认配置文件是/etc/ansible/hosts,如下是一个简单的例子: [test] ...查看全部

Inventory文件用来定义你想控制管理的服务器,默认配置文件是/etc/ansible/hosts,如下是一个简单的例子:


[test]
10.0.3.56

[zabbix]
10.0.1.30

[web]
10.0.2.57

[zabbix], [web]是对服务器分组的名称,指定组名。主机可以直接用ip地址,也可以用域名,还可以用数字和字母指定一批连续的服务器,如:


blog[1:3].os.com  相当于blog1.os.com  blog2.os.com blog3.os.com

我们已经了解到,Ansible默认是通过ssh的方式来远程管理批量服务器的,所以我们这里使用ssh key加密的方式来进行ssh的认证会更方便,当然,你也可以选择使用Ansible的时候加-k选项,来通过交互的方式输入密码。


Ansible已经可以通过密钥的方式管理主机后,我们就可以用Ansible直接来做一些简单的测试,如下:


ansible all -m ping  # 用于检测所有的主机是否存活,all默认指所有主机

如果只想检测某个组的话,可以把all替换成组名,例如:


ansible test -m ping

当然也可以直接输入管理主机的ip地址,例如:


ansible 10.0.3.56 -m ping

在默认的情况下Ansible是使用root用户来进行远程管理的,在大多数情况下,为了安全起见,一般会使用一个普通账户来管理。


我们可以在所有的被管理的机器上面创建一个ansible的用户,并且可以使用sudo来提升权限到root。当然我们在Ansible主机上面也需要这样一个用户,并且为其生成ssh key


然后通过修改/etc/ansible/ansible.cfg配置文件中的remote_user = ansibleAnsible默认使用ansible用户来进行管理,然后使用--sudo参数来获取root权限。


你也可以通过修改/etc/ansible/ansible.cfg里的remote_port端口来修改默认远程管理的ssh22端口。


一切完成后你就可以测试了:


ansible all -m ping --sudo

如果多台主机的管理账户各有不同的话,我们也可以在Inventory文件中处理,分割进行设置,例子如下:


[webserver]
10.0.1.3 ansible_ssh_user=root
10.0.2.3 ansible_ssh_user=nock
10.0.3.3 ansible_ssh_host=10.0.3.3 ansible_ssh_port=22000

[production]
10.0.1.3
10.0.2.3
aliyun-bj-tomcat1 ansible_ssh_user=work ansible_ssh_private_key_file=/home/work/.ssh/id_rsa

简单说明:



ansible_ssh_user —-> 用于管理远程主机的用户名
ansible_ssh_host —-> 用于指定被管理主机的端口
ansible_ssh_port —-> 用于指定ssh连接端口
ansible_ssh_private_key_file —-> 指定ssh key文件
host_key_checking=False 当你第一次连接远程主机的时候,会提示yes/no,设置为False会跳过这个环节。


主机组直接还可以嵌套,需要使用关键字children,示例:


[aliyunhost:children]
aliyunhost-mysql
aliyunhost-web
aliyunhost-redis

[aliyunhost-mysql]
10.0.1.81
10.0.1.82
10.0.1.88
10.0.1.89
10.0.1.96
10.0.1.107

[aliyunhost-web]
10.0.1.104
10.0.1.105

[aliyunhost-redis]
10.0.1.181
10.0.1.18

我们也可以通过多个Inventory文件来进行主机管理,默认是/etc/ansible/hosts,如果多个管理文件,需要执行ansible命令的时候,通过-i参数来指定:


ansible -i /etc/ansible/hosts2 -m ping

关于host就讲到这里,这是用来管理客户端的。

Ansible常用模块介绍

运维 空心菜 发表了文章 0 个评论 7413 次浏览 2015-10-12 19:56 来自相关话题

之前文章http://openskill.cn/article/120已经介绍了what is ansible?下面给大家介绍介绍ansible常用的几个模块   Ansible通过模块的方式来完成一些远程的管理工作。可以通过ansib ...查看全部
之前文章http://openskill.cn/article/120已经介绍了what is ansible?下面给大家介绍介绍ansible常用的几个模块
 
Ansible通过模块的方式来完成一些远程的管理工作。可以通过ansible-doc -l查看所有模块,可以使用ansible-doc -s module来查看某个模块的参数具体用法,也可以使用ansible-doc help module来查看该模块更详细的信息。
 


setup


可以用来收集远程主机的一些基本信息:
ansible -i /etc/ansible/hosts test -m setup


ping


可以用来测试远程主机的运行状态:
ansible test -m ping


file


设置文件的属性
file模块包含如下选项:
force:需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group:定义文件/目录的属组
mode:定义文件/目录的权限
owner:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归的设置文件的属性,只对目录有效
src:要被链接的源文件的路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:
directory:如果目录不存在,创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
示例:
ansible test -m file -a "src=/etc/fstab dest=/tmp/fstab state=link"
ansible test -m file -a "path=/tmp/fstab state=absent"
ansible test -m file -a "path=/tmp/test state=touch"
ansible test -m file -a "path=/tmp/test state=directory"
ansible test -m file -a "path=/tmp/testd state=directory owner=root group=root mode=777"


copy


复制文件到远程主机
copy模块包含如下选项:
backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no
content:用于替代"src",可以直接设定指定文件的值
dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
directory_mode:递归的设定目录的权限,默认为系统默认权限
force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
others:所有的file模块里的选项都可以在这里使用
src:要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/"来结尾,则只复制目录里的内容,如果没有使用"/"来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
validate :The validation command to run before copying into place. The path to the file to validate is passed in via '%s' which must be present as in the visudo example below.
示例:
ansible test -m copy -a "src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode=0644"
ansible test -m copy -a "src=/mine/ntp.conf dest=/etc/ntp.conf owner=root group=root mode=644 backup=yes"
ansible test -m copy -a "src=/mine/sudoers dest=/etc/sudoers validate='visudo -cf %s'"


command


在远程主机上执行命令
command模块包含如下选项:
creates:一个文件名,当该文件存在,则该命令不执行
free_form:要执行的linux指令
chdir:在执行指令之前,先切换到该指定的目录
removes:一个文件名,当该文件不存在,则该选项不执行
executable:切换shell来执行指令,该执行路径必须是一个绝对路径
示例:
ansible test -a "ls /root"


shell


切换到某个shell执行指定的指令,参数与command相同。
示例:
ansible test -m shell -a "somescript.sh >> somelog.txt"


service


用于管理服务
该模块包含如下选项:
arguments:给命令行提供一些选项
enabled:是否开机启动 yes|no
name:必选项,服务名称
pattern:定义一个模式,如果通过status指令来查看服务的状态时,没有响应,就会通过ps指令在进程中根据该模式进行查找,如果匹配到,则认为该服务依然在运行
runlevel:运行级别
sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟
state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)
示例:
ansible test -m service -a "name=httpd state=started enabled=yes"
ansible test -m service -a "name=foo pattern=/usr/bin/foo state=started"
ansible test -m service -a "name=network state=restarted args=eth0"


cron


用于管理计划任务
包含如下选项:
backup:对远程主机上的原任务计划内容修改之前做备份
cron_file:如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划
day:日(1-31,[i],[/i]/2,……)
hour:小时(0-23,[i],[/i]/2,……)
minute:分钟(0-59,[i],[/i]/2,……)
month:月(1-12,[i],[/i]/2,……)
weekday:周(0-7,*,……)
job:要执行的任务,依赖于state=present
name:该任务的描述
special_time:指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly
state:确认该任务计划是创建还是删除
user:以哪个用户的身份执行
示例:
ansible test -m cron -a 'name="check dirs" hour="5,2" job="ls -alh > /dev/null"'
ansible test -m cron -a 'name="a job for reboot" special_time=reboot job="/some/job.sh"'
ansible test -m cron -a 'name="yum autoupdate" weekday="2" minute=0 hour=12 user="root" job="YUMINTERACTIVE=0 /usr/sbin/yum-autoupdate" cron_file=ansible_yum-autoupdate'
ansilbe test -m cron -a 'cron_file=ansible_yum-autoupdate state=absent'


filesystem


在块设备上创建文件系统
选项:
dev:目标块设备
force:在一个已有文件系统的设备上强制创建
fstype:文件系统的类型
opts:传递给mkfs命令的选项


user


管理用户
home:
groups:
uid
password:
name:
createhome:
system:
remove:
state:
shell:
需要特别说明的是,password后面指定的密码不能是明文,后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中,而登陆的时候输入的密码会被hash加密以后再去与/etc/shadow中存放的密码去做对比,会出现不一致的现象。所以需要先将密码字符串进行加密处理:openssl passwd -salt -1 "123456",然后将得到的字符串放到password中即可。


synchronize


使用rsync同步文件
archive
checksum
delete
dest
src
dest_port
existing_only: skip createing new files on receiver
links
owner
mode:(push, pull)
recursive
rsync_path
times:Preserve modification times
示例:
src=some/relative/path dest=/some/absolute/path rsync_path="sudo rsync"
src=some/relative/path dest=/some/absolute/path archive=no links=yes
src=some/relative/path dest=/some/absolute/path checksum=yes times=no
src=/tmp/helloworld dest=/var/www/helloword rsync_opts=--no-motd,--exclude=.git mode=pull


mount


配置挂载点
选项:
dump
fstype:必选项,挂载文件的类型
name:必选项,挂载点
opts:传递给mount命令的参数
passno
src:必选项,要挂载的文件
state:必选项
present:只处理fstab中的配置
absent:删除挂载点
mounted:自动创建挂载点并挂载之
umounted:卸载
示例:
name=/mnt/dvd src=/dev/sr0 fstype=iso9660 opts=ro state=present
name=/srv/disk src='LABEL=SOME_LABEL' state=present
name=/home src='UUID=b3e48f45-f933-4c8e-a700-22a159ec9077' opts=noatime state=present

ansible test -a 'dd if=/dev/zero of=/disk.img bs=4k count=1024'
ansible test -a 'losetup /dev/loop0 /disk.img'
ansible test -m filesystem 'fstype=ext4 force=yes opts=-F dev=/dev/loop0'
ansible test -m mount 'name=/mnt src=/dev/loop0 fstype=ext4 state=mounted opts=rw'


raw


类似command,可以传递管道
原文地址:http://devopsh.com/774.html 

Ansible工作原理

运维 空心菜 发表了文章 0 个评论 4220 次浏览 2015-09-27 10:39 来自相关话题

Ansible是一款非常简单的IT自动化引擎,可自动执行 云配置 , ...查看全部

Ansible是一款非常简单的IT自动化引擎,可自动执行 云配置配置管理应用程序部署服务内编排和许多其他IT需求。


从第一天开始,Ansible就专为多层部署而设计,它通过描述所有系统之间的相互关系来建模IT基础架构,而不仅仅是一次管理一个系统。


它不使用任何代理程序,也不使用其他自定义安全性基础结构,因此易于部署-最重要的是,它使用一种非常简单的语言(YAML,以Ansible Playbooks的形式)。


高效的架构

Ansible通过连接到节点并向其推出称为Ansible模块的小程序来工作。这些程序被编写为系统所需状态的资源模型。然后,Ansible执行这些模块(默认情况下通过SSH),并在完成后将其删除。


您的模块库可以驻留在任何计算机上,并且不需要服务器,守护程序或数据库。通常,您将使用自己喜欢的终端程序,文本编辑器以及可能的版本控制系统来跟踪内容的更改。


友好的SSH密钥

支持密码,但是带有ssh-agent的SSH密钥是使用Ansible的最佳方法之一。尽管如果您想使用Kerberos,那也很好。很多选择!


不需要root用户登录,您可以以任何用户身份登录,然后以su或sudo身份登录到任何用户。


Ansible的authorized_key模块是使用ansible控制哪些机器可以访问哪些主机的好方法。也可以使用其他选项,例如kerberos或身份管理系统。


ssh-agent bash
ssh-add〜/ .ssh / id_rsa

以简单的文本文件管理库存

默认情况下,Ansible使用一个非常简单的INI文件表示要管理的计算机,该文件将所有受管计算机放入您自己选择的组中。


要添加新计算机,无需使用其他SSL签名服务器,因此,毫无疑问可以确定为什么特定的计算机由于NTP或DNS问题而无法链接。


如果您的基础架构中还有其他来源,Ansible也可以对此进行插件,例如从EC2,Rackspace,OpenStack等来源中绘制库存,组和变量信息。


纯文本清单文件如下:


[webservers]
www1.example.com
www2.example.com

[dbservers]
db0.example.com
db1.example.com

一旦列出清单主机,就可以在简单的文本文件(在名为“ group_vars /”或“ host_vars /”的子目录中)中或直接在清单文件中为它们分配变量。


或者,正如已经提到的,使用动态清单从EC2,Rackspace或OpenStack等数据源中提取清单。


使用Ansible AD DOC并发执行任务

有了可用实例后,您可以立即与其进行对话,而无需进行任何其他设置:


ansible all -m ping 
ansible foo.example.com -m yum -a "name=httpd state=installed"
ansible foo.example.com -a "/usr/sbin/reboot"

请注意,我们有权访问基于状态的资源模块以及运行原始命令。这些模块非常易于编写,Ansible附带了许多模块,因此您的大部分工作已经完成。
Ansible包含一个巨大的内置模块工具箱,其中有750多个。


手册:简单而强大的自动化语言

PLaybook可以很好地协调基础结构拓扑的多个部分,并且可以非常详细地控制一次要处理的计算机数量。这是Ansible开始变得最有趣的地方。


Ansible的编排方法是微调的简单方法之一,因为我们相信您的自动化代码对您来说很有意义,而且对于特殊的语法或功能,您应该几乎不需要记住。


这是一本剧本的样子。提醒一下,这仅是预告片-跳至 docs.ansible.com 以获取完整的文档以及所有可能的方法。


---
- hosts: webservers
serial: 5 # update 5 machines at a time
roles:
- common
- webapp
- hosts: content_servers
roles:
- common
- content

例如app_config.yml可能看起来像:


---
- yum: name={{contact.item}} state=installed
with_items:
- app_server
- acme_software


- service: name=app_server state=running enabled=yes


- template: src=/opt/code/templates/foo.j2 dest=/etc/foo.conf
notify:
- restart app server

该Ansible文档更加深入探讨了这一点。您还可以做很多事情,包括:


  • 从负载均衡器和监视窗口中取出机器
  • 使用收集到的有关特定服务器的事实,让一台服务器知道所有其他服务器的IP地址-并使用这些服务器动态构建配置文件
  • 设置一些变量并提示其他变量,并设置未设置时的默认值
  • 使用一个命令的结果来决定是否运行另一个命令
  • 有许多先进的可能性,但是很容易上手。

最重要的是,该语言保持可读性和透明性,并且您无需执行诸如声明显式排序关系或使用编程语言编写代码之类的事情。


扩展可扩展性:模块,插件和API

如果您想编写自己的模块,则可以使用任何可返回JSON的语言(Ruby,Python,bash等)编写Ansible模块。库存还可以通过编写与该数据源对话并返回JSON的程序来插入任何数据源。还有各种Python API用于扩展Ansible的连接类型(SSH并非唯一的传输方式),回调(Ansible日志的方式等),甚至用于添加新的服务器端行为。


原文: https://www.ansible.com/overview/how-ansible-works

Ansible介绍

运维 空心菜 发表了文章 0 个评论 4564 次浏览 2015-09-27 10:25 来自相关话题

Ansible是一个自动化工具。它可以配置系统,部署软件,编排更高级的任务,比如连续部署或零停机时间滚动更新。 Ansible的目标是最简单和最易用。它也有一个强烈关注安全性和可靠性,以最少的移动部件,使用OpenSSH运输(加 ...查看全部

Ansible是一个自动化工具。它可以配置系统,部署软件,编排更高级的任务,比如连续部署或零停机时间滚动更新。


Ansible的目标是最简单和最易用。它也有一个强烈关注安全性和可靠性,以最少的移动部件,使用OpenSSH运输(加速插座模式和拉模式选择),和设计语言,人类可审核性的 - 甚至是那些不熟悉程序。


我们认为简单是所有大小的环境和相关的设计对于忙碌的所有类型的用户——这是否意味着开发人员、系统管理员,发布工程师,经理,无处不在。Ansible适合管理小设置少量的实例以及与许多成千上万的企业环境。


Ansible管理机器以最好的方式。没有一个问题如何升级远程守护进程或无法管理系统的问题因为守护进程是卸载。OpenSSH是最同行评议的开源组件,使用该工具的安全风险大大降低。Ansible是分散的,它依赖于现有的操作系统凭证来控制访问远程机器,如果需要使用Kerberos,它可以很容易地连接LDAP和其他管理系统的集中式身份验证。


Ansible是一个彻底的简单自动化引擎,自动化云配置,配置管理、应用程序部署,intra-service编排,以及许多其他的需求。


被设计为多层部署自第一天,Ansible模型你的IT基础设施,描述如何推动你所有的系统,而不仅仅是管理一个系统。


它使用没有代理,没有额外的自定义安全基础设施,所以很容易部署,最重要的是,它使用一个非常简单的语言(YAML Ansible Playbooks的形式),让你描述你的自动化工作的方式方法简明英语。


我们利用Ansible主要是作为内网服务器的一些管理,因为他用ssh来管理配置,内网同学还是很快速的,外网主要是利用Saltstack,利用消息队列远程通信,我感觉是比Ansible好的。

ansible安装过程中常遇到的错误

运维 空心菜 发表了文章 0 个评论 6031 次浏览 2015-06-29 11:03 来自相关话题

1.安装完成后允许命令报错 Traceback (most recent call last): File "/usr/bin/ansible", line 197, in (runner, r ...查看全部
1.安装完成后允许命令报错
Traceback (most recent call last):
File "/usr/bin/ansible", line 197, in
(runner, results) = cli.run(options, args)
File "/usr/bin/ansible", line 163, in run
extra_vars=extra_vars,
File "/usr/lib/python2.6/site-packages/ansible/runner/__init__.py", line 233, in __init__
cmd = subprocess.Popen(['ssh','-o','ControlPersist'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
File "/usr/lib64/python2.6/subprocess.py", line 639, in __init__
errread, errwrite)
File "/usr/lib64/python2.6/subprocess.py", line 1228, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
解决方法:
# yum install openssh-clients
2.出现Error: ansible requires a json module, none found!
SSH password:
10.0.1.110 | FAILED >> {
"failed": true,
"msg": "Error: ansible requires a json module, nonefound!",
"parsed": false
}
解决方法:
python版本过低,要不升级python要不就升级安装python-simplejson。
3.安装完成后连接客户端服务器报错
FAILED => Using a SSH password insteadof a key is not possible because Host Key checking is enabled and sshpass doesnot support this.  Please add this host'sfingerprint to your known_hosts file to manage this host.
解决方法:
在ansible 服务器上使用ssh 登陆下/etc/ansible/hosts 里面配置的服务器。然后再次使用ansible 去管理就不会报上面的错误了!但这样大批量登陆就麻烦来。因为默认ansible是使用key验证的,如果使用密码登陆的服务器,使用ansible的话,要不修改ansible.cfg配置文件的ask_pass = True给取消注释,要不就在运行命令时候加上-k,这个意思是-k, --ask-pass ask for SSH password。再修改:host_key_checking= False即可
4.如果客户端不在know_hosts里将会报错
paramiko: The authenticity of host '192.168.24.15'can't be established.
The ssh-rsa key fingerprint is397c139fd4b0d763fcffaee346a4bf6b.
Are you sure you want to continueconnecting (yes/no)?

解决方法:
需要修改ansible.cfg的#host_key_checking= False取消注释
5.出现FAILED => FAILED: not a valid DSA private key file
解决方法:
需要你在最后添加参数-k
6.openssh升级后无法登录报错
PAM unable todlopen(/lib64/security/pam_stack.so): /lib64/security/pam_stack.so: cannot openshared object
file: No such file or directory
解决方法:
sshrpm 升级后会修改/etc/pam.d/sshd 文件。需要升级前备份此文件最后还原即可登录。
7.第一次系统初始化运行生成本机ansible用户key时报错
failed: [127.0.0.1] =>{"checksum": "f5f2f20fc0774be961fffb951a50023e31abe920","failed": true}
msg: Aborting, target uses selinux but pythonbindings (libselinux-python) aren't installed!
FATAL: all hosts have already failed –aborting
解决方法:
# yum install libselinux-python -y
Ansible是新出现的运维工具是基于Python研发的糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。