ansible快速入门

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ansible快速入门相关的知识,希望对你有一定的参考价值。

文档下载

word格式文档下载(已排好版)

参考文档

朱双印个人日志-ansible(本文总结于此)

非常好的Ansible入门教程(超简单)

ansible官网

ansible基础概念

ansible是什么?

是一个“配置管理工具”,是一个“自动化运维工具”。它能帮助我们在许多远程主机上,完成一些批量任务,或者一些需要经常重复的工作

ansible的幂特性

ansible有个特性叫“幂特性”。即ansible是以“结果为导向的”。我们指定了一个“目标状态”,ansible会自动判读,“当前状态”是否与“目标状态”一致。如果一致,则不进行任何操作。如果不一致,就将“当前状态”变为“目标状态”。

需要安装什么

ansible通过SSH连接到受管主机进行操作。只有管理主机需要安装ansible软件。

ansible的模块

ansible对主机的各种操作都是通过模块来完成的,比如“ping”模块,“file”模块,“yum”模块等等。可以把模块理解为我们在受管主机上执行的命令。既然是命令,这些模块也有参数供我们使用。

playbook(剧本)

       我们在执行ansible命令时,可以把需要条针对不同主机的命令,编写成一个playbook。这个playbook我们可以理解为脚本。它是用YAML格式编写的。通过playbook,我们可以针对不同主机,或是不同组(组里有不同的主机),来指定要做的事。

除了这个功能外,还有

handlers功能(先判断“当前状态”和“目标状态”是否一致,一致就不执行操作)。tags功能(打标签,可以指定只运行打了标签的操作)

       指定变量

       等等功能。当然,这些功能都需要我们在playbook中使用相应的关键字,进行编写。

 

ansible的“清单”(Inventory

ansible的命令格式:

ansible  <host-pattern>  [-f forks] [-m module_name]  [-a args]

例如:ansible 10.1.1.60 –m ping

-m:是指定使用的模块,ping是模块名

看上面这条命令。使用ansibleping 10.1.1.60这台主机。相当于我们手动执行ping命令一样。

这个命令正常执行需要两个基本条件:

1ansible所在的主机可以通过SSH连接到受管主机

2)受管主机的IP地址等信息已经添加到ansible的“管理清单”中

“管理清单”的配置就在/etc/andisble/hosts。下面给出示例

#指定主机

192.168.56.110 ansible_port=22 ansible_user=root ansible_ssh_pass=123456

#指定别名

node1 ansible_host=192.168.56.110 ansible_port=22 ansible_user=root ansible_ssh_pass=123456

#如果报错,将ansible的配置文件/etc/ansible/ansible.cfg中的host_key_checking改为False

当然,如果我们使用了SSH密钥,就不在需要给出密码和用户了。端口如果是默认的22,也可以省略。YAML风格的/etc/ansible/hosts

all:

 children:

  pro:

   children:

proA:

 hosts:

  xxx.xxx.xxx.xxx

proB:

 hosts:

  xxx.xxx.xxx.xxx

ansible的常用模块

官方模块表(2.5

命令模块

command

描述

command 模块可以帮助我们在远程主机上执行命令。 
注意:使用 command 模块在远程主机中执行命令时,不会经过远程主机的 shell 处理,在使用 command 模块时,如果需要执行的命令中含有重定向、管道符等操作时,这些符号也会失效,比如”<”, “>”, “|”, “;” “&” 这些符号,如果你需要这些功能,可以参考后面介绍的 shell 模块。还有一点需要注意,如果远程节点是 windows 操作系统,则需要使用 win_command 模块。 
执行 ansible 时,不加 -m 默认使用 command ,可以在 /etc/ansible/ansible.cfg 中修改。

# default module name for /usr/bin/ansible

#module_name = command

参数

free_form参数 必须参数,指定需要远程执行的命令。需要说明一点,free_form 参数与其他参数(如果想要使用一个参数,那么则需要为这个参数赋值,也就是name=value模式)并不相同。比如,当我们想要在远程主机上执行 ls 命令时,我们并不需要写成free_form=ls,这样写反而是错误的,因为并没有任何参数的名字是 free_form,当我们想要在远程主机中执行 ls 命令时,直接写成 ls 即可。因为 command 模块的作用是执行命令,所以,任何一个可以在远程主机上执行的命令都可以被称为 free_form

 

chdir参数 : 此参数的作用就是指定一个目录,在执行对应的命令之前,会先进入到 chdir 参数指定的目录中。

 

creates参数 看到 creates,你可能会从字面上理解这个参数,但是使用这个参数并不会帮助我们创建文件,它的作用是当指定的文件存在时,就不执行对应命令,比如,如果 /testdir/test文件存在,就不执行我们指定的命令。

 

removes参数 creates 参数的作用正好相反,它的作用是当指定的文件不存在时,就不执行对应命令,比如,如果 /testdir/tests 文件不存在,就不执行我们指定的命令,此参数并不会帮助我们删除文件。

 

shell

描述

shell 模块可以帮助我们在远程主机上执行命令。与 command 模块不同的是,shell 模块在远程主机中执行命令时,会经过远程主机上的 /bin/sh 程序处理。 

参数

free_form参数 必须参数,指定需要远程执行的命令,但是并没有具体的一个参数名叫free_form,具体解释参考 command 模块。

 

chdir参数 : 此参数的作用就是指定一个目录,在执行对应的命令之前,会先进入到 chdir 参数指定的目录中。

 

creates参数 使用此参数指定一个文件,当指定的文件存在时,就不执行对应命令,可参考command 模块中的解释。

 

removes参数 使用此参数指定一个文件,当指定的文件不存在时,就不执行对应命令,可参考 command 模块中的解释。

 

executable参数:默认情况下,shell 模块会调用远程主机中的 /bin/sh 去执行对应的命令,通常情况下,远程主机中的默认 shell 都是 bash。如果你想要使用其他类型的 shell 执行命令,则可以使用此参数指定某种类型的 shell 去执行对应的命令。指定 shell 文件时,需要使用绝对路径。

 

script

描述

script 模块可以帮助我们在远程主机上执行 ansible 管理主机上的脚本,也就是说,脚本一直存在于 ansible 管理主机本地,不需要手动拷贝到远程主机后再执行。 

参数

free_form参数 必须参数,指定需要执行的脚本,脚本位于 ansible 管理主机本地,并没有具体的一个参数名叫 free_form,具体解释请参考 command 模块。

 

chdir参数 : 此参数的作用就是指定一个远程主机中的目录,在执行对应的脚本之前,会先进入到 chdir 参数指定的目录中。

 

creates参数 使用此参数指定一个远程主机中的文件,当指定的文件存在时,就不执行对应脚本,可参考 command 模块中的解释。

 

removes参数 使用此参数指定一个远程主机中的文件,当指定的文件不存在时,就不执行对应脚本,可参考 command 模块中的解释。

 

文件模块

fetch

描述

从远程节点获取文件

参数

src:源文件路径

dest:目标路径。如果以“/”结尾,则会直接使用srcbasename作文件名

copy

描述

拷贝管理主机上的文件到远程节点

参数

src

dest

content:当不使用src指定拷贝的文件时,可以用content指定文件内容。src与从content必有一个。通过contentdest,可以在目标节点新建文件,并写入content指定的内容

force远程主机已有同名文件存在,是否覆盖。默认yes

backup:远程主机已有同名文件存在,是否备份

owner:指定文件拷贝到远程主机后的属主

group指定文件拷贝到远程主机后的属组

mode指定文件拷贝到远程主机后的权限

file

描述

执行一些对文件的基本操作。如创建/删除 文件/目录,修改文件权限等

参数

path:必须参数,指定要操作的文件或目录

statedirectory(创建目录)

              touch(创建文件)

              link(软链接)

              hard(硬链接)

              absent(删除)

src:指定链接源

force:是否强制创建链接文件,无论源文件是否存在。

owner

group

mode

recurse:递归操作。可用于递归修改目录下的文件属性

find

描述

帮助我们在远程主机查找符合条件的文件,就像find命令一样

参数

paths

recures递归查找

hidden默认隐藏文件在查找时会被忽略。可以yes开启

file_typeanydirectoryfilelink

patterns指定要查找的文件名,支持shell(如通配符)或正则匹配。默认使用shell匹配。若要用python的正则匹配,徐江user_regex设为yes

user_regex是否使用正则

contains根据文章内容查找文件。此参数的值为正则表达式

age根据时间范围查找文件。默认的时间标准是mtime-3d表示3天以前。3d表示3天内。还可用秒(s),分(m),时(h),星期(w

age_stamp指定时间种类标准,包括atimectimemtime,默认是mtime

size按文件大小查找文件。“-”号表示小于。单位有tgmkb

get_checksum当文件被找到时,同时返回文件的sha1校验码

blockinfile

描述

在指定的文件中插入“一段文本”,这段文本是标记过的。在以后的操作中可以通过“标记”找到这段文本,修改或者删除它。

参数

path

block指定我们想要操作的那“一段文本”。此参数有个别名“content

marker:如果我们插入一段文本,ansible会自动对这段文本进行两个标记。一个开始标记,一个结束标记。既有默认值,我们也可以用mark参数自定义。如marker=#{markder}test。这样显示结果为# BEGIN test# END test

statepresent(默认值是present,执行插入操作或更新操作)

              absent(删除对用标记的段落)

insertafter参数 在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的后面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的后面。如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为EOF,表示将文本插入到文档末尾。

insertbefore参数 在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的前面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的前面。如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为BOF,表示将文本插入到文档开头。

backup参数 是否在修改文件之前对文件进行备份。

create参数 当要操作的文件并不存在时,是否创建对应的文件。

 

例子

lineinfile

描述

确保某一行文本存在于指定的文件中,或者确保从文件中删除指定的文本(即确保指定的文本不存在于文件中),还可以根据正则表达式,替换某一行文本

参数

path参数 必须参数,指定要操作的文件。

 

line参数 : 使用此参数指定文本内容。

 

regexp参数使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。

 

state参数当想要删除对应的文本时,需要将state参数的值设置为absentabsent为缺席之意,表示删除,state的默认值为present

 

backrefs参数 默认情况下,当根据正则替换文本时,即使regexp参数中的正则存在分组,在line参数中也不能对正则中的分组进行引用,除非将backrefs参数的值设置为yesbackrefs=yes表示开启后向引用,这样,line参数中就能对regexp参数中的分组进行后向引用了,这样说不太容易明白,可以参考后面的示例命令理解。backrefs=yes除了能够开启后向引用功能,还有另一个作用,默认情况下,当使用正则表达式替换对应行时,如果正则没有匹配到任何的行,那么line对应的内容会被插入到文本的末尾,不过,如果使用了backrefs=yes,情况就不一样了,当使用正则表达式替换对应行时,同时设置了backrefs=yes,那么当正则没有匹配到任何的行时,则不会对文件进行任何操作,相当于保持原文件不变。

insertafter参数:借助insertafter参数可以将文本插入到指定的行之后,insertafter参数的值可以设置为EOF或者正则表达式,EOFEnd Of File之意,表示插入到文档的末尾,默认情况下insertafter的值为EOF,如果将insertafter的值设置为正则表达式,表示将文本插入到匹配到正则的行之后,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。

 

insertbefore参数借助insertbefore参数可以将文本插入到指定的行之前,insertbefore参数的值可以设置为BOF或者正则表达式,BOFBegin Of File之意,表示插入到文档的开头,如果将insertbefore的值设置为正则表达式,表示将文本插入到匹配到正则的行之前,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。

 

backup参数:是否在修改文件之前对文件进行备份。

 

create参数 当要操作的文件并不存在时,是否创建对应的文件。

例子

 

 

replace

描述

根据指定的正则替换文件中的字符串。文件中所有正则匹配到的字符串都会被替换

参数

path

regexp正则

replace要替换成的字符串

backup修改前,先备份

 

stat

包模块

yum_repository

描述

管理远程主机的yum仓库

参数

name必选参数。指定要操作的唯一的仓库ID。就是.repo文件中每个仓库里对应的“中括号”里的值。如[ceph-noarch]

baseurl仓库的baseurl

description注释

file文件名,.repo的前缀
enabled
是否激活对应的yum源,默认为yes

gpgcheck是否开启rpm包验证功能。默认为no

gpgcakey指定验证包所需要的公钥

state默认为presentabsent表删除

yum

描述

在远程主机上通过yum源管理软件包

参数

name指定要管理的软件包

state指定软件包状态。默认为present(等效于installed)。还有latestabsent(等效于removed)。latest表安装yum中的最新版本

disable_gpg_check是否禁用rpm包的公钥gpg验证。默认为no,表示不禁用验证。

enablerepo安装软件包时,临时启用的yum

diablerepo安装软件包时,临时禁用的yum

系统模块

ping

验证主机连接性

cron

描述

cron模块让我们可以远程设置定时任务。

参数

minute
hour

day

month

weekday

special_timerebootyearlyannually(每一年,等于yearly),monthlyweeklydailyhourly

user不指定任务用户,默认为管理员

job实际要执行的命令/脚本

name任务的名称

state设为absent时,删除对应name的任务

disabled根据name,使对应任务失效。使用此参数时,任务的job,时间设定都得写对。不然在注销任务的同时,会修改原任务

backup修改/删除前,先备份

user

描述

管理远程主机的用户,增删改 用户,为用户创建密钥对,等操作

参数

name

group

groups附加组设置,当如果不想覆盖原来的,则要设置appendyes

append默认为no

shell

uid

expire用户过期时间。比如你要设置“2018-3-21”为过期时间,首先”date –d 2018-3-12 +%s”,获得和epoch时间相差的秒数。然和通过获得秒数设置

comment用户注释信息

state默认为present,表存在。absent,表删除用户

remove删除用户时,是否移除家目录。默认为no

password设置用户密码,但设置的密码得是哈希后的字符串。可以用pythoncrypt模块。crypt.crypt'password’)得到密文

update_passwordalways表如果password设置的值和当前密码不同,则直接更新。on_create表如果不同,则不更新。

genarate_ssh_key默认为no。在对用用户家目录下生成SSH密钥对。id_rsaid_rsa.pub。密钥对若已存在,则不做操作

ssh_key_file自定路径和名称

ssh_key_comment设置公钥注释信息

ssh_key_passphrase设置私钥密码。已存在同名私钥,不作操作

ssh_key_type设置密钥类型。默认为rsa。已存在同名密钥,不做操作

group

描述

管理远程主机的组

参数

name

state默认为presentabsent表删除

gid

setup

描述

这个模块被playbooks自动调用来收集关于远程主机的有用变量,这些变量可以在playbooks中使用。

概要

我们在运行playbook时,会发现总是会默认运行一个“【Gathering Factes】”的任务。这个任务会收集远程主机的相关信息(例如远程主机我的IP,主机名,系统版本,配置信息等),这些信息会被保存到对应的变量中。而这个任务,就是通过setup模块实现的。

setup返回的信息是json格式的字符串。

除了基本信息外。ansible默认会去/etc/ansible/facts.d目录下查找目标主机的自定义信息。自定义信息需要写在以“.fact”为后缀的文件中。同时这些文件的内容需要是INI格式或json格式。如:

#testinfo.fact

#INI风格

[testmsg]

msg1=This is the first custom test message

msg2=This is the second custom test message

 

#JSON格式

{

   "testmsg":{

       "msg1":"This is the first custom test message",

       "msg2":"This is the second custom test message"

   }

}

参数

filter设置shell风格的通配符。以匹配要查找的内容

ansible test70 -m setup -a 'filter=ansible_memory_mb' # 这里匹配的ansible_memory_mb相当于是一个变量名。

ansible test70 -m setup -a "filter=*mb*"

fact_Path指定.fact文件的路径

debug的混合使用

除了用filter参数过滤自己想要的信息。还可以在playbook中使用debug来过滤。

先看一下debug模块:

#通过msg参数,打印出自定义的信息

 - name: debug demo

   debug:

     msg: this is debug info,The test file has been touched

#打印变量testvar的键值对

vars:

   testvar: value of test variable

 tasks:

 - name: debug demo

   debug:

     var: testvar

#打印testvar的值

 - name: debug demo

   debug:

     msg: "value of testvar is : {{testvar}}"

#debug过率出远程主机的内存信息

---

- hosts: test70

 remote_user: root

 tasks:

 - name: debug demo

   debug:

     msg: "Remote host memory information: {{ansible_memory_mb}}"

注意:这个变量名存储的就是远程主机的内存信息。

#过滤内存信息里的子项

语法一示例:

debug:

     msg: "Remote host memory information : {{ansible_memory_mb.real}}"

语法二示例:

debug:

     msg: "Remote host memory information : {{ansible_memory_mb['real']}}"

service

描述

帮助我们管理远程主机上的服务。启动,停止,重启,重载配置文件。但前提是这个服务必须被BSD init, OpenRC, SysV, Solaris SMF, systemd, upstart中的任意一种管理支持。

参数

name

statestartedstoppedrestartedreloaded

enable是否开机自启

ansibleplaybook

剧本入门

基础命令

剧本需要用YAML格式编写。文件后缀我们使用.yml。关于剧本的命令如下

#运行剧本

ansible-playbook file.yml

 

#语法检查

ansible-playbook --syntax-check /dir/file.yml

 

#模拟执行

ansible-playbook –check file.yml

注意:模拟的结果只能参考。因为模拟执行不是真正执行。这就意味着有些任务的结果没有正确返回,模拟就有可能报错。但这不代表会真正报错

剧本示例

先测试联通性,然后创建node目录。目标主机使用的是别名proAproB


---

- hosts:proA,proB

  remote_user: root

  tasks:

  - name: Ping the host

    ping:

  - name: make the directory test

    file:

      path: /root/node1

      state: directory

上面的hosts也可以写为(即同行可变分行)

- hosts:

proA

proB

file也可以写为(即:号可换等号。当然也可写成分行)

file: path=/root/node1,state=directory

 

handlers

handlers可以被理解为一种taskhandlers中的任务会被task中的“任务”调用。而只有task中的任务进行了实际操作(造成了实际的改变)。对应调用的hardlers任务才会被执行。

 

handlers

#修改Nginx监听的默认端口,并重启服务

---

- hosts: proA

  remote_user: root

  tasks:

  - name: Modify the configuration

linefile:

  path=/etc/nginx/conf.d/test.file.net.conf

  regexp=”listen(.*) 8080(.*)”

  line=”listen1 802”

  backrefs=yes

  backup=yes

notify:

  restart nginx

 

  handlers:

  - name: restart nginx

service:

  name=nginx

  state=restarted

handlers

#多个任务就对应多个notify

---

- hosts: test70

  remote_user: root

  tasks:

  - name: make testfile1

    file: path=/testdir/testfile1

          state=directory

    notify: ht2

  - name: make testfile2

    file: path=/testdir/testfile2

          state=directory

    notify: ht1

 

  handlers:

  - name: ht1

    file: path=/testdir/ht1

          state=touch

  - name: ht2

    file: path=/testdir/ht2

          state=touch

注意:handlers的执行顺序,由handlers任务表中定义的任务顺序决定。tasks notify的顺序不影响handlers任务执行顺序

 

 

一次notify多个handlers

---

- hosts: test70

  remote_user: root

  tasks:

  - name: task1

    file: path=/testdir/testfile

          state=touch

    notify: handler group1

 

  handlers:

  - name: handler1

    listen: handler group1

    file: path=/testdir/ht1

          state=touch

  - name: handler2

    listen: handler group1

    file: path=/testdir/ht2

          state=touch

我们可以把listen的值理解为组名。notify调用的组名。这样一次就调用了handler1handler2

tags

在一个很长的playbook中,只想执行其中的一部分任务或一类任务,就需要tagstags帮助我们给任务打标签。通过在运行.yml文件时,通过对标签的过滤在执行相应任务。

基础写法

---

- hosts: test70

 remote_user: root

 tasks:

 - name: task1

   file:

     path: /testdir/t1

     state: touch

   tags: t1

 - name: task2

   file: path=/testdir/t2

         state=touch

   tags: t2

 - name: task3

   file: path=/testdir/t3

         state=touch

   tags: t3

标签命令一(指定标签)

#只运行tag2的任务

ansible-playbook --tags=t2 file.yml

#只不运行tag2的任务

ansible-playbook --skip-tags=’t2’ file.yml

tages的多种写法

tages还能这样定义:

  tags:

     - t1

  tags: ['t2']

每个tags还能有多个标签:

语法一:

tags:

 - testtag

 - t1

 

语法二:

tags: tag1,t1

 

语法三:

tags: ['tagtest','t2']

不同任务相同标签

不同的任务可以使用相同的标签:

写法一:

---

- hosts: test70

 remote_user: root

 tasks:

 - name: install httpd package

   tags: httpd,package

   yum:

     name=httpd

     state=latest

 

 

 - name: start up httpd service

   tags: httpd,service

   service:

     name: httpd

     state: started

 

写法二:

#tags写在play而非task中时,play中所有task都会继承当前play中的tags。而同时又拥有自己的tags

---

- hosts: test70

 remote_user: root

 tags: httpd

 tasks:

 - name: install httpd package

   tags: ['package']

   yum:

     name=httpd

     state=latest

 

 - name: start up httpd service

   tags:

     - service

   service:

     name: httpd

     state: started

标签命令二(多标签,预览)

调用标签时,可以指定多个标签:

ansible-playbook --tags package,service file.yml

预览playbook中的标签:

ansible-playbook --list-tags file.yml

特殊tag

ansible还有5个特殊的tag

always:假设某任务标签为[“t3”,”always”]。则除非明确“--skip-tags”为t3always。则即使--tags指定没有t3,该任务也会被调用

never2.5版本):只有明确指定--tagsnever,才会调用该任务

tagged:只运行打了标签的任务

untagged只运行没打标签的任务

all:运行所有任务。默认情况下,playbook就如--tags all一样运行

变量

变量名应该由字母、数字、下划线组成。变量名需要以字母开头,ansible内置的关键字不能作为变量名。

我们既可在playbook内通过vars关键字指定变量,也可分离变量文件和playbook

vars指定变量

---

- hosts: test70

  vars:

    testvar1: testfile

  remote_user: root

  tasks:

  - name: task1

    file:

      path: /testdir/{{ testvar1 }}

      state: touch

其余写法:

写法一:

vars:

  testvar1: testfile

  testvar2: testfile2

 

写法二:YMAL的块序列语法

vars:

  - testvar1: testfile

  - testvar2: testfile2

 

写法三:类似属性的方式定义

---

- hosts: test70

  remote_user: root

  vars:

    nginx:

      conf80: /etc/nginx/conf.d/80.conf

      conf8080: /etc/nginx/conf.d/8080.conf

  tasks:

  - name: task1

    file:

      path: "{{nginx.conf80}}"

      state: touch

  - name: task2

    file:

      path: "{{nginx['conf8080']}}"

      state: touch

注意:

如果变量名如{{nginx.conf80}}在使用时,前面无任何路径,则需加双引号“”,反之,则可以不加。当然如果用path=这种写法,也可以不加

变量文件分离

首先定义变量文件nginx_vars.yml。三种示例任选一种

语法一示例:

  testvar1: testfile

  testvar2: testfile2

语法二示例:

  - testvar1: testfile

  - testvar2: testfile2

语法三示例:

nginx:

  conf80: /etc/nginx/conf.d/80.conf

  conf8080: /etc/nginx/conf.d/8080.conf

play_book中使用vars_file关键字导入文件。当然,使用vars_file的同时,也能同时使用vars

---

- hosts: test70

  remote_user: root

  vars_files:

  - /testdir/ansible/nginx_vars.yml

  tasks:

  - name: task1

    file:

      path={{nginx.conf80}}

      state=touch

  - name: task2

    file:

      path={{nginx['conf8080']}}

      state=touch

注册变量

ansible的模块在运行后,其实都会返回一些“返回值”。只是默认情况下,这些“返回值”并不会显示。我们可以将这些返回值写入到某个变量,这样就能够通过引用对应变量而获取到这些返回值。将模块的返回值写入到变量中就被称为“注册变量”。例如:

---

- hosts: test70

 remote_user: root

 tasks:

 - name: test shell

   shell: "echo test > /var/testshellfile"

   register: testvar

 - name: shell module return values

   debug:

     var: testvar

解析:利用register,将shell任务的返回值写入了testvar变量。然后用debug模块,显示变量键值对

提示用户输入信息并写入变量

某些脚本需要用户输入信息以进行交互。这时,我们就需要var_prompt关键字

---

- hosts: test70

 remote_user: root

 vars_prompt:

   - name: "your_name"

     prompt: "What is your name"

   private

   - name: "your_age"

     prompt: "How old are you"

 tasks:

  - name: output vars

    debug:

     msg: Your name is {{your_name}},You are {{your_age}} years old

 

var_prompt变量中可使用private关键字。默认为yes,表示输入不可见。

还能设置提示信息为默认值。就像casedefault选项一样:

---

- hosts: test70

 remote_user: root

 vars_prompt:

   - name: "solution"

     prompt: "Choose the solution you want  ”

     A: solutionA

     B: solutionB

     C: solutionC "

     private: no

     default: A

 tasks:

  - name: output vars

    debug:

     msg: The final solution is {{solution}}.

创建用户的脚本:

---

- hosts: test70

 remote_user: root

 vars_prompt:

   - name: "user_name" #输入用户名

     prompt: "Enter user name"

     private: no

   - name: "user_password" #输入密码

     prompt: "Enter user password"

     encrypt: "sha512_crypt" #encrypt关键字可加密密码。value值是算法。使用这个关键字需要passlib

     confirm: yes #确认密码。即需要输入两次密码

 tasks:

  - name: create user

    user:

     name: "{{user_name}}"

     password: "{{user_password}}"

命令行传入变量

我们在playbook中使用的变量。可以由命令行传入。如果存在同名变量。命令行传入的变量优先级更高。传入变量使用-e--extra-vars选项。可以一次传入多个变量。也可传入变量文件

---

- hosts: test70

 remote_user: root

 tasks:

 - name: "Passing Variables On The Command Line"

   debug:

     msg: "{{pass_var}}"

 

ansible-playbook cmdvar.yml -e 'pass_var="test" pass_var1="test1"'

ansible-playbook cmdvar.yml -e "@/testdir/ansible/testvar"

ansible命令也可以传入变量:

ansible test70 -e "testvar=test" -m shell -a "echo {{testvar}}"

传入的变量除了键值对形式,也支持json的格式:

ansible-playbook cmdvar.yml -e '{"testvar":"test","testvar1":"test1"}'

ansible-playbook cmdvar.yml -e '{"countlist":["one","two","three","four"]}'


以上是关于ansible快速入门的主要内容,如果未能解决你的问题,请参考以下文章

Ansible快速入门

ansible快速入门系列

Ansible 快速入门

linux之Ansible快速入门

Ansible快速入门(下)

Ansible快速入门