ansible快速入门

文档下载

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

参考文档

朱双印我的日志-ansible(本文总结于此)node

很是好的Ansible入门教程(超简单)python

ansible官网nginx

ansible基础概念

ansible是什么?

是一个“配置管理工具”,是一个“自动化运维工具”。它能帮助咱们在许多远程主机上,完成一些批量任务,或者一些须要常常重复的工做正则表达式

ansible的幂特性

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

须要安装什么

ansible经过SSH链接到受管主机进行操做。只有管理主机须要安装ansible软件。shell

ansible的模块

ansible对主机的各类操做都是经过模块来完成的,好比“ping”模块,“file”模块,“yum”模块等等。能够把模块理解为咱们在受管主机上执行的命令。既然是命令,这些模块也有参数供咱们使用。json

playbook(剧本)

       咱们在执行ansible命令时,能够把须要条针对不一样主机的命令,编写成一个playbook。这个playbook咱们能够理解为脚本。它是用YAML格式编写的。经过playbook,咱们能够针对不一样主机,或是不一样组(组里有不一样的主机),来指定要作的事。windows

除了这个功能外,还有bash

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=”listen\1 80\2”

  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 \n”

     A: solutionA\n

     B: solutionB\n

     C: solutionC\n"

     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"]}'

相关文章
相关标签/搜索