设为首页 收藏本站
查看: 1301|回复: 0

[经验分享] Ansible原理和实现

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2015-10-22 09:16:53 | 显示全部楼层 |阅读模式
一、Ansible简介

    Ansible 是一个简单的自动化运维管理工具,可以用来自动化部署应用、配置、编排 task(持续 交付、无宕机更新等),采用 paramiko 协议库),通过SSH或者ZeroMQ等连接主机。
    Ansible 在管理节点将 Ansible 模块通过 SSH 协议(或者 Kerberos、LDAP)推送到被管理端执 行,执行完之后自动删除,可以使用 SVN 等来管理自定义模块及编排

wKiom1YmTAyzOMO3AAI7jFG8IUs814.jpg

Ansible由5 个部分组成:
    Ansible:核心

    Modules:包括 Ansible 自带的核心模块及自定义模块
    Plugins:完成模块功能的补充,包括连接插件、邮件插件等
    Playbooks:剧本,定义 Ansible 多任务配置文件,由Ansible自动执行
    Inventory:定义 Ansible 管理主机的清单

Ansible的特性:
    Ansible 无需安装服务端和客户端,只要 SSH 即可。这意味着,任何一台装有 Ansible 的机器都可以成为强大的管理端
    模块化,调用特定的模块,完成特定的任务
    基于Python语言实现,由Paramiko、PyYAML和Jinja2三个关键模块;
    部署简单,轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可
    主从模式,支持自定义模块
     支持Playbook,幂等性,一个playbook多次执行结果相同


二、Ansible的安装和配置前准备


    通过yum安装Ansible,需要配置epel源。ansible依赖于Python 2.6或更高的版本、paramiko、PyYAML及Jinja2。
1
2
[iyunv@c7node1 ~]# yum install ansible     
# RHEL/CentOS,需要配置 EPEL



    ansible通过ssh实现配置管理、应用部署、任务执行等功能,因此,需要事先配置ansible端能基于密钥认证的方式联系各被管理节点。
试验使用的是一台centos 7,两台cento 6,分别配置主机名为下列:
c7node1.wlw.com     IP:172.16.88.11
C6node1.wlw.com     IP:172.16.88.22
C6node2.wlw.com     IP:172.16.88.33
修改方法为:
1
2
3
4
5
[iyunv@c7node1 ~]# hostnamectl set-hostname C7node1.wlw.com
[iyunv@C6node1 ~]# vim /etc/sysconfig/network
HOSTNAME=C6node1.wlw.com
[iyunv@C6node2 ~]# vim /etc/sysconfig/network
HOSTNAME=C6node2.wlw.com



分别为所有主机密钥授权:
1
2
3
4
5
[iyunv@c7node1 ~]# ssh-keygen -t rsa
[iyunv@c7node1 .ssh]# pwd
/root/.ssh
[iyunv@c7node1 .ssh]# ls
id_rsa  id_rsa.pub



#生成密钥和公钥
1
2
3
4
5
[iyunv@c7node1 .ssh]# cd ~/.ssh
[iyunv@c7node1 .ssh]# ssh-copy-id -i id_rsa.pub root@172.16.88.11
[iyunv@c7node1 .ssh]# ssh-copy-id -i id_rsa.pub root@172.16.88.22
[iyunv@c7node1 .ssh]# ssh-copy-id -i id_rsa.pub root@172.16.88.33
#把服务器中的公钥分配复制到对应主机~/.ssh/authorized_keys文件中,这样就能实现密钥授权,无需密码既可以登陆



注释:
1.在首次连接或者重装系统之后会出现检查 keys 的提示
The authenticity of host '192.168.0.5 (192.168.0.5)' can't be established. ECDSA key fingerprint is 05:51:e5:c4:d4:66:9b:af:5b:c9:ba:e9:e6:a4:2b:fe. Are you sure you want to continue connecting (yes/no)?
解决办法:
vim /etc/ansible/ansible.cfg 或者 ~/.ansible.cfg
[defaults]
host_key_checking = False 也可以通过设置系统环境变量来禁止这样的提示
export ANSIBLE_HOST_KEY_CHECKING=False
2.在使用 paramiko 模式时,主机 keys 的检查会很慢
3.默认情况下 Ansible 会记录一些模块的参数等信息到每个被控端的 syslog 日志文件里,除非
在任务或者剧本里设置了 no_log: True 会不记录日志


三、Ansible命令参数介绍
ansible <host-pattern(all,*:代表所有主机)> [-f forks] [-m module_name(默认:command) ] [-a arg(key=value )]
          -m :要执行的模块,默认为command
          -a :模块的参数,一般为key=value
          -C :只是测试一下会改变什么内容,不会真正去执行
          -f :fork多少个进程并发处理,默认5
          -s :sudo运行
          -U :udo到哪个用户,默认为root
          --list-host:只打印有哪些主机会执行这个 playbook 文件,不是实际执行该 playbook
        --limit:指定运行时排除的主机
          -v :verbose mode (-vvv for more, -vvvv to enable connection debu gging)

ansible-doc: Show Ansible module documentation
     -l, --list          列出所有可用模块
     -s, --snippet        查看模块的详细信息


四、Ansible主机清单Inventory
    Ansible 通过读取默认的主机清单配置/etc/ansible/hosts,可以同时连接到多个远程主机上执行任务, 默认路径可以通过修改 ansible.cfg 的 hostfile 参数指定路径。[ ]表示主机的分组名,可以按照功能、系统等进行分类,便于对某些主机或者某一组功能相同的主机进行操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[iyunv@c7node1 ansible]# vim /etc/ansible/hosts
[targets]
localhost     ansible_connection=local
wlw.com ansible_connection=ssh ansible_ssh_user=root ansible_ssh_prot=234
#指定本地主机通过local本地连接,指定wlw.com主机通过ssh且用户为root连接,且端口ssh端口为234
wlw ansible_ssh_port=5555 ansible_ssh_host=192.168.1.50
#设置主机别名为wlw,这里的设置在执行返回结果的时候不会显示ip地址,会显示定义的别名,别名也可以给其他组引用
www[01:50].wlw.com   
db-[a:g].wlw.com
#支持通配符匹配,会替换程www01 ~ www50 , db-a ~ db-g
[atlanta]
host1 http_port=80 maxRequestsPerChild=800
host1 http_port=80 maxRequestsPerChild=800
#为每个主机单独指定一些变量,这些变量随后可以在 playbooks 中使用
[atlanta:vars]
server=http
#为一个组指定变量,组内每个主机都可以使用该变量
[group1]
host1
[group2]
host2
[group:children]
group1
group2
#这里是group1组包含了定义为别名的主机host1,然后group包含了group1和group2两个组的所有主机
[web]
172.16.88.11
172.16.88.22
[db]
172.16.88.22
172.16.88.33



ansible基于ssh连接inventory中指定的远程主机时,还可以通过参数指定其交互方式参数:

ansible_ssh_host:指定主机别名对应的真实 IP,如:251 ansible_ssh_host=183.60.41.251,
随后连接该主机无须指定完整 IP,只需指定 251 就行
ansible_ssh_port:指定连接到这个主机的 ssh 端口,默认 22
ansible_ssh_user:连接到该主机的 ssh 用户
ansible_ssh_pass:连接到该主机的 ssh 密码(连-k 选项都省了),安全考虑还是建议使用私钥
或在命令行指定-k 选项输入
ansible_sudo_pass:sudo 密码
ansible_sudo_exe(v1.8+的新特性):sudo 命令路径
ansible_connection:连接类型,可以是 local、ssh 或 paramiko,ansible1.2 之前默认为 param
iko
ansible_ssh_private_key_file:私钥文件路径
ansible_shell_type:目标系统的 shell 类型,默认为 sh,如果设置 csh/fish,那么命令需要遵循
它们语法
ansible_python_interpreter:python 解释器路径,默认是/usr/bin/python,但是如要要连*BSD
系统的话,就需要该指令修改 python 路径
ansible_*_interpreter:这里的"*"可以是 ruby 或 perl 或其他语言的解释器,作用和 ansible_p
ython_interpreter 类似

五、Ansible常用模块及其常用选项
   ping:测试模块,可以测试主机的状态,不用带参数
1
2
3
4
5
6
7
8
9
10
11
12
13
[iyunv@c7node1 ansible]# ansible all -m ping
172.16.88.22 | success >> {
    "changed": false,
    "ping": "pong"
}
172.16.88.11 | success >> {
    "changed": false,
    "ping": "pong"
}
172.16.88.33 | success >> {
    "changed": false,
    "ping": "pong"
}




   command:执行命令,这个模块并不支持 shell 变量和管道等,若想使用 shell 来执行模块,请使用-m 参数指定 shell 模块
1
2
3
4
5
6
7
8
[iyunv@c7node1 ansible]# ansible all -m command -a 'hostname'
172.16.88.11 | success | rc=0 >>
c7node1.wlw.com
172.16.88.33 | success | rc=0 >>
C6node2.wlw.com
172.16.88.22 | success | rc=0 >>
C6node1.wlw.com
# command模块要执行命令无须为key=value格式,而是直接给出要执行的命令即可,上面命令等同于nsible all -a 'hostname'




   shell:切换到某个shell执行指定的指令,参数与command相同
1
2
3
4
5
6
7
[iyunv@c7node1 tmp]# ansible web -m shell -a "echo 'shell moudel' | tee /tmp/shell"
172.16.88.33 | success | rc=0 >>
shell moudel
172.16.88.11 | success | rc=0 >>
shell moudel
[iyunv@c7node1 tmp]# cat /tmp/shell
shell moudel




   user:系统用户管理
      -a "name='用户名' state={present|absent}(present创建,absent删除) system={yes|no}'创建为系统用户' uid='指定uid' shell='指定shell' home='指定家目录'"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[iyunv@c7node1 ansible]# ansible web -m user -a 'name=test uid=299 home=/home/testhome shell=/bin/csh system=yes state=present'
172.16.88.11 | success >> {
    "changed": true,
    "comment": "",
    "createhome": true,
    "group": 299,
    "home": "/home/testhome",
    "name": "test",
    "shell": "/bin/csh",
    "state": "present",
    "system": true,
    "uid": 299
}
[iyunv@c7node1 ansible]# tail -1 /etc/passwd
test:x:299:299::/home/testhome:/bin/csh




   group:系统组管理
      -a "name='组名' state={present|absent}(present创建,absent删除) system={yes|no}(创建为系统用户) gid='指定gid'
1
2
3
4
5
6
7
8
9
10
[iyunv@c7node1 home]# ansible web -m group a 'name=testgroup state=present system=yes'
172.16.88.11 | success >> {
    "changed": true,
    "gid": 997,
    "name": "testgroup",
    "state": "present",
    "system": true
}
[iyunv@c7node1 home]# tail -1 /etc/group
testgroup:x:997:




   cron:制定计划任务
     -a "name='计划任务名' minute='指定分钟' job='执行的任务' user='执行的用户' state={present|absent}(present创建,absent删除)"
1
2
3
4
5
6
7
8
9
10
11
12
[iyunv@c7node1 ~]# ansible web -m cron -a "name='web server back' minute=*/2 job='date >/tmp/data.ts' user=root state=present"
172.16.88.11 | success >> {
    "changed": true,
    "jobs": [
        "web server back"
    ]
}
[iyunv@c7node1 ~]# crontab -l
#Ansible: web server back
*/2 * * * * date >/tmp/data.ts
[iyunv@c7node1 tmp]# cat data.ts
Tue Oct 20 04:28:01 EDT 2015




    copy:复制文件到远程主机
        -a "backup={yes|no}(覆盖前备份) dest='目标位置' src='源位置' mode='指定权限' owner='指定属主' group='指定属组'"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[iyunv@c7node1 tmp]# touch /tmp/Centos7file
[iyunv@c7node1 tmp]# ansible all -m copy -a 'src=/tmp/Centos7file dest=/tmp/ mode=777 owner=mail group=mail'
172.16.88.11 | success >> {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/Centos7file",
    "gid": 12,
    "group": "mail",
    "mode": "0777",
    "owner": "mail",
    "path": "/tmp/Centos7file",
    "secontext": "unconfined_u:object_r:user_tmp_t:s0",
    "size": 0,
    "state": "file",
    "uid": 8
}
[iyunv@C6node2 ~]# ll /tmp/Centos7file
-rwxrwxrwx. 1 mail mail 0 10月 20 16:37 /tmp/Centos7file




    file:设置文件属性,如果对应文件或目录不存在则创建
      -a "path='指定文件,绝对路径' mode='指定权限' owner='指定属主' group='指定属组' state={directory|link|hard|present|absent}"
    state:
       directory:如果目录不存在,就创建目录
       file:即使文件不存在,也不会被创建
       link:创建软链接,需要额外指定,src:被链接的源文件路径,dest:被链接到的路径
       hard:创建硬链接
       touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
       absent:删除目录、文件或者取消链接文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[iyunv@c7node1 ~]# ansible web -m file -a "dest=/tmp/test mode=600 owner=root group=root state=directory"
192.168.0.11 | success >> {
    "changed": true,
    "gid": 0,
    "group": "root",
    "mode": "0600",
    "owner": "root",
    "path": "/tmp/test",
    "secontext": "unconfined_u:object_r:user_tmp_t:s0",
    "size": 6,
    "state": "directory",
    "uid": 0
}
[iyunv@c7node1 ~]# ll -d /tmp/test
drw-------. 2 root root 6 Oct 20 08:10 /tmp/test




    yum
      -a "name='服务' state={present|latest|absent}(present:安装服务,但不更新,latest:安装最新服务,absent:卸载服务)"
1
2
3
4
5
6
7
8
9
10
11
[iyunv@c7node1 tmp]# ansible db -m yum -a "name='mysql-server' state=latest"
172.16.88.33 | success >> {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        安装详细信息
    ]
}
[iyunv@C6node2 mnt]# rpm -q mysql-server
mysql-server-5.1.73-3.el6_5.x86_64




    service
        -a "name='服务' state={started|stopped|restarted}"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[iyunv@c7node1 tmp]# systemctl status httpd
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
   Active: inactive (dead)
[iyunv@C6node2 mnt]# /etc/init.d/httpd status
httpd 已停
root@c7node1 tmp]# ansible web -m service -a 'name=httpd state=started'
172.16.88.33 | success >> {
    "changed": true,
    "name": "httpd",
    "state": "started"
}
172.16.88.11 | success >> {
    "changed": true,
    "name": "httpd",
    "state": "started"
[iyunv@c7node1 tmp]# systemctl status httpd
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
   Active: active (running) since 二 2015-10-20 05:03:32 EDT; 2min 12s ago
Main PID: 4193 (httpd)
[iyunv@C6node2 mnt]# /etc/init.d/httpd status
httpd (pid  2770) 正在运行...
#这里可以看出管理服务可以同时对Centos6和Centos7执行




   script:运行脚本,脚本可以没有执行权限
      -a '/path/to/script'

    setup:收集主机信息
1
2
3
4
5
6
7
8
[iyunv@c7node1 tmp]# ansible web -m setup
#搜集主机的所有系统信息
[iyunv@c7node1  tmp]# ansible all -m setup --tree /tmp/facts
#搜集系统信息并以主机名为文件名分别保存在/tmp/facts 目录
[iyunv@c7node1  tmp]# ansible all -m setup -a 'filter=ansible_*_mb'
#搜集和内存相关的信息
[iyunv@c7node1  tmp]# ansible all -m setup -a 'filter=ansible_eth[0-2]'
#搜集网卡信息






运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-129404-1-1.html 上篇帖子: Ansible PlayBook的原理和实现 下篇帖子: Ansible常用模块
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表