playbook中的应用变量&获取远程主机信息&debug模块&Ansible内置变量

1、定义变量

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

2、在playbook中引入变量

如果我们想要在某个play中定义变量,可以借助vars关键字

  • 示例一:在playbook中引入一个变量
  • ansible yaml文件校验 ansible vars_主机名


  • ansible yaml文件校验 ansible vars_ansible yaml文件校验_02


  • ansible yaml文件校验 ansible vars_主机名_03

  • 示例二:定义多个变量
  • ansible yaml文件校验 ansible vars_python_04


  • ansible yaml文件校验 ansible vars_命令行_05


  • ansible yaml文件校验 ansible vars_python_06

  • 示例三:定义变量参数
  • 语法一:
"{{httpd.conf80}}"
  • 语法二
{{httpd['conf8080']}}

ansible yaml文件校验 ansible vars_ansible yaml文件校验_07


ansible yaml文件校验 ansible vars_主机名_08


ansible yaml文件校验 ansible vars_命令行_09


ansible yaml文件校验 ansible vars_python_10


ansible yaml文件校验 ansible vars_ansible yaml文件校验_11


ansible yaml文件校验 ansible vars_主机名_12

  • 示例四:文件变量分离
    如果我们定义了变量,但又不想把变量的值直接写在剧本里,可以采用这种方法:将变量的值写在文件中
    注意:文件名也是要以.yaml结尾,而文件中的语法也要使用YAML语法。



    注意:
    (1)vars_ files关键字也可以引入多个变量文件,每个被引入的文件都需要以"- "开头。
    (2)vars关键字和vars_ files关键字可以同时使用,即可以同时出现在一个yaml文件中,分别引用不同的变量和变量文件。

3、获取远程主机信息

ansible yaml文件校验 ansible vars_python_13


ansible yaml文件校验 ansible vars_ansible yaml文件校验_14


注意:我们会发现每次执行playbook时都会有TASK [Gathering Facts]的动作,这个动作是在收集主机信息,是系统自动帮我们添加的setup模块

  • 同样我们可以手动的去获取远程主机的信息
  • 由于获取到的远程主机的信息比较多,我们也可以获取指定信息
  • 除了上述系统中的信息,我们还可以在远程主机中写入一些自定义的信息,但是这些自定义信息必须写在远程主机的/etc/ansible/facts.d路径下,并且文件必须以.fact结尾,文件内容使用INI语法或者JSON语法,这些自定义在ansible管理主机上获取时,其名称为ansible_local信息

ansible yaml文件校验 ansible vars_主机名_15


ansible yaml文件校验 ansible vars_python_16


注意:如果我们将测试文件移动到别的目录中(即本地信息不在默认路径下),需要在查找信息时加上fact_path=存放文件的目录路径

ansible yaml文件校验 ansible vars_python_17


ansible yaml文件校验 ansible vars_主机名_18

4、debug模块

  • 在操作行中输出我们指定的信息
  • debug结合变量使用
  • 在操作行输出指定信息和变量的值
  • debug结合变量获得远程主机信息
  • 指定获取ansible_memory_mb信息中的real模块

    当我们查看信息时会有三部分内容nocache、real、swap
  • 查看到ansible_memory_mb信息中的real模块

5、注册变量

  • 注册变量:将模块的返回值引用到变量中的方法
  • 将模块返回值输出在操作行中:
#写法而二:

---
- hosts: testB
  remote_user: root
  tasks:
  - name: test shell
    shell: "echo test > /var/testshellfile"
    register: testvar
  - name: shell module return values
    debug:
      msg: "{{testvar}}"
  • 取返回值中指定信息
#写法二:
---
- hosts: testB
  remote_user: root
  tasks:
  - name: test shell
    shell: "echo test > /var/testshellfile"
    register: testvar
  - name: shell module return values
    debug:
      msg: "{{testvar['cmd']}}"
  • 获取用户输入信息并返回(vars_prompt)


    如果想要让输入的信息回显,则需要添加参数private: no
  • 当用户不输入信息时设置默认值(default)

  • 在playbook中直接引用变量,而在命令行中定义变量


    引用多个变量


    如果在playbook中定义了变量,又在命令行中定义变量,会返回命令行定义的结果,命令行的优先级高于playbook
  • 还可以在命令行中定义和调用变量
  • 在文件中定义变量

  • 之前定义变量时都是与tasks处于同级,在tasks外面定义然后在tasks内部调用。如果要在tasks内部定义,就要使用set_fact关键字
  • 注册变量的值可以赋给另一个变量


  • 用set_fact定义的变量可以在另一个部分中使用,但vars定义的不可以
  • 注册变量也可以在其他部分使用
  • 练习:如何利用前面学的内容写一个剧本,输入用户名和密码,然后在远程主机创建对应的用户?
    之前在user模块中,创建用户时密码不能是明文密码,是要经过加密的,但在这里我直接明文密码创建了用户。如何解决这一问题?
    此时需要借助python的模块,并且我们需要到python的官网下载pip的包
wget https://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz
tar zxf setuptools-0.6c11.tar.gz
tar zxf pip-20.0.2.tar.gz
cd pip-20.0.2
ls
python setup.py install
pip install passlib

ansible yaml文件校验 ansible vars_python_19

  • 完成以上操作后,我们先写一个剧本测试以下加密功能


    此时我们修改一下创建用户的剧本


    encrypt: "sha512_crypt"的作用是加密,而confirm: yes的作用是让用户重复输入两次

6、ansible内置变量

  • ansible内部已经内置了一些变量,方便我们来直接使用
  • 获取ansible版本信息
  • 获取被操作当前主机的主机名
    注意:这里获取的主机名不是linux系统的主机名,而是写在ansible清单中的主机名
  • 获取test-group组中的主机名
  • 获取test-group组中的主机名(短名,即第一个.之前的内容)
  • 查看ansible清单中的分组情况(本地)
    首先编辑ansible清单文件,写好分组:
  • 查看testA组的主机和test组的主机
  • 查看未分组的主机
  • 查看指定主机所在组的名称
  • 查看本地ansible清单保存的路径