虚拟化容器,大数据,DBA,中间件,监控。

Ansible 中的register注册变量 var_prompt交互变量 命令行传入变量

20 05月
作者:admin|分类:系统运维

一、register注册变量

ansible的模块在运行之后,其实都会返回一些”返回值”,我们可以把这些返回值写入到某个变量中,这样我们就能够通过引用对应的变量从而获取到这些返回值了,这种将模块的返回值写入到变量中的方法被称为”注册变量”,

[root@server4 ~]# vim bl_test.yml[root@server4 ~]# cat bl_test.yml ---
- hosts: testB
  remote_user: root
  tasks:
  - name: test shell
    shell: "echo test > /var/testshellfile"
    register: testvar
  - name: shell module return values
    debug:
      var: testvar12345678910111213

使用”register”关键字将当前shell任务的返回值写入了名为”testvar”的变量中,第二个任务使用debug模块输出了第一个任务中的注册变量的值,
在这里插入图片描述从上述返回信息可以看出,返回值是json格式的,上述返回值中包含一些键值对,比如 “changed”: true 或 “cmd”: “echo test > /var/testshellfile”等, 如果你只是想要获取到返回值中的某一项特定值,只需要指定键值对中的key即可,假设,我只是想要获取到上述返回信息中cmd的值,则可以使用如下两种语法

语法一

  - name: shell module return values
    debug:
      msg: "{{testvar.cmd}}"123

语法二

  - name: shell module return values
    debug:
      msg: "{{testvar['cmd']}}"123

以下是对语法一的示例:

[root@server4 ~]# vim bl_test.yml[root@server4 ~]# cat bl_test.yml ---
- 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}}"123456789101112

在这里插入图片描述

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

提示用户输入信息,然后将用户输入的信息存入到指定的变量中,

[root@server4 ~]# vim bl_test2.yml[root@server4 ~]# cat bl_test2.yml ---
- hosts: testB
  remote_user: root
  vars_prompt:
    - name: "your_name"
      prompt: "What is your name"
    - 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.123456789101112131415

使用”vars_prompt”关键字创建了两个变量,这两个变量的名称分别为”your_name” 和 “your_age”,当运行上例playbook时,会出现 “What is your name”的提示信息,然后用户输入的信息会存入到”your_name”变量中,之后,会出现 “How old are you”的提示信息,用户输入的信息会存入到”your_age”变量中,上例中的”output vars”任务会输出一句话,这句话中包含了上述两个变量的值,我们来看一下上例的执行效果。
在这里插入图片描述

三、交互式远程创建用户playbook实战

我们提到可以利用提示信息让用户设置密码,有了这项功能,我们就可以编写出一个playbook,这个playbook可以让用户手动输入用户名和密码,然后根据用户输入的信息去创建系统用户了,创建系统用户可以使用user模块,前文已经总结过user模块,此处不再赘述,那么我们来尝试编写一个可交互创建系统用户的playbook:

[root@server4 ~]# vim user_add.yml[root@server4 ~]# cat user_add.yml ---
- hosts: testB
  remote_user: root
  vars_prompt:
    - name: "user_name"
      prompt: "Enter user name"
      private: no
    - name: "user_password"
      prompt: "Enter user password"
  tasks:
   - name: create user
     user:
      name: "{{user_name}}"
      password: "{{user_password}}"1234567891011121314151617

user模块的password参数虽然可以指定用户的密码,但是password参数对应的值必须是一个”明文密码哈希过后的字符串”,用户经过提示后输入的密码字符串并未经过哈希操作,所以,即使通过上述playbook可以创建用户,创建后的用户也无法通过设置的密码进行登录,因为保存在/etc/shadow文件中的密码字段是一个未哈希的明文的密码字段,我们可以使用”encrypt”关键字,对用户输入的字符串进行哈希,用户输入的信息被哈希以后会存入对应的变量中

[root@server4 ~]# vim bl_test5.yml[root@server4 ~]# cat bl_test5.yml ---
- hosts: testB
  remote_user: root
  vars_prompt:
    - name: "hash_string"
      prompt: "Enter something"
      private: no
      encrypt: "sha512_crypt"
  tasks:
   - name: Output the string after hash
     debug:
      msg: "{{hash_string}}"12345678910111213141516

encrypt关键字表示对用户输入的信息进行哈希,encrypt: “sha512_crypt”表示使用sha512算法对用户输入的信息进行哈希,哈希后的字符串会存入到上例中的”hash_string”变量中,利用encrypt关键字,就可以解决之前遇到的创建用户时指定密码字符串的问题,但是需要注意,当使用”encrypt”关键字对字符串进行哈希时,ansible需要依赖passlib库完成哈希操作,如果未安装passlib库(一个用于哈希明文密码的python库),执行playbook时会报如下错误

为了能够正常执行上述playbook,需要先安装passlib库。

此处通过pip安装passlib库,由于当前主机也没有安装pip,所以先下载安装pip[root@server4 ~]# yum install wget -y[root@server4 ~]# wget https://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz[root@server4 ~]# tar zxf setuptools-0.6c11.tar.gz [root@server4 ~]# tar zxf pip-20.0.2.tar.gz [root@server4 ~]# cd pip-20.0.2[root@server4 pip-20.0.2]# python setup.py installpip安装完成后,通过pip安装passlib库[root@server4 pip-20.0.2]# pip install passlib123456789101112

四、通过命令行传入变量

命令行传入的变量的优先级要高于playbook中的变量,

[root@server4 ~]# vim bl_test6.yml[root@server4 ~]# cat bl_test6.yml ---
- hosts: testB
  remote_user: root
  tasks:
  - name: "Passing Variables On The Command Line"
    debug:
      msg: "{{pass_var}}"12345678910

上例中的playbook中,并没有定义pass_var变量,而是直接引用了pass_var变量,我们可以在调用上述playbook时直接从命令行传入pass_var变量,方法如下

ansible-playbook bl_test6.yml  --extra-vars "pass_var=redhat"ansible-playbook bl_test7.yml  --e "pass_var=redhat"123

如上例所示,在调用playbook时使用 –extra-vars选项可以传递对应的变量与变量值, –extra-vars是长选项,对应的短选项是-e,我们也可以一次性传入多个变量,变量之间用空格隔开,如下

ansible-playbook bl_test6.yml  --extra-vars 'pass_var="redhat" num_var="westos"'1

不仅ansible-playbook命令可以使用”-e”传递变量,ansible命令也同样可以,所以在执行ad-hoc命令时也可以使用同样的方法传入变量,如下

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

上述的几个示例从命令行中传递变量时,都是使用了”key=value”的形式,除了使用”key=value”的方式传递变量,ansible还支持通过json的格式传入变量,示例如下

通过json格式传入两个变量

 ansible-playbook bl_test6.yml -e '{"pass_var":"test","num_var":"test1"}'1
浏览1101 评论0
返回
目录
返回
首页
MySQL5表结构与数据迁移到Oracle11g ansible中handlers和notify结合使用触发条件