Ansible学习笔记1

常用自动化运维工具:

Ansible:python,Agentless,中小型应用环境

Saltstack:python,一般需要部署agent,执行效率高

Puppent:ruby,功能强大,配置复杂,适合大型环境

Fabric:python,agentlees

Ansible特性:

  • 模块化:调用特定的模块,完成特定任务
  • 有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块
  • 支持自定义模块
  • 基于Python语言实现
  • 部署简单,基于python和ssh,agentless
  • 安全,基于openssh
  • 支持playbook编排任务
  • 幂等性:一个任务执行1遍和执行n遍效果一样,不会因为重复执行而带来意外情况
  • 无须代理不依赖PKI(无须SSL)
  • 可使用任何编程语言写模块
  • YAML格式,编排任务,支持丰富的数据结构
  • 较强大的多层解决方案

    Ansible架构:

    《Ansible学习笔记1》

    User通过主控端ansible控制host,ansbile里有一个host lnventory 主机清单记录着哪些主机是要被控制的,模块用于单一的命令,如果要执行多条任务就要用到playbook批量执行。
    要连接被控制主机就要用到Connection plugins连接插件基于SSH协议来执行。不仅可以使user用户来管理,也可以利用私有云或公有云开发接口来进行管理。

    Ansible工作过程:

    1、加载自己的配置文件/etc/ansbile/ansbile.cfg
    2、加载自己对应的模块文件,如command
    3、通过ansbile模块或命令生成对用的临时py文件,并将该文件传输至远程服务器的对应用户$HOME/.ansbile/tmp/ansible-tmp-数字/xxx.py文件
    4、给文件+x执行
    5、执行并返回结果
    6、删除临时py文件,sleep 0退出
    《Ansible学习笔记1》

    执行状态:

  • 绿色:执行成功并且不需要做改变的操作
  • yellow色:执行成功并且对目标主机做变更
  • 红色:执行失败

    Ansbile主要组成部分:

  • Ansbile playbooks:任务剧本(任务集),编排定义ansible任务集的配置文件,由ansbile顺序依次执行,通常是JSON格式的文件。
  • Inventory:ansible管理主机的清单/etc/ansbile/hosts
  • Modules:ansbile执行命令的功能模块,多数为内置核心模块,也可自定义
  • Plugins:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
  • Api:供第三方程序条用的应用程序编程接口
  • Ansbile:组合inventory、api、modules、plugins的绿框,可以理解为是ansbile命令工具,其为核心执行工具

    注意事项:

  • 执行ansible的主机一般称为主控端、中控、master或堡垒机
  • 主控端python版本需要2.6或以上
  • 被控端python版本小于2.4需要安装python-simplejson
  • 被控端如开启SElinux需要安装libselinux-python
  • Windows不能作为主控端

    Ansible的安装

    rpm包安装:EPEL源
    yum install ansible
    Git方式:
    Git clone git://github.com/ansible/ansbile.git –recursive
    cd ./ansbile
    source ./hacking/env-setup
    还有编译安装、pip安装这里就不写了。

    本次安装采用yum安装epel源

  • 主控端:ansible 192.168.32.104
  • 被控端:node-1 192.168.32.105
  • node-2 192.168.32.106

    在主控端ansible节点安装ansbile

    [root@ansible ~]# yum install -y ansible
    看下ansbile详细信息
    [root@ansible ~]# yum info ansible
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
    * base: mirrors.aliyun.com
    * extras: mirrors.aliyun.com
    * updates: mirrors.aliyun.com
    Installed Packages
    Name        : ansible
    Arch        : noarch
    Version     : 2.4.2.0 //本次安装的是2.4版本
    Release     : 2.el7
    Size        : 38 M
    Repo        : installed
    From repo   : extras
    Summary     : SSH-based configuration management, deployment, and task execution system
    URL         : http://ansible.com
    License     : GPLv3+
    Description : 
            : Ansible is a radically simple model-driven configuration management,
            : multi-node deployment, and remote task execution system. Ansible works
            : over SSH and does not require any software or daemons to be installed
            : on remote nodes. Extension modules can be written in any language and
            : are transferred to managed machines automatically.

    Ansbile相关文件:

    配置文件:

  • /etc/ansible/ansible.cfg 主配置文件,配置ansbile工作特性
  • /etc/ansbile/hosts 主机清单
  • /etc/ansbile/roles 存放角色的目录
  • 程序:
  • /usr/bin/ansbile 主程序,临时命令执行工具
  • /usr/bin/ansbile-doc 查看配置文档,模块功能查看工具
  • /usr/bin/ansbile-galaxy 下载/上传代码或role模块的官网平台
  • /usr/bin/ansbile-playbook 定制自动化任务,编排剧本工具/usr/bin/ansbile-pull远程执行命令的工具
  • /usr/bin/ansbile-vault 文件加密工具
  • /usr/bin/ansbile-console 基于Console界面与用户交互的执行工具

    主机清单inventory:

    inventory主机清单:

  • ansbile的主要功能用在于批量主机操作,为了便携地使用其中的部分主机,可以在inventory file中将其分组命名。
  • 默认的inventory file为/etc/ansbile/hosts
  • Inventory file也可以有多个,且也可以通过dynamic inventory来动态生成

    演示被控端主机是否存活:

    要使用ansbile中的ping模块,这里的ping不是windows中的ping命令,只是同名而已,如果被控主机存活则回复pong。
    《Ansible学习笔记1》

    警报信息:主机清单列表是空的,只有本机可用
    本机可用那就用本机测试一下看看

    《Ansible学习笔记1》

    还是有警报信息:忽略本机
    所以要去配置主机清单文件
    [root@ansible ~]# vim /etc/ansible/hosts
    光标跳到最下面添加要加入主机清单的主机
    192.168.32.105
    192.168.32.106
    保存退出,然后在执行一次ping模块命令看看行不行

    《Ansible学习笔记1》

    看到这个就可以确定连接插件走的是SSH协议

    《Ansible学习笔记1》

    报错:不可到达目标主机,因为没有基于Key的验证,所以不能随便连接其他主机
    如果不做基于Key的验证就要在命令后面加上-k(输入对应的用户名指令)

    《Ansible学习笔记1》

    这里的口令是被控端主机的口令

    《Ansible学习笔记1》

    输入正确口令后,被控主机存活就会回复一个pong
    默认情况下ssh登录比较慢,如果有需要可以修改ssh配置文件
    [root@ansible ~]# vim /etc/ssh/sshd_config
    将UseDNS yes
    改成no
    GSSAPIAuthentication yes
    也改成no
    这里是给一个主机测试存活,如果是多个主机那么该输入谁的口令(口令不一样)?

    《Ansible学习笔记1》

    在这里输入的是node-1主机的口令,所以只能测试node-1主机不能去测试node-2主机
    而且发送的顺序也不一样,命令中是105在前106在后,而回复信息中是先发送的106最后是105。所以输口令这种方式只能适合所有主机一样的口令,那么主机口令不一样就要基于Key的验证来实现。
    接着上面的继续做,如果把node-2主机的口令修改成和node-1的口令一样,那么会成功吗?

    《Ansible学习笔记1》

    可以看到node-2还是错的,口令明明都一样了为什么还是错的呢?
    这是因为known_hosts文件只记住了第一次成功的主机口令

    《Ansible学习笔记1》

    可以看到这里没有node-2的口令
    那用ssh直接连接node-2呢?会不会成功?

    《Ansible学习笔记1》

    可以连,然后在用ping模块试一下呢?

    《Ansible学习笔记1》

    这回成功了。为什么呢?
    因为上次失败了就记住了这台主机是不可信的,所以在此用ansbile连接的时候还是报错不会再让你连接。所以只能手工ssh协议连接node-2让known_hosts文件记住node-2的正确口令

    《Ansible学习笔记1》

    所以最好的解决办法就是做基于key的验证,到后面在做这一步。
    如果想把所有的主机都控制,可以把主机IP地址改成all,all代表主机清单中的所有主机

    《Ansible学习笔记1》

    主机清单inventory:

  • /etc/ansbile/hosts文件格式
  • Inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中;此外,当如若目标主机使用非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来证明
  • [websrvs] //分组的名称 websrvs代表node-1这台主机
  • 192.168.32.105
  • [dbsrvs] //dbsrvs代表node-2这台主机
  • 192.168.32.106
  • [appsrvs]
  • 192.168.32.10[5:6] //这种就是代表105到106 多台同组主机可以这样使用
  • 这样就可以实现分组控制
    《Ansible学习笔记1》

    ansible配置文件:

    Ansible配置文件/etc/ansible/ansible.cfg(一般保持默认)
    [defaults]

some basic default values…

#inventory = /etc/ansible/hosts #主机清单配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = ~/.ansible/tmp #临时py命令文件存放在远程主机目录
#local_tmp = ~/.ansible/tmp #本机的临时命令执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #每次执行ansbile命令是否询问ssh密码
#ask_pass = True
#remote_port = 22 #远程主机端口号
#host_key_checking = False #检查对应服务器的host_key,建议取消注释
#log_path = /var/log/ansible.log #日志文件

Ansbile修改配置文件不需要重启服务生效。

Ansbile系列命令:

ansbile ansbile-doc ansbile-playbook ansbile-vault ansbile-console ansbile-galaxy ansbile-pull
ansbile-doc:显示模块帮助
ansbile-doc [options] [module]
-a          显示所有模块的文档
-l,--list       列出可用模块
-s,--snippet    显示指定模块playbook片段

示例:

ansbile-doc -l 列出所有模块
ansbile-doc ping 查看指定模块的帮助方法
ansbile-doc -s ping   查看指定模块的帮助方法
可以看下ansbile现在一共有多少个模块
[root@ansible ~]# ansible-doc -l | wc -l
1378
目前所用的版本一共有1378个模块,如果使用最新版本的话还会更多。

Ansbile命令参数详解:

Ansbile <host-parttern>主机清单 [-m module_name]模块名字 [-a args]模块参数
--version 显示版本
-m module 指定模块,默认为command一般不写
-v 详细过程-vv -vvv更详细
--list-hosts 显示主机列表,可简写-list
-k,--ask-pass 提示输入ssh连接密码,默认key验证
-K,--ask-become-pass 提示输入sudo时的口令
-C,--check 检查,并不执行
-T,--timeout=TIMEOUT 执行命令的超时时间,默认10s
-u,--user=REMOTE_USER 执行远程执行的用户
-b,--become 代替旧版的sudo切换

实例:列出全部的主机列表、websrcs和dbsrcs组的主机列表

《Ansible学习笔记1》

[root@ansible ~]# ansible websrvs -m ping -u test -k
以test用户进行远程连接
以test用户远程连接去查看/root目录,因为test没有权限所以报错了,那就要用到sudo

《Ansible学习笔记1》

[root@ansible ~]# ansible websrvs -a 'ls /root' -u test -k -b -K
这里要输入test的口令和sudo root的口令
![](https://s1.51cto.com/images/blog/201909/19/71f00e6afbe996a0eac92eb4d2a12a43.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
报错:因为在105主机上没有做过sudo授权
下面进行sudo授权
[root@node-1 ~]# visudo 
#%wheel  ALL=(ALL)       ALL
将注释去掉
[root@node-1 ~]# usermod -aG wheel test
将test加到组
做完授权之后再试一次
![](https://s1.51cto.com/images/blog/201909/19/90ac6a685e62143eb21d9dac6577f705.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
成功执行。
如果sudo时不想输入口令
#%wheel  ALL=(ALL)       ALL
%wheel ALL=(ALL)       NOPASSWD: ALL
上面的加上注释,下面的去掉注释
![](https://s1.51cto.com/images/blog/201909/19/2a38cf4c1232c7f93d071e6107bea045.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
这时候把-K去掉就可以不用输入sudo口令也可以成功执行
开始做基于Key的验证
![](https://s1.51cto.com/images/blog/201909/19/08ce26b384cc53717a68533aa4d9b368.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
![](https://s1.51cto.com/images/blog/201909/19/2cf8312fbf3d13c9bcaa0c25a1c80b96.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
这样就做完了,下面再用ansbile命令就不用再加-k了
![](https://s1.51cto.com/images/blog/201909/19/f9f50a2e172d1fe236a212f827fe1cfb.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

Ansbile的Host-pattern:

匹配主机的列表:

All:表示所有主机清单中的所有主机
ansbile all -m ping
*:通配符
ansible “*” -m ping
ansbile 192.168.32.* -m ping
ansbile “*srvs” -m ping
或关系:
ansible “websrvs:appsrvs” -m ping
ansbile “192.168.32.105:192.168.32.106” -m ping
逻辑与:
ansbile “websrvs:&dbsrvs” -m ping
在websrvs组并且在dbsrvs组中的主机
逻辑非:
ansbile ‘websrvs:!dbsrvs’ -m ping
在websrvs组,但不在dbsrvs组中的主机
注意:此处为单引号
综合逻辑:
ansbile ‘websrvs:dbsrvs:&appsrvs:!ftpsvs’ -m ping
正则表达式:
ansbile “websrvs:&dbsrvs” -m ping
ansbile “~(web|db)srv” -m ping  

Ansbile常用模块:

* Command:在远程主机执行命令,默认模块
* 此命令不支持$VARNAME < > | ; & 等,用shell模块实现
* Shell:和command相似,commadn可以用的shell可以用,command不可以用shell也可以用
* Scrpit:运行脚本
* Ansbile websrvs -m script -a f1.sh
* Copy:从服务器复制文件到客户端
* ansible all -m copy -a ‘content=’test contenet\n’ dest=/tmp/f1.txt’ 利用内容,直接生成目标文件
* ansbile all -m copy -a ‘src=/root/f1.sh dest=/tmp/f2.sh owner=test mode=500 backup=yes’
* 如果目标存在,默认覆盖,此处指定先备份backup=yes
* Fetch:从客户端读取文件到服务器端,与copy相反,因为只能读取单个文件,如果是多个文件或目录的话,需要先tar打包一下在读取到服务器端。
* File:设置文件属性
* ansible all -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link’
* ansible all -m file -a “path=/root/a.sh owner-test mode=755”

实例:修改selinux状态:

《Ansible学习笔记1》

这里要修改node-1节点的selinux状态
先在ansbile节点修改selinux配置文件
SELINUX=disable
[root@ansible ~]# cp /etc/selinux/config .
将配置文件copy到 根目录
然后用ansbile的copy模块将config配置文件copy到被控主机
![](https://s1.51cto.com/images/blog/201909/19/606f9463dcd18b86fdb9c26fb7869655.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
因为106节点上我已经配置过selinux为disable了所有这里显示为绿色,而105节点没有修改过config所有这次是yellow色代表修改了配置文件。
然后查看一下有没有修改成功
![](https://s1.51cto.com/images/blog/201909/19/d36f381f84841922fe420b9fc876d25a.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
ansible all -m shell -a ‘reboot’ 重启主机
在执行重启命令后是红色的信息,但其实主机已经在重启了,所有这个算是ansbile的一个bug吧。
    原文作者:1035587908
    原文地址: https://blog.51cto.com/9103824/2439465
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞