仿阿里云网站,专门做进口产品的网站,北京金山办公软件股份有限公司官网,托管网站费用Ansible
1 Ansible概念
Ansible是一个基于Python开发的配置管理和应用部署工具#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点#xff0c;Pubbet和Saltstack能实现的功能#xff0c;Ansible基本上都可以实现。 Ansible能批量配置、部署、管理…Ansible
1 Ansible概念
Ansible是一个基于Python开发的配置管理和应用部署工具现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点Pubbet和Saltstack能实现的功能Ansible基本上都可以实现。 Ansible能批量配置、部署、管理上千台主机。比如以前需要切换到每个主机上执行的一或多个操作使用Ansible只需在固定的一台Ansible控制节点上去完成所有主机的操作。 Ansible是基于模块工作的它只是提供了一种运行框架它本身没有完成任务的能力真正执行操作的是Ansible的模块 比如copy模块用于拷贝文件到远程主机上service模块用于管理服务的启动、停止、重启等。 Ansible其中一个比较鲜明的特性是Agentless即无Agent的存在它就像普通命令一样并非C/S软件也只需在某个作为控制节点的主机上安装一次Ansible即可通常它基于ssh连接来控制远程主机远程主机上不需要安装Ansible或其它额外的服务。 使用者在使用时在服务器终端输入命令或者playbooks会通过预定好的规则将playbook拆解为play再组织成ansible可以识别的任务调用模块和插件根据主机清单通过SSH将临时文件发给远程的客户端执行并返回结果执行结束后自动删除 Ansible的另一个比较鲜明的特性是它的绝大多数模块都具备幂等性(idempotence)。所谓幂等性指的是多次操作或多次执行对系统资源的影响是一致的。比如执行 systemctl stop xxx 命令来停止服务当发现要停止的目标服务已经处于停止状态 它什么也不会做所以多次停止的结果仍然是停止不会改变结果它是幂等的而 systemctl restart xxx 是非幂等的。 Ansible的很多模块在执行时都会先判断目标节点是否要执行任务所以可以放心大胆地让Ansible去执行任务重复执行某个任务绝大多数时候不会产生任何副作用。
1.1 配置文件 /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性(一般无需修改) /etc/ansible/hosts 主机清单(将被管理的主机放到此文件) /etc/ansible/roles/ 存放角色的目录 2.2 程序 /usr/bin/ansible 主程序临时命令执行工具 /usr/bin/ansible-doc 查看配置文档模块功能查看工具 /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台 /usr/bin/ansible-playbook 定制自动化任务编排剧本工具 /usr/bin/ansible-pull 远程执行命令的工具 /usr/bin/ansible-vault 文件加密工具 /usr/bin/ansible-console 基于Console界面与用户交互的执行工具 1.3 主机清单 1 ansible的主要功用在于批量主机操作为了便捷地使用其中的部分主机可以在inventory file中将其分组命名 2 默认的inventory file为/etc/ansible/hosts 3 inventory file可以有多个且也可以通过Dynamic Inventory来动态生成 4可以在每个主机后面指定用户名密码ansible_ssh_user‘xxx’ ansible_ssh_pass‘password’ /etc/ansible/hosts文件格式 inventory文件遵循INI文件风格中括号中的字符为组名。 可以将同一个主机同时归并到多个不同的组中 此外当如若目标主机使用了非默认的SSH端口还可以在主机名称之后使用冒号加端口号来标明 主机清单定义方式
# vim /etc/ansible/hosts# [1] 自定义主机端口
[webservers] # 组名 自己设置
192.168.10.14:2222 #冒号后定义远程连接端口默认是 ssh 的 22 端口# [2] 定义 范围ip 地址
[webservers]
192.168.10.1[2:5]# [3] 定义 拥有相似的主机名
[dbservers]
db-[a:f].example.org #支持匹配 a~f
[dbservers] 是一个主机组的名称表示属于这个组的所有主机都是数据库服务器# 将会匹配所有主机名形如 db-a.example.org, db-b.example.org, ..., db-f.example.org 的数据库服务器即任何以 db- 开头紧接着是 a 到 f 之间任意字符最后以 .example.org 结尾的主机1.4 inventory 中的变量
# [1] 常见的变量参数
ansible_host ansible连接节点时的IP地址
ansible_port 连接对方的端口号ssh连接时默认为22
ansible_user 连接对方主机时使用的主机名。不指定时将使用执行ansible或ansible-playbook命令的用户
ansible_password 连接时的用户的ssh密码仅在未使用密钥对验证的情况下有效
ansible_ssh_private_key_file 指定密钥认证ssh连接时的私钥文件
ansible_ssh_common_args 提供给ssh、sftp、scp命令的额外参数
ansible_become 允许进行权限提升
ansible_become_method 指定提升权限的方式例如可使用sudo/su/runas等方式# [2] 主机变量
[webservers]
web01 ansible_host192.168.10.1
web02 ansible_host192.168.10.2
#wujj003 ansible_host11.0.1.137 ansible_port22 ansible_userroot ansible_passwordredhat# [3] 组变量
[webservers]
web01 ansible_host192.168.10.1
web02 ansible_host192.168.10.2[webservers:vars] #表示为 webservers 组内所有主机定义变量
ansible_userroot
ansible_passwordabc1234#[all:vars] #表示为所有组内的所有主机定义变量
#ansible_port22# [4] 组嵌套
[web]
192.168.10.20
192.168.10.21
192.168.10.22[databases]
192.168.10.3[0:3][webs:children] #表示为 webs 主机组中包含了 web 组和 databases 组内的所有主机
web
databases1.5 配置文件详解
Ansible 配置文件/etc/ansible/ansible.cfg 一般保持默认
vim /etc/ansible/ansible.cfg[defaults]
#inventory /etc/ansible/hosts # 主机列表配置文件
#library /usr/share/my_modules/ # 库文件存放目录
#remote_tmp $HOME/.ansible/tmp # 临时py命令文件存放在远程主机目录
#local_tmp $HOME/.ansible/tmp # 本机的临时命令执行目录
#forks 5 # 默认并发数,同时可以执行5次
#sudo_user root # 默认sudo 用户
#ask_sudo_pass True # 每次执行ansible命令是否询问ssh密码
#ask_pass True # 每次执行ansible命令是否询问ssh口令
#remote_port 22 # 远程主机的端口号(默认22)#建议优化项
host_key_checking False # 检查对应服务器的host_key建议取消注释
log_path/var/log/ansible.log # 日志文件,建议取消注释
module_name command # 默认模块2 Ansible基本使用介绍
2.1 帮助模块
ansible-doc -l 列出所有模块
ansible-doc ping 查看指定模块帮助用法
ansible-doc -s ping 查看指定模块帮助用法2.2 ansible命令使用 ansible [-m module_name] [-a args] ansible 被管理的主机(ALL) 模块 参数 --version 显示版本
-m module 指定模块默认为command
-v 详细过程 –vv -vvv更详细
--list-hosts 显示主机列表可简写 --list
-k, --ask-pass 提示输入ssh连接密码,默认Key验证
-C, --check 检查并不执行
-T, --timeoutTIMEOUT 执行命令的超时时间,默认10s
-u, --userREMOTE_USER 执行远程执行的用户
-b, --become 代替旧版的sudo切换--become-userUSERNAME 指定sudo的runas用户,默认为root
-K, --ask-become-pass 提示输入sudo时的口令
-i 指定主机清单2.3 基础用法
# 列出所有被控主机
ansible all --list
# 检测所有主机的网络状态
ansible all -m ping -uroot -k2.4 主机匹配语法
# All 表示所有Inventory中的所有主机
ansible all –m ping# * :通配符
ansible * -m ping (*表示所有主机)
ansible 15.15.23.* -m ping
ansible *web -m ping# 或关系 :
ansible websrvs:dbserver -m ping
ansible “192.168.1.10:192.168.1.20” -m ping# 逻辑与 :
ansible websrvs:dbserver –m ping
# 在websrvs组并且在dbserver组中的主机# 逻辑非 :!
ansible websrvs:!dbsrvs –m ping
# 在websrvs组但不在dbsrvs组中的主机
# 注意此处为单引号# 综合逻辑
ansible websrvs:dbsrvs:appsrvs:!ftpsrvs –m ping# 正则表达式
ansible websrvs:dbsrvs –m ping
ansible ~(web|db).*\.magedu\.com –m ping2.5 ansibel执行过程 ansible命令执行过程: [1] 加载自己的配置文件 默认/etc/ansible/ansible.cfg [2]加载自己对应的模块文件如command [3]通过ansible将模块或命令生成对应的临时py文件 [4]并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件 [5]给文件x执行 [6]执行并返回结果 [7]删除临时py文件sleep 0退出 2.6 ansibel执行状态 绿色执行成功并且不需要做改变的操作 黄色执行成功并且对目标主机做变更 红色执行失败 3 Ansible常用模块
3.1 小技巧
# 集成到一行显示-o
ansible db -m command -a ls / -o
# 指定一个hosts清单
ansible -i /opt/ansible_hosts webserver -m ping3.2 ping 模块
# ansible web -m ping[roottest tmp]# ansible webservers -m ping -uroot -k
SSH password:
wujj003 | SUCCESS {changed: false,ping: pong
}
# 这样就说明我们的主机是连通状态的。接下来的操作才可以正常进行。3.3 command 模块
Command在远程主机执行命令默认模块可忽略-m选项 chdir # 在执行命令之前先切换到该目录 executable # 切换shell来执行命令需要使用命令的绝对路径 free_form # 要执行的Linux指令一般使用ansible的-a参数代替。 creates # 一个文件名当这个文件存在则该命令不执行,可以用来做判断 removes # 一个文件名这个文件不存在则该命令不执行 ansible web -m command -a 命令
ansible web -m command -a chdir/data/ ls #先切换到/data/ 目录再执行“ls”命令
ansible web -m command -a chdir/data/ touch 1.txt #先切换到/data/ 目录再执行“touch”命令此命令不支持 $VARNAME | ; 等特殊符号,需要用shell模块实现
3.4 shell 模块
shell模块 和command模块相似,可以在远程主机上调用shell解释器运行命令支持shell的各种功能例如管道等。
ansible web -m shell -a cat /etc/passwd |grep root
# 查看SELINUX状态
ansible all -m shell -a getenforce
#提取IP地址
ansible test -m shell -a echo $(ifconfig ens160 | awk NR2 {print $2}) | cut -d -f2 -uroot -k
# 创建用户
ansible test -m shell -a useradd weihu1 -uroot -k
# 设置用户密码
ansible test -m shell -a echo Asdf3.15 | passwd --stdin weihu -uroot -k 3.5 COPYM模块
这个模块用于将文件复制到远程主机 src 被复制到远程主机的本地文件。可以是绝对路径也可以是相对路径。如果路径是一个目 录则会递归复制用法类似于rsync content 用于替换src可以直接指定文件的值 dest 必选项将源文件复制到的远程主机的绝对路径 backup 当文件内容发生改变后在覆盖之前把源文件备份备份文件包含时间信息 directory_mode 递归设定目录的权限默认为系统默认权限 force 当目标主机包含该文件但内容不同时设为 yes表示强制覆盖设为no表示目标主 机的目标位置不存在该文件才复制。默认为yes others 所有的 file 模块中的选项可以在这里使用 #复制文件
ansible web -m copy -a src需要拷贝的文件 dest目标位置
#指定定内容生成文件并指定权限
ansible web -m copy -a contentI am keer\n dest/data/name mode666
#修改内容并备份
ansible web -m copy -a contentI am keerya\n backupyes dest/data/name mode666
#如果目标存在默认覆盖此处指定先备份
ansible websrvs -m copy -a src/root/test1.sh dest/tmp/test2.shownerwang mode600 backupyes
3.6 fetch模块
从远程主机提取文件至主控端copy相反目前不支持目录,可以先打包,再提取文件 dest用来存放文件的目录 src在远程拉取的文件并且必须是一个文件不能是目录 # 会生成每个被管理主机不同编号的目录,不会发生文件名冲突
ansible websrvs -m fetch -a src/root/test.sh dest/data/scripts# 如果是目录可以用下面的方法
ansible all -m shell -a tar jxvf test.tar.gz /root/test.sh
ansible all -m fetch -a src/root/test.tar.gz dest/data/3.7 file模块
该模块主要用于设置文件的属性比如创建文件、创建链接文件、删除文件等 force #需要在两种情况下强制创建软链接一种是源文件不存在但之后会建立的情况下另一种是目标软链接已存在需要先取消之前的软链然后创建新的软链有两个选项yes|no group #定义文件/目录的属组。后面可以加上 mode定义文件/目录的权限 owner #定义文件/目录的属主。后面必须跟上 path定义文件/目录的路径 recurse #递归设置文件的属性只对目录有效后面跟上 src被链接的源文件路径只应用于statelink的情况 dest #被链接到的路径只应用于statelink的情况 state #状态有以下选项 directory如果目录不存在就创建目录 link创建软链接 hard创建硬链接 touch如果文件不存在则会创建一个新的文件如果文件或目录已存在则更新其最后修改时间 absent删除目录、文件或者取消链接文件 # 创建一个指定目录下的目录
ansible web -m file -a path/data/test statedirectory
# 创建一个文件 state指定是目录还是文件
ansible web -m file -a path/data/aaa statetouch
# 创建一个test的文件 指定所属用户组用户 指定权限 设置状态
ansible web -m file -a path/data/test groupweihu ownerweihu mode666statetouch
# 创建软链接文件
ansible websrvs -m file -a src/data/testfile dest/data/testfile-link statelink
# 删除文件
Ansible web -m file -a path/data/a stateabsent3.8 cron模块
该模块适用于管理cron计划任务的。其使用的语法跟我们的crontab文件中的语法一致 day #日应该运行的工作 hour # 小时 minute #分钟 month # 月 weekday # 周 job #指明运行的命令是什么 name #定时任务描述 reboot # 任务在重启时运行不建议使用建议使用special_time special_time #特殊的时间范围参数reboot重启时annually每年monthly每月weekly每周daily每天hourly每小时 state #指定状态present表示添加定时任务也是默认设置absent表示删除定时任务 user # 以哪个用户的身份执行 # 支持时间minute,hour,day,month,weekday
ansible websrvs -m cron -a minute*/5 job/usr/sbin/ntpdate 172.16.0.1 /dev/null nameSynctime # 创建任务
ansible websrvs -m cron -a stateabsent nameSynctime # 删除任务
ansible websrvs -m cron -a minute*/10 job/usr/sbin/ntpdate 172.30.0.100 namesynctime disabledyes
# 注释任务,不在生效3.9 yum模块
该模块主要用于软件的安装 name #所安装的包的名称 state #present—安装 latest—安装最新的, absent— 卸载软件。 update_cache #强制更新yum的缓存 conf_file #指定远程yum安装时所依赖的配置文件安装本地已有的包。 disable_gpg_check #是否禁止GPG checking只用于presentor latest。 disablerepo #临时禁止使用yum库。 只用于安装或更新时。 enablerepo #临时使用的yum库。只用于安装或更新时。 # 查看程序列表
ansible websrvs -m yum -a listhttpd
# 安装
ansible websrvs -m yum -a namehttpd statepresent
# 删除
ansible websrvs -m yum -a namehttpd stateabsent3.10 service模块
该模块用于服务程序的管理 arguments #命令行提供额外的参数。 enabled #设置开机启动。 name #服务名称。 runlevel #开机启动的级别一般不用指定。 sleep #在重启服务的过程中是否等待。如在服务关闭以后等待2秒再启动。(定义在剧本中。) state #有四种状态分别为started—启动服务 stopped—停止服务restarted—重启服务 reloaded—重载配置。 # 停止服务
ansible srv -m service -a namehttpd statestopped
# 启动服务,并设为开机自启
ansible srv -m service -a namehttpd statestarted enabledyes
# 重新加载
ansible srv -m service -a namehttpd statereloaded
# 重启服务
ansible srv -m service -a namehttpd staterestarted 3.11 user模块
该模块主要是用来管理用户账号。 comment # 用户的描述信息 createhome # 是否创建家目录 force # 在使用stateabsent时, 行为与userdel –force一致. group # 指定基本组 groups # 指定附加组如果指定为(groups)表示删除所有组 home # 指定用户家目录 move_home # 如果设置为home时, 试图将用户主目录移动到指定的目录 name # 指定用户名 non_unique # 该选项允许改变非唯一的用户ID值 password # 指定用户密码,对密码加密可以使用python的crypt和passlib remove # 在使用stateabsent时, 行为是与userdel –remove一致 shell # 指定默认shell state # 设置帐号状态不指定为创建指定值为absent表示删除 system # 当创建一个用户设置这个用户是系统用户。这个设置不能更改现有用户 uid # 指定用户的uid # 添加一个用户并指定其 uid
ansible websrvs -m user -a nameuser1 commenttest user uid2048 home/app/user1 grouproot
# 创建一个系统用户
ansible websrvs -m user -a namesysuser1 systemyes home/app/sysuser1
# 清空用户所有数据
ansible websrvs -m user -a nameuser1 stateabsent removeyes
# 创建用户
ansible websrvs -m user -a nameapp uid88 systemyes home/app groupsroot shell/sbin/nologin password$1$zfVojmPy$ZILcvxnXljvTI2PhP2Iqv1
# 删除用户,不会删除家目录
ansible websrvs -m user -a nameapp stateabsent
# 创建用户指定密码需要加密可以用这个语句对密码加密
echo 密码 | openssl passwd -1 stdin3.12 script 模块
该模块用于将本机的脚本在被管理端的机器上运行。该模块直接指定脚本的路径即可
# 首先在Ansible上有一个脚本并给其加上执行权限
chmod x test.sh
# 实现在被管理端执行该脚本
ansible web -m script -a 脚本路径3.13 unarchive模块 unarchive解包解压缩有两种用法 1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录设置copyyes. 2、将远程主机上的某个压缩包解压缩到指定路径下设置copyno 常见参数 copy默认为yes当copyyes拷贝的文件是从ansible主机复制到远程主机上如果设置为 copyno会在远程主机上寻找src源文件 src 源路径可以是ansible主机上的路径也可以是远程主机上的路径如果是远程主机上的路径则需要设置copyno dest远程主机上的目标路径 mode设置解压缩后的文件权限 ansible websrvs -m unarchive -a srcfoo.tgz dest/var/lib/foo
#默认copy为yes ,将本机目录文件解压到目标主机对应目录下
ansible websrvs -m unarchive -a src/tmp/foo.zip dest/data copyno mode0777
# 解压被管理主机的foo.zip到data目录下, 并设置权限777
ansible websrvs -m unarchive -a srchttps://example.com/example.zip dest/data copyno4 Playbook 剧本
4.1 playbooks 组成
1Tasks任务即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 2Variables变量 3Templates模板 4Handlers处理器当changed状态条件满足时notify触发执行的操作 5Roles角色
4.2 yaml示例
--- #yaml文件以---开头以表明这是一个yaml文件可省略
- name: first play #定义一个play的名称可省略gather_facts: false #设置不进行facts信息收集这可以加快执行速度可省略hosts: webservers #指定要执行任务的被管理主机组如多个主机组用冒号分隔remote_user: root #指定被管理主机上执行任务的用户tasks: #定义任务列表任务列表中的各任务按次序逐个在hosts中指定的主机上执行- name: test connection #自定义任务名称ping: #使用 module: [options] 格式来定义一个任务- name: disable selinuxcommand: /sbin/setenforce 0 #command模块和shell模块无需使用keyvalue格式ignore_errors: True #如执行命令的返回值不为0就会报错tasks停止可使用ignore_errors忽略失败的任务- name: disable firewalldservice: namefirewalld statestopped #使用 module: options 格式来定义任务option使用keyvalue格式- name: install httpdyum: namehttpd statelatest- name: install configuration file for httpdcopy: src/opt/httpd.conf dest/etc/httpd/conf/httpd.conf #这里需要一个事先准备好的/opt/httpd.conf文件notify: restart httpd #如以上操作后为changed的状态时会通过notify指定的名称触发对应名称的handlers操作- name: start httpd serviceservice: enabledtrue namehttpd statestartedhandlers: #handlers中定义的就是任务此处handlers中的任务使用的是service模块- name: restart httpd #notify和handlers中任务的名称必须一致service: namehttpd staterestarted
##Ansible在执行完某个任务之后并不会立即去执行对应的handler而是在当前play中所有普通任务都执行完后再去执行handler这样的好处是可以多次触发notify但最后只执行一次对应的handler从而避免多次重启。注意: 如果 开启 这个 gather_facts: false 会加快速度但是也 会导致识别不了 变量
4.3 深入理解 Handlers 与notify
notify 的概念 notify 可以理解为一个信号或触发器。当你在一个任务task中使用 notify你实际上是告诉Ansible“如果这个任务导致某些事情发生了改变请记住在所有常规任务执行完毕后执行我指定的处理程序handler”。
handlers 的概念 handlers 类似于常规任务tasks但它们默认不会自动执行而是等待被 notify 从其他任务触发。你可以把 handlers 看作是“按需执行”的特殊任务列表通常用于执行诸如服务重启、日志旋转等操作这些操作通常不需要频繁执行只在某些条件满足时才
执行流程: Ansible首先执行所有的常规任务。 如果任何任务通过 notify 触发了handlerAnsible会记录下来但不立即执行。 所有任务执行完毕后Ansible检查是否有handler被通知执行如果有则按照它们在 handlers 部分定义的顺序依次执行。
意义 这样即使有多个任务影响到服务需要重启服务也只会被重启一次且是在所有相关配置变更都完成之后提高了效率并减少了不必要的服务中断次数。这就是 notify 和 handlers 最直观且常用的一个场景
4.4 运行playbook 指令介绍
ansible-playbook XXX.yaml -u 远程用户 -k #用来交互输入ssh密码--become-user sudo切换的用户 -K #用来交互输入sudo密码--syntax-check #检查yaml文件的语法是否正确--list-task #检查tasks任务--list-hosts #检查生效的主机--start-at-task任务名 #指定从某个task开始运行-e 变量值 #在命令行里定义变量