qidao123.com ToB IT社区-企服评测·应用市场

 找回密码
 立即注册

ansible自动化入门根本

[复制链接]
发表于 4 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、ansible先容

Ansible是一款自动化运维工具,基于Python开发,聚集了浩繁运维工具(puppet、cfengine、chef、func、fabric)的长处,实现了批量体系设置、批量步调摆设、批量运行下令等功能
Ansible 具有多个紧张的长处:
跨平台支持:Ansible 提供Linux、Windows、UNIX和网络装备的无署理支持,实用于物理、捏造、云和容器情况。
人类可读的自动化:Ansible Playbook接纳YAML文本文件编写,易于阅读,有助于确保全部人都能明白它们的用途。
完善形貌应用:可以通过 Ansible Playbook举行每种更改,并形貌和记录应用情况的每一个方面。
轻松管理版本控制:Ansible Playbook和项目是纯文本。它们可以视作源代码,放在现有版本控制体系中。
支持动态清单:可以从外部泉源动态更新 Ansible 管理的盘算机列表,随时获取全部受管服务器的当前准确列表,不受根本架构或位置的影响。
编排可与其他体系轻松集成:可以大概利用情况中现有的 HP SA、Puppet、Jenkins、红帽卫星和其他体系,而且集成到 Ansible 工作流中。
二、Ad-Hoc模式

Ad-Hoc下令是ansible提供的一种快速实验简单使命的下令行工具,它允许用户在不编写完备playbook的情况下直接实验单条下令,
根本语法
  1. ansible <host-pattern> -m <module-name> -a '<module-aguments>'[options]
复制代码
host-pattern:指定目的主机或主机组(如:all、webservers、192.168.1.*)
模块 -m:指定要利用的ansible模块
模块参数 -a:通报给模块的参数
选项全称作用示例-i --inventory指定自界说Inventory文件-i /etc/ansible/my_hosts.ini-m --module-name指定要利用的模块(command、shell、copy等)-m shell-a ''--args通报给模块的参数-a 'ls -l /tmp'-u --user指定ssh毗连用户-u root-k--ask-pass提示输入ssh暗码(默认暗码认证失败时利用)-k-b--become利用特权升级(如:sudo)-b-K--ask-become-pass提示输入特权暗码(如sudo暗码)-K--become-user=-指定特权升级的目的用户(需共同-b)--become-user=pastgres-f --forks设置并实验的主机数(默认5)-f 10-l -- limit限定实验的主机范围(支持通配符)-l 'web*'-v /-vv /-vvv--verbose输出具体日志日志,-vv--list-hosts-仅列出匹配的主机,不实验下令--list-hosts--check-模拟实验(Dry Run)不现实修改体系--check--diff-体现文件变动的差别(常用于copy / template模块)--diff-e ''--extra-vars设置额外变量(支持JSON / YAML格式)-e "user=admin"-o--one-line简化输入为单行格式-o-B --background背景异步实验使命(需共同-P轮询)-B 3600 -P 60-t --tree将输出结果生存为指定目次(按主机名分文件)-t /tmp/ansible-logs示例:
  1. ansible all -m yum -a "name=vim-enhanced state=present"
  2. # name:包的名称
  3. # state=present:表示安装
  4. &&
  5. yum install -y vim
复制代码
ansible下令中的-m yum等同于shell下令中的yum下令
ansible下令中的-a state=present等同于shell下令中的install
ansible下令中的-a name=vim-enhanced等同于shell下令中的vim
ansible主机清单(静态)

主机清单(Inventory)是ansible的核心设置文件,用于界说管理哪些主机以及怎样分组。一个主机可以附属于多个差别的组。
默认主机清单文件路径:/etc/ansible/hosts (有/etc/ansible/ansible.cfg界说)或通过-i指定自界说文件。
主机清单根本规则:

  • 主机组以[header]开头,这是主机组的名称
  • 可以利用主机名/域名大概IP地点标识目的主机
  • 没有分组的主机须要在全部的主机组之前界说
默认组
纵然主机清单中没有界说任何组,ansible也会创建两个默认组:
all:该默认组包罗全部主机
ungrouped:该组包罗单独的主机
  1. 192.168.1.100
  2. [webservers]
  3. 192.168.1.101
  4. 192.168.1.102
  5. [dbservers]
  6. 192.168.1.103
  7. 192.168.1.104
复制代码
嵌套组(父子组)
在ansible中,可以通过父子组(嵌套组)对主机举行分层管理,实现变量继承和批量利用。嵌套组可以嵌套许多个层级。
父组的变量会自动通报到子组,而子组可以覆盖父组的变量(优先级最高)。
在主机清单文件中,用:children界说父组,用平凡组名作为子组
  1. [webservers]
  2. 192.168.1.100
  3. 192.168.1.101
  4. [dbservers]
  5. 192.168.1.102
  6. 192.168.1.103
  7. [production:children]
  8. webservers
  9. dbservers
复制代码
查察当前组的嵌套关系:
  1. ansible-inventory --graph
  2. @all:
  3.         |--@production:
  4.         |  |--@webservers:
  5.         |  |  |--192.168.1.100
  6.         |  |  |--192.168.1.101
  7.         |  |--@dbservers:
  8.         |  |  |--192.168.1.102
  9.         |  |  |--192.168.1.103
  10.         |  |--@ungrouped:
复制代码
界说主机范围
在主机清单中可以通过数字范围、字母范围、通配符批量界说主机,克制逐个列出IP/主机名。

  • 数字范围(实用于IP或有序列主机名)
    1. 语法:
    2. [组名]
    3. 主机名前缀[开始:结束:步长]                # 步长可省略(默认为1)
    4. [webservers]
    5. 192.168.1.[10:11]
    6. [dbservers]
    7. 192.168.1.[12:14]
    复制代码
  • 字母范围(实用于有序主机名)
    1. [logservers]
    2. log-[a:d]
    复制代码
  • 通配符匹配(暗昧匹配主机名)
    1. [allservers]
    2. *.example.com                # 匹配所有以.example.com        结尾的主机
    复制代码
三、ansible模块

ansible-doc下令
  1. # 列出所有的ansible支持的模块
  2. ansible-doc -l | grep command
  3. # 查看某个模块的具体用法参数
  4. ansible-doc -s command
复制代码
command模块

command模块是ansible的默认模块,可以省略不写。

  • 利用command模块,不得出现shell变量$name也不得出现特殊符号> < | ; &等。
作用:在长途节点上实验一个下令
参数阐明chdir在实验之前,先通过cd进入该参数指定的目次creates在创建一个文件之前,判断该文件是否存在,如果存在则跳过前面的下令,如果不存在则实验前面的下令free_form该参数可以输入任何的体系下令,实现长途实验和管理removes界说一个文件是否存在,如果存在则实验前面的下令,如果不存在则跳过1获取全部被管理呆板的负载信息
  1. ansible all -m command -a "uptime"
复制代码
2让客户端呆板,先切换到/tmp目次下,然后打印当前的工作目次
  1. ansible all -m command -a "pwd chdir=/tmp"
复制代码
3creates判断/opt文件夹是否存在,存在则不实验前面的pwd下令,不存在则实验
  1. ansible all -m command -a "pwd creates=/opt"
复制代码
4removes存在则实验,不存在则跳过
  1. ansible all -m command -a "ls -l removes=/opt"
复制代码
shell模块

在长途呆板上实验下令(复杂的下令)
参数阐明chdir在实验之前,先通过cd进入该参数指定的目次creates界说一个文件是否存在,如果存在则跳过下令,如果不存在则实验下令free_form该参数可以输入任何的体系下令,实现长途实验和管理removes界说一个文件是否存在,如果存在则实验前面的下令,如果不存在则跳过批量查询进程信息
  1. ansible all -m shell -a "ps -ef | grep vim | grep -v grep"
复制代码
批量在客户端呆板创建写入文件信息
  1. ansible all -m shell -a "echo hello > /tmp/hello.txt"
复制代码
script模块

比起shell模块,script模块功能更强大,在管理呆板上有一个脚本文件,就可以在全部被管理节点上去运行
  1. [root@ansible ~]# ll /etc/ansible/scripts/
  2. 总用量 4
  3. -rw-r--r--. 1 root root 61 9月   8 18:59 a.sh
  4. [root@ansible ~]# ansible 172.16.103.129 -m script -a '/etc/ansible/scripts/a.sh &>/tmp/a'
  5. 172.16.103.129 | SUCCESS => {
  6.     "changed": true,
  7.     "rc": 0,
  8.     "stderr": "Shared connection to 172.16.103.129 closed.\r\n",
  9.     "stderr_lines": [
  10.         "Shared connection to 172.16.103.129 closed."
  11.     ],
  12.     "stdout": "",
  13.     "stdout_lines": []
  14. }
复制代码
file 模块

file模块是ansible中用于管理文件和目次的核心模块,可以创建文件、目次、符号链接、设置权限和属性等。
参数阐明示例path文件/目次路径(别名:dest,name)path: /etc/foo.confstate状态:file,dirctory,link,hard,touch,absentstate: directorymode权限(如0644)mode: '0644'owner文件全部者owner:rootgroup文件所属组group: www-datarecurse递归设置目次权限recurse: yessrc链接的源文件(当state=link或hard时)src: /etc/foo.confforce欺压创建链接(当目的存在时)force: yes
touch:创建文件、更新时间戳
file:修改文件属性
示例:
1创建目次
  1. ansible all -m file -a "path=/opt/dir state=directory"
复制代码
2创建文件
  1. ansible all -m file -a "path=/opt/dir/file1.txt state=touch"
复制代码
3创建符号链接
  1. ansible all -m file -a "src=/etc/hosts dest=/opt/dir/hosts_link state=link"
复制代码
4删除文件或目次
  1. # 删除目录
  2. ansible all -m file -a "path=/opt/dir state=absent"
  3. # 删除文件
  4. ansible all -m file -a "path=/opt/dir/file1.txt state=absent"
复制代码
5修改文件属性
  1. # 修改文件权限
  2. ansible all -m file -a "path=/opt/dir/file1.txt mode=0640 owner=root group=root"
  3. # 递归修改目录权限
  4. ansible all -m file -a "path=/opt/dir mode=0640 owner=root group=root recurse=yes"
复制代码
user 模块

ansible的user模块用于管理体系用户账户,包罗创建,修改和删除用户,以及管理用户属性如暗码,组,家目次等。
参数阐明示例name用户名(必须)name: testuserstate用户状态:present(存在)absent(不存在)state: presentuid用户UIDuid:1001group用户主组group:developersgroups用户附加组列表groups: wheel,devopshome用户家目次路径home: /home/testusershell用户默认shellshell: /bin/bashcomment用户形貌信息comment: "Test user"password用户暗码(加密后的)password: $!@3123generate_ssh_key是否天生SSH密钥generate_ssh_key: yesssh_key_typeSSH密钥范例ssh_key_type: rsassh_key_fileSSH密钥文件路径ssh_key_file: .ssh/id_rsasystem是否为体系用户system:yescreate_home是否创建加目次create_home: no示例
创建用户
  1. ansible all -m user -a "name=testuser state=present shell=/sbin/nologin group=test groups=test1 home=/home/test create_home=yes"
复制代码
删除用户
  1. ansible all -m user -a "name=testuser state=absent remove=yes"
复制代码
group 模块

group模块是ansible中用于管理体系用户组的核心模块,可以创建,修改和删除组
参数阐明示例name组名(必须)developersstate组状态:present/absentpresentgid指定组GID1001system是否为体系组yes示例:
创建根本用户组
  1. ansible all -m group -a "name=developers"
复制代码
创建指定GID的组
  1. ansible all -m group -a "name=deploy gid=1042"
复制代码
创建体系组
  1. ansible all -m group -a "name=dbadmin system=yes"
复制代码
删除组
  1. ansible all -m group -a "name-legacy state=absent"
复制代码
修改组GID
  1. ansible all -m group -a "name=appusers gid=1500"
复制代码
yum 模块

yum模块是ansible中用于管理RHEL/CentOS/Fedora/openEuler等基于PRM的Linux体系中软件包的核心模块
参数阐明示例name包名httpdstate状态:present/latest/absentlatestenablerepo临时启用堆栈epeldisablerepo临时禁用堆栈updatesexclude扫除的包kernelupdate_cache更新元数据缓存yeslist列出包(不实验利用)httpdsecurity仅安全更新yesdownload_only仅下载不安装yes示例:
安装单个软件包
  1. ansible all -m yum -a "name=httpd state=present"
复制代码
安装最新版本
  1. ansible all -m yum -a "name=nginx state=latest"
复制代码
安装多个软件包
  1. ansible all -m yum -a "name={'vim-enhanced','git',tmux} state=present"
复制代码
删除软件
  1. ansible all -m yum -a "name=telnet state=absent"
复制代码
利用特定堆栈安装
  1. ansible all -m yum -a "name=htop enablerepo=epel state=present"
复制代码
更新全部软件包
  1. ansible all -m yum -a "name=* state=latest"
复制代码
安全更新
  1. ansible all -m yum -a "security=yes state=latest"
复制代码
安装包组
  1. ansible all -m yum -a "name='@development' state=present"
复制代码
下载但不安装
  1. ansible all -m yum -a "name=ansible download=yes"
复制代码
利用URL安装RPM
  1. ansible all -m yum -a "name=htps://***.rpm state=present" -b
复制代码
扫除特定包更新
  1. ansible all -m yum -a "name=* state=latest exclude=kernel"
复制代码
清算yum缓存
  1. ansible all -m yum -a "clean=all"
复制代码
列出可用更新
  1. ansible all -m yum -a "list=updates"
复制代码
查抄包是否安装
  1. ansible all -m yum 0-a "list=httpd"
复制代码
copy 模块

copy模块是ansible中用于文件传输的核心模块,可以将当地文件复制到长途文件,或直接在长途主机上创建文件
参数阐明示例src源文件路径(当地)/tmp/file.confdest目的路径(长途)/etc/file.confcontent直接写入的内容"hello world"owner文件全部者rootgroup文件所属组wheelmode文件权限0644backup是否备份原文件yesforce是否欺压覆盖novalidate更新前验证下令"/usr/sbin/apachectl -t % s"示例:
1根本文件复制
  1. ansible webservers -m copy -a "src=/tmp/app.conf dest=/etc/app.conf"
复制代码
2设置文件和全部者
  1. ansible all -m copy -a "src=/tmp/script.sh dest=/usr/local/bin/script.sh owner=root group=root"
复制代码
3直接创建文件内容
  1. ansible all -m copy -a "content='DB_HOST=127.0.0.1' dest=/etc/db.conf "
复制代码
4复制并备份源文件
  1. ansible all -m copy -a "src=/tmp/nginx.conf dest=/etc/nginx/nginx.conf backup=yes"
复制代码
5在单个主机上复制文件
  1. ansible hostA -m copy -a "src=/path/to/source dest=/path/to/dest remote_src=yes"
复制代码
6验证下令
  1. # 检查文件是否存在
  2. ansible all -m shell -a "ls -l /etc/app.conf" -b
  3. # 检查文件内容
  4. ansible all -m shell -a "cat /etc/motd" -b
  5. # 检查备份文件
  6. ansible all -m shell -a "ls -l /etc/nginx/nginx.conf.*" -b
复制代码
service模块
  1. name参数:此参数用于指定需要操作的服务名称,比如 nginx
  2. state参数:此参数用于指定服务的状态,比如,我们想要启动远程主机中的 nginx,则可以将 state 的值设置为 started;如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有 started、stopped、restarted、reloaded
  3. enabled参数:此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动
复制代码
  1. //启动受控机上的vsftpd服务
  2. [root@ansible ~]# ansible webservers -m service -a 'name=vsftpd state=started'
  3. 172.16.103.129 | SUCCESS => {
  4.     "changed": true,
  5.     "name": "vsftpd",
  6.     "state": "started",
  7.     "status": {
  8.         "ActiveEnterTimestampMonotonic": "0",
  9.         ....此处省略N行
  10. }
  11. //设置受控机上的vsftpd服务开机自动启动
  12. [root@ansible ~]# ansible webservers -m service -a 'name=vsftpd enabled=yes'
  13. 172.16.103.129 | SUCCESS => {
  14.     "changed": true,
  15.     "enabled": true,
  16.     "name": "vsftpd",
  17.     "status": {
  18.         "ActiveEnterTimestamp": "六 2018-09-08 00:02:39 EDT",
  19.         ....此处省略N行
  20. }
  21. //停止受控机上的vsftpd服务
  22. [root@ansible ~]# ansible 172.16.103.129 -m service -a 'name=vsftpd state=stopped'
  23. 172.16.103.129 | SUCCESS => {
  24.     "changed": true,
  25.     "name": "vsftpd",
  26.     "state": "stopped",
  27.     "status": {
  28.         "ActiveEnterTimestamp": "六 2018-09-08 00:02:39 EDT",
  29.         ....此处省略N行
  30. }
复制代码
四、playbook模式

ansible的playbook模式是针对比力具体且比力大的使命,应用场景:

  • 一键摆设rsync备份服务器
  • 一键摆设lnmp情况
  1. #此工具用于执行编写好的 playbook 任务
  2. #示例
  3. ansible-playbook hello.yml
  4. cat hello.yml
  5. ---
  6. #hello world yml file
  7. - hosts: websrvs
  8. remote_user: root
  9. gather_facts: no
  10.   
  11. tasks:
  12.     - name: hello world
  13.       command: /usr/bin/wall hello world
复制代码
Playbook与ad-hoc相比,是一种完全差别的运用ansible的方式,类似与saltstack的state状态文件。ad-hoc无法恒久利用,playbook可以恒久利用。
playbook是由一个或多个play构成的列表,play的紧张功能在于将事先归并为一组的主机装扮成事先通过ansible中的task界说好的脚色。从根本上来讲,所谓的task无非是调用ansible的一个module。将多个play构造在一个playbook中,即可以让它们连合起来按事先编排的机制完成某一使命
1、playbook核心元素
  1. Hosts 执行的远程主机列表
  2. Tasks 任务集
  3. Varniables 内置变量或自定义变量在playbook中调用
  4. Templates 模板,即使用模板语法的文件,比如配置文件等
  5. Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
  6. tags 标签,指定某条任务执行,用于选择运行playbook中的部分代码。
复制代码
2、playbook语法

playbook利用yaml语法格式,后缀可以是yaml,也可以是yml。

  • 在单逐一个playbook文件中,可以连续三个连子号(---)区分多个play。另有选择性的连续三个点好(...)用来体现play的末了,也可省略。
  • 次行开始正常写playbook的内容,一样平常都会写上形貌该playbook的功能。
  • 利用#号解释代码。
  • 缩进必须同一,不能空格和tab混用。
  • 缩进的级别也必须是划一的,同样的缩进代表同样的级别,步调鉴别设置的级别是通过缩进联合换行实现的。
  • YAML文件内容和Linux体系巨细写判断方式保持划一,是区分巨细写的,k/v的值均需巨细写敏感
  • k/v的值可偕行写也可以换行写。同利用用:分隔。
  • v可以是个字符串,也可以是一个列表
  • 一个完备的代码块功能须要最少元素包罗 name: task
  1. # 创建playbook文件
  2. [root@ansible ~]# cat playbook01.yml
  3. ---                       #固定格式
  4. - hosts: 192.168.1.31     #定义需要执行主机
  5.   remote_user: root       #远程用户
  6.   vars:                   #定义变量
  7.     http_port: 8088       #变量
  8.   tasks:                             #定义一个任务的开始
  9.     - name: create new file          #定义任务的名称
  10.       file: name=/tmp/playtest.txt state=touch   #调用模块,具体要做的事情
  11.     - name: create new user
  12.       user: name=test02 system=yes shell=/sbin/nologin
  13.     - name: install package
  14.       yum: name=httpd
  15.     - name: config httpd
  16.       template: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
  17.       notify:                 #定义执行一个动作(action)让handlers来引用执行,与handlers配合使用
  18.         - restart apache      #notify要执行的动作,这里必须与handlers中的name定义内容一致
  19.     - name: copy index.html
  20.       copy: src=/var/www/html/index.html dest=/var/www/html/index.html
  21.     - name: start httpd
  22.       service: name=httpd state=started
  23.   handlers:                                    #处理器:更加tasks中notify定义的action触发执行相应的处理动作
  24.     - name: restart apache                     #要与notify定义的内容相同
  25.       service: name=httpd state=restarted      #触发要执行的动作
  26. #测试页面准备
  27. [root@ansible ~]# echo "<h1>playbook test file</h1>" >>/var/www/html/index.html
  28. #配置文件准备
  29. [root@ansible ~]# cat httpd.conf |grep ^Listen
  30. Listen {{ http_port }}
  31. #执行playbook, 第一次执行可以加-C选项,检查写的playbook是否ok
  32. [root@ansible ~]# ansible-playbook playbook01.yml
  33. PLAY [192.168.1.31] *********************************************************************************************
  34. TASK [Gathering Facts] ******************************************************************************************
  35. ok: [192.168.1.31]
  36. TASK [create new file] ******************************************************************************************
  37. changed: [192.168.1.31]
  38. TASK [create new user] ******************************************************************************************
  39. changed: [192.168.1.31]
  40. TASK [install package] ******************************************************************************************
  41. changed: [192.168.1.31]
  42. TASK [config httpd] *********************************************************************************************
  43. changed: [192.168.1.31]
  44. TASK [copy index.html] ******************************************************************************************
  45. changed: [192.168.1.31]
  46. TASK [start httpd] **********************************************************************************************
  47. changed: [192.168.1.31]
  48. PLAY RECAP ******************************************************************************************************
  49. 192.168.1.31               : ok=7    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  50. # 验证上面playbook执行的结果
  51. [root@ansible ~]# ansible 192.168.1.31 -m shell -a 'ls /tmp/playtest.txt && id test02'
  52. 192.168.1.31 | CHANGED | rc=0 >>
  53. /tmp/playtest.txt
  54. uid=990(test02) gid=985(test02) 组=985(test02)
  55. [root@ansible ~]# curl 192.168.1.31:8088
  56. <h1>playbook test file</h1>
复制代码
3、playbook运行方式
  1. [root@ansible PlayBook]# ansible-playbook -h
  2. #ansible-playbook常用选项:
  3. --check  or -C    #只检测可能会发生的改变,但不真正执行操作
  4. --list-hosts      #列出运行任务的主机
  5. --list-tags       #列出playbook文件中定义所有的tags
  6. --list-tasks      #列出playbook文件中定义的所以任务集
  7. --limit           #主机列表 只针对主机列表中的某个主机或者某个组执行
  8. -f                #指定并发数,默认为5个
  9. -t                #指定tags运行,运行某一个或者多个tags。(前提playbook中有定义tags)
  10. -v                #显示过程  -vv  -vvv更详细
复制代码
4、playbook元素属性

主机与用户

在一个playbook开始时,开始界说的是要利用的主机和用户
  1. ---
  2. - hosts: 192.168.1.31
  3.   remote_user: root
复制代码
除了上面的界说外,还可以在某一个tasks中界说要实验该使命的长途用户
  1. tasks:
  2.   - name: run df -h
  3.     remote_user: test
  4.     shell: name=df -h
复制代码
还可以界说利用sudo授权用户实验该使命
  1. tasks:
  2.   - name: run df -h
  3.     sudo_user: test
  4.     sudo: yes
  5.     shell: name=df -h
复制代码
tasks使命列表

每一个task必须有一个名称name,如许在运行playbook时,从其输出的使命实验信息中可以很清晰的辨别是属于哪一个task的,如果没有界说 name,action的值将会用作输出信息中标记特定的task。
每一个playbook中可以包罗一个大概多个tasks使命列表,每一个tasks完成具体的一件事,(使命模块)好比创建一个用户大概安装一个软件等,在hosts中界说的主机大概主机组都将会实验这个被界说的tasks。
  1. tasks:
  2.   - name: create new file
  3.     file: path=/tmp/test01.txt state=touch
  4.   - name: create new user
  5.     user: name=test001 state=present
复制代码
Handlers与notify

许多时间当我们某一个设置发生改变,我们须要重启服务,(好比httpd设置文件文件发生改变了)这时间就可以用到handlers和notify了;
(当发生改动时)notify actions会在playbook的每一个task竣事时被触发,而且纵然有多个差别task关照改动的发生,notify actions只会被触发一次;好比多个resources指出由于一个设置文件被改动,以是apache须要重启,但是重新启动的利用只会被实验一次。
  1. [root@ansible ~]# cat httpd.yml #用于安装httpd并设置启动---
  2. - hosts: 192.168.1.31
  3.   remote_user: root  tasks:  - name: install httpd    yum: name=httpd state=installed  - name: config httpd    template: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf    notify:      - restart httpd  - name: start httpd    service: name=httpd state=started  handlers:    - name: restart httpd      service: name=httpd state=restarted#这里只要对httpd.conf设置文件作出了修改,修改后须要重启收效,在tasks中界说了restart httpd这个action,然后在handlers中引用上面tasks中界说的notify。
复制代码
playbook文件中界说变量

编写playbook时,直接在内里界说变量,然后直接引用,可以界说多个变量;注意:如果在实验playbook时,又通过-e参数指定变量的值,那么会以-e参数指定的为准。
  1. # 编辑playbook
  2. [root@ansible PlayBook]# cat variables.yml
  3. ---
  4. - hosts: all
  5.   remote_user: root
  6.   vars:                #定义变量
  7.     pkg: nginx         #变量1
  8.     dir: /tmp/test1    #变量2
  9.   tasks:
  10.     - name: install pkg
  11.       yum: name={{ pkg }} state=installed    #引用变量
  12.     - name: create new dir
  13.       file: name={{ dir }} state=directory   #引用变量
  14. # 执行playbook
  15. [root@ansible PlayBook]# ansible-playbook variables.yml
  16. # 如果执行时候又重新指定了变量的值,那么会已重新指定的为准
  17. [root@ansible PlayBook]# ansible-playbook -e "dir=/tmp/test2" variables.yml
复制代码
独立的变量yaml文件中界说

为了方便管理将全部的变量同一放在一个独立的变量YAML文件中,playbook文件直接引用文件调用变量即可。
  1. # 定义存放变量的文件
  2. [root@ansible PlayBook]# cat var.yml
  3. var1: vsftpd
  4. var2: httpd
  5. # 编写playbook
  6. [root@ansible PlayBook]# cat variables.yml
  7. ---
  8. - hosts: all
  9.   remote_user: root
  10.   vars_files:    #引用变量文件
  11.     - ./var.yml   #指定变量文件的path(这里可以是绝对路径,也可以是相对路径)
  12.   tasks:
  13.     - name: install package
  14.       yum: name={{ var1 }}   #引用变量
  15.     - name: create file
  16.       file: name=/tmp/{{ var2 }}.log state=touch   #引用变量
  17. # 执行playbook
  18. [root@ansible PlayBook]# ansible-playbook  variables.yml
复制代码
playbook标签

一个playbook文件中,实验时如果想实验某一个使命,那么可以给每个使命集举行打标签,如许在实验的时间可以通过-t选择指定标签实验,还可以通过--skip-tags选择除了某个标签外全部实验等。
  1. # 编辑playbook[root@ansible PlayBook]# cat httpd.yml ---
  2. - hosts: 192.168.1.31
  3.   remote_user: root  tasks:    - name: install httpd      yum: name=httpd state=installed      tags: inhttpd    - name: start httpd      service: name=httpd state=started      tags: sthttpd    - name: restart httpd      service: name=httpd state=restarted      tags:         - rshttpd        - rs_httpd# 正常实验的结果[root@ansible PlayBook]# ansible-playbook httpd.yml PLAY [192.168.1.31] **************************************************************************************************************************TASK [Gathering Facts] ***********************************************************************************************************************ok: [192.168.1.31]TASK [install httpd] *************************************************************************************************************************ok: [192.168.1.31]TASK [start httpd] ***************************************************************************************************************************ok: [192.168.1.31]TASK [restart httpd] *************************************************************************************************************************changed: [192.168.1.31]PLAY RECAP ***********************************************************************************************************************************192.168.1.31               : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
复制代码
通过 -t 选项指定 tags 举行实验
  1. # 通过-t指定tags名称,多个tags用逗号隔开
  2. [root@ansible PlayBook]# ansible-playbook -t rshttpd httpd.yml
  3. PLAY [192.168.1.31] **************************************************************************************************************************
  4. TASK [Gathering Facts] ***********************************************************************************************************************
  5. ok: [192.168.1.31]
  6. TASK [restart httpd] *************************************************************************************************************************
  7. changed: [192.168.1.31]
  8. PLAY RECAP ***********************************************************************************************************************************
  9. 192.168.1.31               : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
复制代码
通过 --skip-tags 选项扫除不实验的 tags
  1. [root@ansible PlayBook]# ansible-playbook --skip-tags inhttpd httpd.yml
  2. PLAY [192.168.1.31] **************************************************************************************************************************
  3. TASK [Gathering Facts] ***********************************************************************************************************************
  4. ok: [192.168.1.31]
  5. TASK [start httpd] ***************************************************************************************************************************
  6. ok: [192.168.1.31]
  7. TASK [restart httpd] *************************************************************************************************************************
  8. changed: [192.168.1.31]
  9. PLAY RECAP ***********************************************************************************************************************************
  10. 192.168.1.31               : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
复制代码
免责声明:如果侵犯了您的权益,请联系站长及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录

QQ|手机版|qidao123.com IT社区;IT企服评测▪应用市场 ( 浙ICP备20004199|浙ICP备20004199号 )|网站地图

GMT+8, 2026-5-22 00:20 , Processed in 0.329429 second(s), 32 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

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