本文共 6279 字,大约阅读时间需要 20 分钟。
Ansible是2013年推出的一款IT自动化和DevOps软件,目前由Redhat已签署Ansible收购协议。其是基于Python研发,糅合了很多老运维工具的优点实现了批量操作系统配置,批量程序的部署,批量运行命令等功能。
2、ansible可以实现:1)自动化部署APP2)自动化管理配置项3)自动化的持续交付4)自动化的(AWS)云服务管理3、为什么要选择ansible?1)活跃度(社区活跃度)2)学习成本3)使用成本4)编码语言5)性能6)使用是否广泛
ansible优点:
1)仅需ssh和python即可使用2)无需客户端ansible缺点:对于几千台、上万台机器的操作,还不清楚性能、效率情况如何,需要进一步了解。4、ansible特性1)模块化设计,调用特定的模块来完成特定任务2)基于python语言实现paramikoPyYAML (半结构化语言)jinja23)其模块支持JSON等标准输出格式,可采用任何编程语言重写4)部署简单5)主从模式工作6)支持自定义模块7)支持playbook8)易于使用9)支持多层部署10)支持异构IT环境机器准备:
1:ansible 192.168.1.10 管理机器2:web1 192.168.1.11 托管机器3:web2 192.168.1.12 托管机器4:db1 192.168.1.21 托管机器5:db2 192.168.1.22 托管机器6:cache 192.168.1.33 托管机器管理机器:
要求python2.6或python2.7需要安装ansible使用模块:paramikoPyYAMLJinja2httplib2six托管机器:Ansible默认通过 SSH 协议管理机器被管理主机要开启 ssh 服务,允许 ansible 主机登彔在托管节点上也需要安装 Python 2.5 或以上的版本如果托管节点上开启了SElinux,需要安装libselinux-python1、在ansible管理机器上配置yum源2、安装ansible]#yum -y install ansible3、安装完成查看版本信息]#ansible –version
ansible 的配置文件是 ansible.cfg
ansible.cfg 的查找顺序是1 ANSIBLE_CONFIG 变量定义的配置文件2 当前目录下的 ./ansible.cfg 文件3 前用户家目录下 ~/ansible.cfg 文件4 /etc/ansible/ansible.cfg 文件ansible.cfg 中 inventony 指定主机分组文件的路径和地址,默认分组文件 hosts
[组名称]主机名称或ip地址, 登陆用户名,密码、端口等信息
ansible [组名称] --list-hosts
将要连接的进程主机名与你想要设定的主机的别名不同的话,可通过此变量设置。
ssh端口号,如果不是默认的端口号,通过此变量设置。
默认的 ssh 用户名
ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)
sudo 密码(建议使用 --ask-sudo-pass)
sudo 命令路径(适用亍1.8及以上版本)
不主机的连接类型.比如:local, ssh 或者 paramiko。Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持ControlPersist, 来判断'ssh' 方式是否可行。
ssh 使用的私钥文件,适用亍有多个密钥,而你不想使用SSH 代理的情况
目标系统的shell类型.默认情况下,命令的执行使用 'sh'语法,可设置为 'csh' 或 'fish'。
目标主机的 python 路径.适用于的情况: 系统中有多个Python, 或者命令路径不是"/usr/bin/python”
[web]web[1:2][db]db1db2[app:children] # 指定子组webdb[app:vars]ansible_ssh_user="root"ansible_ssh_pass="123456"[other]cache ansible_ssh_user="root" ansible_ssh_pass="123456"
ansible 的inventony 文件可以是静态也可以是脚本(输出格式 json)
修改ansible.cfg ]#mkdir /var/myansible]#cd /var/myansible]#vim ansible.cfg[defaults]inventory = urscript
编写usrscript脚本
#!/bin/bashecho '{ "web" : ["web1", "web2"], "db" : ["db1", "db2"], "other" : ["cache"]}'
ansible 主机分组 -m 模块 -a '命令和参数'
– host-pattern 主机戒定义的分组– -M 指定模块路径– -m 使用模块,默认 command 模块– -a or --args 模块参数– -i inventory 文件路径,或可执行脚本– -k 使用交互式登录密码– -e 定义变量– -v 详细信息,-vvvv 开启 debug 模式]#ansible all –list-hosts
]#ansible all -m ping
]#ansible all -m command -a 'id' -k
]#ansible all -m authorized_key -a "user=root exclusive=true manage_dir=true key='$(< /root/.ssh/id_rsa.pub)'" -k
注意:
报错:"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."解决方法:修改ansible.cfghost_key_checking = False
模块的手册,相当于shell的man ansible-doc -l //列出所有模块 ansible-doc 模块名 //查看帮助
测试网络连通性,ping模块没有参数(测试ssh的连通性)
默认模块,远程执行命令没有启用 shell ,所有shell 相关特性命令无法使用,例如 < > | & raw 模块,没有 chdir create remove 等参数,能执行大部分操作 shell 模块,启动 /bin/sh 运行命令,可以执行所有操作 用法:ansible 主机分组 -m command -a '命令和参数' 测试: ansible cache -m command -a 'chdir=/tmp touch f1' 创建成功 ansible cache -m shell -a 'chdir=/tmp touch f2' 创建成功 ansible cache -m raw -a 'chdir=/tmp touch f3' 文件可以创建,但无法切换目录,文件在用户家目录下生成。
shell 模块用法基本和command一样,区别是 shell模块是通过/bin/sh迚行执行命令,可以执行任意命令 raw模块,用法和shell 模块一样 ,可以执行任意命令 区别是 raw 没有chdir、creates、removes参数
处理复杂操作,编写脚本 测试: #!/bin/bash id zhang3 if [ $? != 0 ];then useradd li4 echo 123456 |passwd --stdin li4 fi ansible all -m scriopt -a "urscriopt.sh"
复制文件到进程主机– src:要复制到进程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/"来结尾,则只复制目录里的内容,如果没有使用"/"来结尾,则包含目录在内的整个内容全部复制,类似于rsync– dest:必选项。进程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录– backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no– force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes 测试: 复制文件 ]#ansible cache -m copy -a 'src=/root/a.log dest=/root/a.log' 复制目录: ]#ansible cache -m copy -a 'src=urdir dest=/root/'
– 类似 sed 的一种行编辑替换模块– path 目的文件– regexp 正则表达式– line 替换后的结果利用 lineinfile 修改 /etc/sysconfig/network-scriopts/ifcfg-eth0 ]#ansible cache -m lineinfile -a 'path=/etc/sysconfig/network-scripts/ifcfg-eth0 regexp="^ONBOOT" line="ONBOOT=\"no\""– 替换指定字符利用 replace 修改 /etc/sysconfig/network-scriopts/ifcfg-eth0 ]#ansible cache -m replace -a 'path=/etc/sysconfig/network-scripts/ifcfg-eth0 regexp="^(ONBOOT=).*" replace="\1\"yes\""'
– 使用yum包管理器来管理软件包– config_file:yum的配置文件– disable_gpg_check:关闭gpg_check– disablerepo:不启用某个源– enablerepo:启用某个源– name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径– state:状态(present,absent,latest)删除软件包]#ansible cache -m yum -a 'name=”lftp” state=”removed”'删除多个软件包]#ansible cache -m yum -a 'name=”lftp,lrzsz” state=”removed”'安装软件包]#ansible cache -m yum -a 'name=”lftp” '安装多个软件包]#ansible cache -m yum -a 'name=”lftp,lrzsz” '
– name:必选项,服务名称– enabled:是否开机启动 yes|no– sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟– state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)测试:]#ansible cache -m service -a ' name=”sshd” enabled=”yes” state=”started” '
– 主要用亍获取主机信息,在playbooks里经常会用到的一个参数gather_facts就不该模块相关。setup模块下经常使用的一个参数是filter参数。– filter 可以过滤到我们需要的信息]# ansible cache -m setup -a 'filter="ansible_os_family"'
安装apache,修改apache监听端口为8080,设置默认主页,启动服务,设置开机自启。
]#ansible web -m yum -a 'name=”httpd”']#ansible web -m lineinfile -a 'path=/etc/httpd/conf/httpd.conf regexp=”^Listen” line=”Listen 8080”']#ansible web -m shell -a 'echo this is test_web > /var/www/html/index.html']#ansible web -m service -a 'name=”httpd” state=”restarted” enabled=yes'
转载于:https://blog.51cto.com/11389430/2150751