Ansible基本使用 安装
yum 安装
安装epel源
yum install epel-release -y
安装ansible
yum install ansible -y
列出安装软件包存放的位置
rpm -ql ansible | more
编译安装
Git方式
pip安装
配置文件
/etc/ansible/ansible.cfg 主配置文件 ,配置ansible工作特性/etc/ansible/hosts 主机清单
/etc/ansible/roles 存放角色的目录
程序
/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界面与用户交互的执行工具
vi /etc/ansible/hosts
192.168.200.5192.168.200.5
测试主机连通性
ansible 192.168.200.5 -m ping -k
Ansible命令使用
/etc/ansible/hosts
主机分组
[webservers]
192.168.100.5
192.168.100.6
[dbserver]
192.168.200.4
[appserver]
192.168.200.10[4:5]
ansible webservers -m ping -k
系列命令
ansible ansible-doc ansible-playbook ansible-vault
ansible-console ansible-galaxy ansible-pull
ansible-doc:显示模块帮助
ansible-docoptions
-a 显示所有模块文档
-l,--list 列出可用模块
-s,--snippet 显示指定模块的playbook片段
示例:ansible-doc -l列出所有模块
ansible-doc ping 查看指定模块帮助用法
命令用法
ansible<host-pattern>-m moudle_name
--version
-m moudle 指定模块,默认为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=REMODE_USER执行远程执行的用户
-b,--become 代替旧版的sudo切换
ansible all --list-hosts
ssh-keygen
ssh-copy-id 192.168.200.5
ansible命令执行过程
1.加载自己的配置文件 默认/etc/ansible/ansible.cfg
2.加载自己对应的模块文件,如command
3.通过ansible将模块或命令生成对应的py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.py文件
4.给文件+x执行
5.执行并返回结果
6.删除临时py文件,slepp 0退出
执行状态
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
ansible all -a 'chdir=/boot ls'
ansible 192.168.200.5 -m shell -a 'echo $HOSTNAME'
Ansible常用模块详解
Command:在远程主机执行命令,默认模块,可忽略-m选项
ansible srvs -m command -a 'service vsftpd start'
ansible srvs -m command -a 'echo magedu | passwd --stdin wang'不成功
此命令不支持$VARNAME< > | ; 等用shell模块实现
Shell:和command相似,用shell执行命令
ansible srv -m shell -a 'echo magedu | passwd -stdin wang'
调用bash执行命令 类似cat /tmp/stanley.md | awk -F '|' '{print $1,$2}' & > /tmp/example.txt 这些复杂命令,即使使用shell也可能会失败,解决办法:写到脚本时,copy到远程,执行,再把需要的结果拉回执行命令的机器
Script: 运行脚本
-a "/PATH/TO/SCRIPT_FILE"
snsible websrvs -m scripts -a f1.sh
mkdir ansible cd ansible/ ls vi host.sh
hostname
ansible all -m script -a '/root/ansible/host.sh'
Copy
从服务器复制文件到客户端,
ansible server -m copy -a "src=/root/f1.sh dest=/tmp/f2.sh owner= mode= backup=yes"
如目标存在,默认覆盖,此处指定先备份
ansible server -m copy -a "content='test content\n' dest=/tmp/f1.txt" 利用内容生成目标文件
Fetch:
从客户端取文件至服务器,与copy相反,目录可先tar
ansible server -m fetch -a 'src=/root/a.sh dest=/data/scripts'
src:远程主机的文件目录
dest:主机存放的路径
File:
设置文件属性
ansible server -m file -a "path=/root/a.sh owner=wang mode=755"
ansible web -m file -a 'src=/app/testfile dest=/app/testfile-link state=link'
ansible all -m file -a 'name=/data/f3 state=touch'
name:名称
state:absent 删除已存在 touch 创建
directory :创建文件夹
link :链接
src:源 dest<=> name<=>path
创建一个软连接
ansible all -m file -a 'src=/etc/fstab dest=/data/fstab.link state=link'
ansible all -a 'ls -l /etc/selinux/config'192.168.200.6 | CHANGED | rc=0 >>-rw-r--r--. 1 root root 547 Dec 17 10:46 /etc/selinux/config192.168.200.5 | CHANGED | rc=0 >>-rw-r--r--. 1 root root 547 Dec 17 10:46 /etc/selinux/config
ansible all -m copy -a 'src=/root/ansible/selinux dest=/etc/selinux/config backup=yes'
ansible all -a 'ls /etc/selinux'
重启
ansible all -m shell -a 'reboot'
Hostname:管理 主机名
ansible node1 -m hostname -a "name=websrc"
Cron: 计划任务
支持时间:minute ,hour ,day,mouth,weekday
ansible srv -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 192.168.200.5 & > /dev/null/' name=Synctime"创建任务
ansible srv -m cron -a 'state=absent name=Synctime' 删除任务
YUM:管理包
ansible srv -m yum -a 'name=httpd state=latest/present' 安装
ansible all -m yum -a 'name=httpd,vsftpd'
ansible srv -m yum -a 'name=httpd state=absent' 删除
删除整个目录 (挂载点除外)
ansible all -m file -a 'dest=/data/ state=absent'
ansible all -m copy -a 'src=/data/vsftpd.rpm dest=/root/'
将主机 的rpm包传到其他节点 disable_gpg_check=yes
ansible all -m yum -a 'list=installed' 查看已经安装哪些包
ansible all -m yum -a 'name=vsftpd state=removed' 卸载
ansible all -m yum -a 'update_cache=yes' 更新缓存
Service:管理服务
ansible all -m service -a 'name=httpd state=stopped'
ansible all -m service -a 'name=httpd state=started'
ansible all -m service -a 'name=httpd state=reloaded'
ansible all -m service -a 'name=httpd state=restarted'
User:管理用户
ansible all -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'
ansible all -m user -a 'name=sysuser1 system=yes home=/app/sysuser1'
ansible all -m user -a 'name=user1 state=absent remove=yes'
删除用户及家目录
Group:管理组
ansible all -m group -a "name=testgroup system=yes"
ansible all -m group -a "name=testgroup state=absent"
ansible系列命令
ansible-galaxy
连接https://galaxy.ansible.com 下载相应的roles
列出所有已安装的galaxy
ansible-galaxy list
安装galaxy
ansible-galaxy install geerlingguy.redis
删除galaxy
ansible-galaxy remove geerlingguy.redis
ansible-pull
推送命令至远程,效率无限提升,对运维要求较高
ansible-vault
命令简介
ansible-vault 命令的作用就是采用安全加密的方式来操作相关文件。
命令帮助
# ansible-vault -h
Usage: ansible-vault [create|decrypt|edit|encrypt|encrypt_string|rekey|view] [options] [vaultfile.yml]
encryption/decryption utility for Ansible data files
Options:
--ask-vault-pass # 输入加密密码
-h, --help # 显示帮助信息
--new-vault-id=NEW_VAULT_ID # 设定新的加密信息
--new-vault-password-file=NEW_VAULT_PASSWORD_FILE # 设定加密文件
--vault-id=VAULT_IDS # 设定加密的认证id
--vault-password-file=VAULT_PASSWORD_FILES # 认证密码
-v, --verbose # 显示更详细信息
--version # 显示帮助信息
简单实践
创建加密文件
ansible-vault create /tmp/vault
检查效果
~]# cat /tmp/vault
$ANSIBLE_VAULT;1.1;AES256
32363162653334653062636663626265393464613066373961343037356338633137333862386135
3263363234313532626533613463666466653738346637380a366339653136633233396139393536
37323733396538363738616364663136303337386666623266316537633636353632666362646438
3836356362616530340a373734376231316434353931323032623030653338613837613735613631
3264
输入密码查看
~]# ansible-vault view /tmp/vault
Vault password:
nihao
编辑认证
[root@master ~]# ansible-vault edit /tmp/vault
Vault password:
\# 进入vim编辑窗口,编辑以下内容
nihao xiugai
解密文件
~]# ansible-vault decrypt /tmp/vault
Vault password:
Decryption successful
~]# cat /tmp/vault
nihao xiuga
加密文件
cd /data/ansible/playbook/
ansible-vault encrypt hello.yaml
检查效果
cat hello.yaml
$ANSIBLE_VAULT;1.1;AES256
6633333234... ...303632643963356238663
更改秘钥
[root@master playbook]# ansible-vault rekey hello.yaml
Vault password: 输入老密码
New Vault password: 输入新密码
Confirm New Vault password: 确认新密码
Rekey successful
[root@master playbook]# ansible-vault view hello.yaml
Vault password: 验证新密码
\---
\- hosts: 192.168.200.13
...
ansible-inventory
命令简介
ansible-inventory其实是获取主机清单一些的信息的专用命令。
命令帮助
~]# ansible-inventory -h
Usage: ansible-inventory [options] [host|group]
Options: # 普通选项
--ask-vault-pass # 设定认证密码
--export # 设定处理方法
-h, --help # 查看帮助信息
-i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY # 设定主机列表
--playbook-dir=BASEDIR # 设定playbook的专用路径
--vars # 查看变量
--vault-id=VAULT_IDS # 设置加密id
--vault-password-file=VAULT_PASSWORD_FILES # 使用加密认证文件
-v, --verbose # 显示详情
--version # 显示版本信息
-y, --yaml # 以yaml格式显示信息
Actions: # 动作选项
--list # 列出所有信息
--host=HOST # 输出特定主机信息,作为库存脚本
--graph # 图形方式显示主机信息
简单示例
列出所有主机的信息
ansible-inventory --export --list
图形方式显示主机列表信息
ansible-inventory --export --graph
显示指定主机的信息
ansible-inventory --host=192.168.8.14
显示主机变量信息
ansible-inventory --vars --list
yaml格式显示信息
ansible-inventory -y --list
Ansible-playbook
ansible-playbook hello.yml
cat hello.yml
#hello world yml file
• - hosts: webservers
• remote_user: root
• tasks:
• - name: hello world
• command: /usr/bin/wall hello world
ansible-vault
功能:管理加密解密yml文件
ansible-vault [create|decrypt|edit|encrypt|rekey|view]
ansible-vault encrypt hello.yml 加密
ansible-vault decrypt hello.yml 解密
ansible-vault view hello.yml 查看
ansible-vault edit hello.yml 编辑加密文件
ansible-vault rekey hello.yml 修改口令
ansible-vault create new.yml 创建新文件ansible-console :可交互执行命令,支持tab
root@test(2)[f:10]$
执行用户@当前操作的主机组(当前组的主机数量)[f:并发数]$
设置并发数:forks n 例: forks 10
切换组: cd 主机组 例:cd webservers
列出当前主机组列表 :list
列出所有的内置命令:?或help
例:
root@all (2)[f:5]$ list
root@all (2)[f:5]$ cd appservers
root@webservers (2)[f:5]$ list
root@webservers (2)[f:5]$ yum name=httpd state=present
root@webservers (2)[f:5]$ service name=httpd state=started
PLAYBOOK
playbook是由一个或多个"play"组成的列表
play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,既可以让它们联同起来按事先编排的的机制同唱一台大戏
playbook采用YAML语言编写
YAML语法简介
YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年首次发表了这种语言,另外Ingy dotNET与Oren Ben-Kiki也是这语言的共同设计者。
YAML Ain't Another Markup Language ,在开发这种语言时,YAML的意思是:”YET Another Markup Language“(仍是一种标记语言)
特性
YAML的可读性好
YAML和脚本语言的交互性好
YAML使用实现语言的数据类型
YAML有一个一致的信息模型
YAML易于实现
YAML表达能力强,扩展性好
YAML可以基于流来处理
在单一档案中,可用连续三个连字号(---)区分多个档案。另外,还有选择性的连续三个点号(…)表示档案的结尾
次行开始正常写playbook内容,一般建议写明该Playbook的功能
使用#号注释代码
缩进必须是统一的,不能空格和tab混用
缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
YAML文件内容和Linux系统大小写判断方式保持一致,是区别大小写的,k/v的值均需大小写敏感
k/v的值可同行写也可换行写,同行使用:分隔
v是个字符串,也可能是一个列表
一个完整的代码块功能需最少元素需包括name: task
一个name只能包括一个task
YAML文件扩展名通常为yml或yaml
List:列表,其所有元素均使用”-“打头
示例:
#A list of tasty fruits
-Apple
-Orange
-Strawberry
-Mango
Dictionary:字典,通常由多个key与value构成
示例:
---
#An employee record
name: Example Developer
job: Developer
也可以将key:value放置于{}中进行表示,用,分隔多个key:value
例:
---
#An employee record
{name:Example Developer,job:Developer,skill:Elite}
playbook核心元素
Hosts 执行的远程主机列表
Tasks 任务集
Varniables 内置变量或自定义变量在playbook中调用
Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
Handlers和notity结合使用,由特定条件出发的操作,满足条件方才执行,否则不执行
tags标签 指定某条任务执行,用于选择运行playbook中的代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片段
ansible-playbook -t tagsname useradd.yml
Ansible playbook基础
Hosts:
playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中。
形式:
one.example.com
192.168.200.5
192.168.200.*
webservers:dbservers 两个组的并集
wenservers:&dbservers 两个组的交集
webservers:!phoeix 在webservers组,但不在dbservers组
示例: - hosts: webservers :dbservers
[root@ansible playbook]# cat install_httpd.yaml
---
- hosts: http
remote_user: root
tasks:
- name: install packages
yum: name=httpd state=present
- name: start service
service: name=httpd state=started enabled=yes
mkdir /data/ansible/playbook -p
cd /data/ansible/playbook
[root@ansible playbook]# cat hello.yml
---
- hosts: http
remote_user: root
tasks:
- name: hello world
command: wall "hello world"
tags:
- hello world
- name: extra vars
debug: msg-{{extra_vars}}
语法检查效果
# ansible-playbook hello.yml --syntax-check
模拟文件执行
# ansible-playbook -C hello.yml
查看基本信息
[root@ansible playbook]# ansible-playbook hello.yml --list-hosts
playbook: hello.yml
play #1 (http): http TAGS: []
pattern: [u'http']
hosts (2):
192.168.200.12
192.168.200.13
# ansible-playbook hello.yml --list-tasks
# ansible-playbook hello.yml --list-tags
文件执行
# ansible-playbook hello.yml
一步一步的执行
# ansible-playbook hello.yml --step
任务依赖
需求场景、属性介绍、依赖实践、依赖进阶
需求场景
实践场景
以我们刚才的安装nginx服务的playbook.yaml场景为例
ansible-playbook playbook.yaml
ansible web -m shell -a "netstat -tnulp | grep nginx"
当我们再次配置文件,将其启动端口更改为88
sed -i 's/82/88/g' nginx.conf
重新执行playbook效果
ansible-playbook playbook.yaml
ansible web -m shell -a "netstat -tnulp | grep nginx"
结果发现:
重新部署后的nginx配置没有生效。
场景分析:
在我们修改过配置文件后,再次执行playbook.yaml的时候,即使ansible-playbook发现配置文件发生变动,由于任务列表中的所有指令都没有发生变化,它就认为整个过程都没有发生变化,所以ansible就走一下过程就可以了,并没有真正执行里面的指令。
场景需求:
有没有一种方式能解决我们这种存在依赖关系的任务场景呢
属性介绍
属性简介:
对于这种内容发生更改,服务应该重启的场景,在playbook中我们称之为"关系依赖",playbook对于这种特殊的关系有两个语法可以满足解决方法的需求:
notify: 监控我们指定的动作涉及的内容是否发生了变化
handlers:接收到变化动作后,我们自动执行的其他操作命令
注意:
由于notify涉及到的动作是由handlers创建的,所以在实践的过程中,应该先写handlers,再在notify中调用
handlers样式
notify中的handler的样式如下,以playbook.yaml文件为例
- hosts: web
remote_user: root
tasks:
...
handlers: # 定义触发器任务列表
\- name: restart nginx # 定义具体触发动作
service: name=nginx status=restarted # 触发动作的详情
配置详解:
handlers 和 tasks 是同一级别的属性
handlers 中定义一系列的触发动作,动作的名称必须唯一。
每一个触发动作的定义格式,与task的动作格式完全一样
notify样式:
task中的notify样式,以playbook.yaml文件为例
- hosts: web
remote_user: root
tasks:
...
\- name: copy config
copy: src=nginx.conf dest=/etc/nginx/nginx.conf
notify: restart nginx # copy config任务发生变化时,触发restart nginx 动作
配置详解:
notify是task中的一个子属性
notify的格式: notify: handler名称
notify在执行的时候,必须指定存在中的handler,两者不能分开
依赖实践
修改playbook文件
修改playbook.yaml文件,增加notify和handlers部分,效果如下
- hosts: web
remote_user: root
tasks:
\- name: create new user
user: name=nginx-test system=yes uid=82 shell=/sbin/nologin
\- name: create web root
file: name=/data/webserver/html state=directory
\- name: touch web index
shell: echo '<h1>welcome to ansible</h1>' > /data/webserver/html/index.html
\- name: install package
yum: name=nginx state=present
\- name: copy config
copy: src=nginx.conf dest=/etc/nginx/nginx.conf
notify: restart nginx
\- name: start service
service: name=nginx state=restarted enabled=yes
handlers:
\- name: restart nginx
service: name=nginx state=restarted
执行playbook.yaml
检查文件
ansible-playbook playbook.yaml --syntax-check
ansible-playbook playbook.yaml -C
更改配置文件
sed -i 's/88/89/g' nginx.conf
执行文件
ansible-playbook playbook.yml
检查效果
ansible web -m shell -a "netstat -tnulp | grep nginx"
依赖进阶
进阶需求:
我们刚才基于handler和notify的实践实现的是一个notify触发一个handler的效果,但是生产中肯定会出现一个notify触发多个handler的效果
修改文件
编写多个触发器,然后让一个notify来触发
- hosts: web
remote_user: root
tasks:
\- name: create new user
user: name=nginx-test system=yes uid=82 shell=/sbin/nologin
\- name: create web root
file: name=/data/webserver/html state=directory
\- name: touch web index
shell: echo '<h1>welcome to ansible</h1>' > /data/webserver/html/index.html
\- name: install package
yum: name=nginx state=present
\- name: copy config
copy: src=nginx.conf dest=/etc/nginx/nginx.conf
notify:
• \- restart nginx
• \- check nginx
\- name: start service
service: name=nginx state=restarted enabled=yes
handlers:
\- name: restart nginx
service: name=nginx status=restarted
\- name: check nginx
shell: netstat -tnulp | grep nginx > /tmp/nginx.test
注意:
notify在触发多个动作的时候,他们是以列表的形式在进行
执行playbook.yaml
检查文件
ansible-playbook playbook.yaml --syntax-check
ansible-playbook playbook.yaml -C
更改配置文件
sed -i 's/89/90/g' nginx.conf
执行文件
ansible-playbook playbook.yml
检查效果
ansible web -m shell -a "cat /tmp/nginx.test"
标签基础
标签简介
到现在为止,我们虽然对ansible进行了各种各样的实践操作,但是我们发现有些动作和操作有些太繁杂,而且不好写,某些功能使用起来很不方便。
常见的场景:
我们每次指定主机ip地址太长了,写起来不方便
一个playbook中有数十个任务,而我们只需要执行其中的一个
等等
有一种方式,可以大大的减轻我们的工作难度,就是"标签"。我们可以将标签标注在主机上、任务中,它就相当于主机|动作的别名、外号,我们可以通过这个简称,找到相应的内容。
使用方法
根据我们刚才的介绍,标签的使用主要有两个地方:主机和任务。但是对于主机列表来说,使用标签的作用不大,所以我们一般使用标签都是在playbook中对不同的对象进行打标签
查看playbook中的标签
~]# ansible-playbook --list-tags playbook.yaml
playbook: playbook.yaml
play #1 (web): web TAGS: []
TASK TAGS: []
给主机设定标签
- hosts: web
tags: host-tags
给任务设定标签
- hosts: web
remote_user: root
tasks:
\- name: create new user
user: name=nginx-test system=yes uid=82 shell=/sbin/nologin
• tags: new-user
结果显示:
我们在设置标签的时候,直接在对象的下面增加一个 "tags: tag-name" 即可
查看效果
~]# ansible-playbook --list-tags playbook.yaml
playbook: playbook.yaml
play #1 (web): web TAGS: [host-tags]
TASK TAGS: [host-tags, new-user]
标签实践
修改playbook文件
给playbook中的拷贝配置文件添加标签
- hosts: web
remote_user: root
tasks:
... ...
\- name: copy config
copy: src=nginx.conf dest=/etc/nginx/nginx.conf
tags: copyconfig
... ...
执行测试
修改配置文件
sed -i 's/90/91/g' nginx.conf
使用 -t 参数指定任务标签,执行文件
ansible-playbook -t copyconfig playbook.yaml
检查效果
ansible web -m shell -a "cat /tmp/nginx.test"
标签进阶
场景需求
在一个任务列表中,除非某些任务是紧密关联着的,是一个整体,这种情况我们可以把多个任务使用同一个标签,进行批量管理执行,但是对于任务没有什么关联关系的话,标签尽量是惟一的,否则的话,不好管理
根据我们对playbook.yaml文件的理解,这个文件中可以实现两类功能:新环境安装软件、定制关键配置文件,接下来我们来好好的梳理一下:
需求分析
新环境安装软件
主要涉及到 create new user、install package、start service 这三个任务
定制关键配置文件
主要涉及到 create web root、touch web index、copy config 这三个任务
技术分析:
1 一个文件实现两类功能 - 基于tags属性实现
2 每一类功能由间隔任务组成 - 基于tags将多个任务组合在一起
3 新环境安装任务标签设置为installtask、定制配置任务标签设置为changetask
准备工作:
清空环境
ansible web -m service -a "name=nginx state=stopped"
ansible web -m yum -a "name=nginx state=absent"
ansible web -m file -a "path=/data/webserver state=absent"
ansible web -m user -a "name=nginx-test state=absent"
修改playbook文件
- hosts: web
remote_user: root
tasks:
\- name: create new user
user: name=nginx-test system=yes uid=82 shell=/sbin/nologin
• tags: installtask
\- name: create web root
file: name=/data/webserver/html state=directory
• tags: changetask
\- name: touch web index
shell: echo '<h1>welcome to ansible</h1>' > /data/webserver/html/index.html
• tags: changetask
\- name: install package
yum: name=nginx state=present
tags: installtask
\- name: copy config
copy: src=nginx.conf dest=/etc/nginx/nginx.conf
tags: changetask
notify:
• \- restart nginx
• \- check nginx
\- name: start service
service: name=nginx state=started enabled=yes
tags: installtask
handlers:
\- name: restart nginx
service: name=nginx state=restarted
\- name: check nginx
shell: netstat -tnulp | grep nginx > /tmp/nginx.test
实践操作
在所有主机上安装新软件
ansible-playbook -t installtask playbook.yaml -C
ansible-playbook -t installtask playbook.yaml
检查效果
~]# ansible web -m shell -a "netstat -tnulp | grep nginx"
192.168.8.14 | CHANGED | rc=0 >>
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 49015/nginx: master
tcp6 0 0 :::80 :::* LISTEN 49015/nginx: master
192.168.8.15 | CHANGED | rc=0 >>
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 32075/nginx: master
tcp6 0 0 :::80 :::* LISTEN 32075/nginx: master
192.168.8.15上进行配置文件更新
ansible-playbook -t changetask -l 192.168.8.15 playbook.yaml -C
ansible-playbook -t changetask -l 192.168.8.15 playbook.yaml
检查效果
~]# ansible web -m shell -a "netstat -tnulp | grep nginx"
192.168.8.14 | CHANGED | rc=0 >>
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 49015/nginx: master
tcp6 0 0 :::80 :::* LISTEN 49015/nginx: master
192.168.8.15 | CHANGED | rc=0 >>
tcp 0 0 0.0.0.0:92 0.0.0.0:* LISTEN 32464/nginx: master
tcp6 0 0 :::92 :::* LISTEN 32464/nginx: master
标签显示
~]# ansible-playbook --list-tags playbook.yaml
playbook: playbook.yaml
play #1 (web): web TAGS: []
TASK TAGS: [changetask, installtask]