1
2
3
4
5
_ _ ____ __ __
| | (_)_ __ _ ___ __/ ___|___ / _|/ _| ___ ___
| | | | '_ \| | | \ \/ / | / _ \| |_| |_ / _ \/ _ \
| |___| | | | | |_| |> <| |__| (_) | _| _| __/ __/
|_____|_|_| |_|\__,_/_/\_\\____\___/|_| |_| \___|\___|
Ansible,官方的解释是:Ansible is the simplest way to automate IT. Ansible 是通过 Python 语言开发。当前使用 Ansible 的用户有:Evernote、EA、rackspace、NASA、Atlassian、Twitter 等。 Ansible 默认通过 SSH 协议管理机器。在被控机器上不需要安装任何组件,需要的Python一般的Linux服务器都已经自带了。是一种比Puppet、SaltStack等更加轻量级的自动化运维管理工具。自带的模块也极其丰富。 Ansible 使用一个高质量的 Python 实现的 OpenSSH 协议库 “paramiko”。 Paramiko 遵循 SSH2 协议,支持以加密和认证的方式,进行远程服务器的连接。对 paramiko 进行了更高层次的封装。http://www.paramiko.org/ Ansible 使用 YAML 文件格式并使用 Jinja2 模板语言。
关于Configuration management (CM) 配置管理工具 Ansible — Puppet — Chef — SaltStack 的几个工具的对比,参考 https://devopsu.com/books/taste-test-puppet-chef-salt-stack-ansible.html
一些相关链接: 官方网站:http://www.ansible.com 官方文档:http://docs.ansible.com/index.html 书籍:http://www.ansible.com/ansible-book
一、安装
安装也相当方便。目前已经发布了1.8 版本,但epel源中是1.7.2
Mac
1
2
3
MacBookPro:~ hzchenkj$ brew install ansible
MacBookPro:~ hzchenkj$ ansible --version
ansible 1.7 .2
RedHat
1
2
rpm –ivh http://dl.fedoraproject.org/pub/epel/6 /x86_64/epel-release-6 -8 .noarch.rpm
yum –y install ansible
二、使用
定义主机配置文件,默认在/etc/ansible/hosts 下面, 也可以使用-i 参数指定不同的路径
1
ansible -i /usr/local/Cellar/ansible/1.7 .2 /ansible_hosts webservers -a 'uptime' -u root -k
该命令选项的作用分别为:
-i:指定 inventory 文件,使用当前目录下的 hosts webservers :针对 hosts 定义的所有主机执行,也可以指定组名或模式,或者all -m:指定所用的模块 ,默认的模块为command -a: 模块参数 -u:指定远端机器的用户 -k:参数为要求使用密码方式连接 -f: 并发数 -s: 使用sudo切换到root
或者设置环境变量
1
2
export ANSIBLE_HOSTS=/usr/local/Cellar/ansible/1.7 .2 /ansible_hosts
ansible webservers -a 'uptime' -u root -k
编辑主机配置文件,支持嵌套。也可以支持别名,定义变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[webservers]
10.223 .55.100
10.223 .55.101
10.223 .38.226
[linux:children]
nginx
tomcat
[nginx]
10.223 .38.227
[tomcat]
10.223 .39.216
10.223 .25.123
10.240 .162.11 [1 :9 ]:22
[mysql]
mysql1 ansible_ssh_host=192.168 .22.11 ansible_ssh_port=65422 ansible_ssh_user=mysql
mysql2 ansible_ssh_host=192.168 .22.12 ansible_ssh_port=65422 ansible_ssh_user=mysql
[webservers:vars]
ls-path=/bin/ls
liss=lisisi
配置ssh信任
将ansible主控机上的ssh公钥拷贝到受控机器上 生成ssh key 公钥和密钥对:
传输到受控远程服务器上:
1
cat ~/.ssh/id_rsa.pub | ssh -p 65422 winupon@192.168 .22.11 "cat - >> ~/.ssh/authorized_keys"
或者使用ssh-copy-id 命令
1
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168 .22.11
保证远程服务器上的authorized_keys 文件的权限为600 远程服务器上执行
1
2
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
使用ping模块进行测试所有的主机
1
2
3
4
5
ansible all -m ping
child1.dev | success >> {
"changed" : false ,
"ping" : "pong"
}
三、常用模块使用
以下列举Ansible自带的常用的模块: ansible-doc –l
1
ansible <pattern_goes_here> -m <module_name> -a <arguments>
或者all #匹配所有主机 salt:leihuo #匹配多个组: salt:!leihuo #在salt这个组里,但不能在leihuo这个组里的主机 salt:&leihuo #取两个组的交集 ansible-playbook site.yaml —limit salt-msater 排除某一主机 ~salt(master|minion).li .com 当然也可以用正则
setup 查看远程主机的一些基本信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
MacBookPro:~ hzchenkj$ ansible docker -m setup|more
docker12 | success >> {
"ansible_facts" : {
"ansible_all_ipv4_addresses" : [
"192.168.22.12" ,
"172.17.42.1"
],
"ansible_all_ipv6_addresses" : [
"fe80::862b:2bff:fe49:96a6" ,
"fe80::bc0c:f7ff:fea2:609c" ,
"fe80::c429:89ff:fe7c:156a" ,
"fe80::26:68ff:fe30:3f46"
],
"ansible_architecture" : "x86_64" ,
"ansible_bios_date" : "05/25/2010" ,
"ansible_bios_version" : "1.4.7" ,
"ansible_cmdline" : {
"KEYBOARDTYPE" : "pc" ,
"KEYTABLE" : "us" ,
2.ping 测试远程主机的运行状态:
1
2
3
4
5
6
7
8
9
10
MacBookPro:~ hzchenkj$ ansible docker -m ping|more
docker12 | success >> {
"changed" : false ,
"ping" : "pong"
}
docker11 | success >> {
"changed" : false ,
"ping" : "pong"
}
changed false 是指对服务器状态不会改变 3.file 选项: force:两种情况下强制创建软链接,一是源文件不存在但之后会建立的情况下;一是目标软链接已存在,需要先取消之前软链,然后创建新软链,有两个选项:yes|no group:文件/目录属组 mode:文件/目录权限 owner:文件/目录属主 path:必选项,文件/目录的路径 recurse:递归的设置文件的属性,只对目录有效 src:链接的源文件的路径,只应用于state=link dest:被链接到的路径,只应用于state=link state: directory:目录不存在,创建目录 file:即使文件不存在,也不会被创建 link:创建软链接 hard:创建硬链接 touch:文件不存在,会创建一个新文件;文件或目录已存在,则更新其最后修改时间 absent:删除目录、文件或者取消链接文件 示例:
1
2
3
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"
4.copy 复制文件到远程主机 选项: backup:覆盖之前原文件备份,备份文件包含时间信息。有两个选项:yes|no content:用于替代”src”,直接设定文件的值 dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录 directory_mode:递归的设定目录的权限,默认为系统默认权限 force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes others:所有的file模块里的选项都可以在这里使用 src:要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用”/“来结尾,则只复制目录里的内容,如果没有使用”/“来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
示例:
1
2
3
ansible test -m copy -a "src=/etc/ansible/ansible.cfg 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"
5.command 在远程主机上执行命令 选项: creates:一个文件名,当该文件存在,则该命令不执行 free_form:要执行的linux指令 chdir:在执行指令之前,先切换到该指定的目录 removes:一个文件名,当该文件不存在,则该选项不执行 executable:切换shell来执行指令,该执行路径必须是一个绝对路径 示例:
1
ansible test -a "/sbin/reboot"
6.shell 切换到某个shell执行指定的指令,参数与command相同,支持管道。 示例:
1
2
ansible test -m shell -a "file.sh >> somelog.log"
ansible test -m shell -a "ps -ef|grep tomcat"
7.service 用于管理服务 选项: arguments:给命令行提供一些选项 enabled:是否开机启动 yes|no name:必选项,服务名称 pattern:定义一个模式,如果通过status指令来查看服务的状态时,没有响应,就会通过ps指令在进程中根据该模式进行查找,如果匹配到,则认为该服务依然在运行 runlevel:运行级别 sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟 state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded) 示例:
1
2
3
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"
8.cron 用于管理计划任务 选项: backup:对远程主机上的原任务计划内容修改之前做备份 cron_file:如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划 day:日(1-31,, /2,……) hour:小时(0-23,, /2,……) minute:分钟(0-59,, /2,……) month:月(1-12,, /2,……) weekday:周(0-7,*,……) job:要执行的任务,依赖于state=present name:该任务的描述 special_time:指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly state:确认该任务计划是创建还是删除 user:以哪个用户的身份执行 示例:
1
2
3
4
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'
9.yum 使用yum包管理器来管理软件包 选项: config_file:yum的配置文件 disable_gpg_check:关闭gpg_check disablerepo:不启用某个源 enablerepo:启用某个源 list name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径 state:状态(present,absent,latest) 示例:
1
2
3
ansible test -m yum -a 'name=httpd state=latest'
ansible test -m yum -a 'name="@Development tools" state=present'
ansible test -m yum -a 'name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present'
10.user 管理用户 home: groups: uid password: name: createhome: system: remove: state: shell: 需要特别说明的是,password后面指定的密码不能是明文,后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中,而登陆的时候输入的密码会被hash加密以后再去与/etc/shadow中存放的密码去做对比,会出现不一致的现象。所以需要先将密码字符串进行加密处理:openssl passwd -salt -1 “123456”,然后将得到的字符串放到password中即可。
11.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
1
2
3
4
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'
12.raw 类似command,但可以传递管道,没装python,或者python-simplejson的情况可以使用raw,但官方还是推荐使用command
四、Ansible’s playbooks