Ansible基本安装使用-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

Ansible基本安装使用

简介: ansible

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]


Playbook变量、tags、handers使用

Playbook模板templates

Playbook条件判断when

Playbook字典with_items

Ansible Roles


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章
最新文章
相关文章