暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ansible系列第五篇(变量)

运维开发圈 2018-12-30
932

ansible系列第五篇(变量)

个人博客: http://blog.51cto.com/liyuanjie

变量(1)

注意: 在ubuntu系统经过测试,普通用户和root用户都需要设置密码。
执行playbook脚本时,都需要执行该命令:ansible-playbook -S -R root yaml文件名称

变量由字母,数字,下划线组成。变量名要以字母开头。

  • 在playbook中使用变量

    使用vars关键字,表示在当前play中进行变量的相关设置。
    使用"{{变量名}}" 可以引用对应的变量。

    在定义变量时,以类似"属性"的方式定义变量,例如:

  cat vars.yaml 
  ---
  - hosts: test
    remote_user: yuan
    vars:
      nginx:
        hmmconf: /etc/nginx/conf.d/hmm.conf
        adminconf: /etc/nginx/conf.d/admin.conf
    tasks:
    - name: one
      file:
        path"{{nginx.hmmconf}}"
        state: touch
    - name: two
      file:
        path"{{nginx.adminconf}}"
        state: touch

变量文件分离: 将变量分离到某个文件中,可隐藏某些变量值并将不同类的信息放在不同的文件中,与play剧本分开。

在文件中定义变量时,不要使用vars关键字,直接定义变量即可。例如:

  cat nginx_vars.yaml
  nginx:
    hmmconf: /etc/nginx/conf.d/hmm.conf
    adminconf: /etc/nginx/conf.d/admin.conf

在playbook剧本中引入包含变量的文件时,使用"vars_files" 关键字,被引入的文件要以"-" 开头,以YAML中块序列的语法引入。例如:

  cat nginx-playbook.yaml 
  ---
  - hosts: test
    remote_user: yuan
    vars_files:
    - /home/yuan/fileyaml/vars/nginx_vars.yaml
    tasks:
    - name: one
      file:
        path"{{nginx.hmmconf}}"
        state: touch
    - name: two
      file:
        path"{{nginx['adminconf']}}"
        state: touch

执行nginx的playbook剧本:

  ansible-playbook -S -R root nginx-playbook.yaml

也可以引入多个变量文件,每个被引入的文件都要以"-"开头。

"vars"关键字和"vars_files"关键字可同时使用。

变量(2)

当运行一个playbook时,默认都会运行一个名为[Gathering Facts]的任务,ansible通过这个默认任务收集远程主机的相关信息。收集到的远程主机信息会保存在对应变量中。

  • setup模块

    查看这个默认任务收集的信息可以使用setup模块。

    ansible test -m setup | more

    返回信息比较多,但是都是json格式的字符串。就不一一介绍了,相信各位工程师都可以看懂。

    通过setup模块的filter参数可指定需要过滤的关键字。
    通过关键字对信息进行过滤,例如查看系统信息

    ansible test -m setup -a 'filter=ansible_lsb'

    返回信息为:

  • 使用通配符,进行模糊过滤。

    ansible test -m setup -a "filter=*ip*"
    ansible test -m setup -a "filter=*inter*"

    也可以在远程主机中写入自定义信息,自定义信息需要写在/etc/ansible/facts.d目录下的以".fact"为后缀的文件中,文件内容格式必须是ini或者json格式。

    ansible默认会去远程主机的/etc/ansible/facts.d目录下查找主机中的自定义信息。

    在远程主机创建目录

    sudo mkdir /etc/ansible/facts.d -p
    sudo vim /etc/ansible/facts.d/testnode01.fact
    内容如下:
    [testnode01]
    node=ansible-node01
    host=xiao
    user=yuan

    在被控机本地自定义的信息被称为"local facts".
    可通过"ansible_local"关键字过滤远程主机的"local facts"信息。
    在管控机执行:

    ansible test -m setup -a "filter=ansible_local"

    输出信息为:

  • debug模块

    可以使用msg参数输出自定义信息,也可以使用var参数直接输出变量中的信息。
    例如:

  cat debug.yaml 
  ---
  - hosts: test
    remote_user: yuan
    vars:
      testvars: this is a debug messages.
    tasks:
    - name: debug
      debug:
        var: testvars

使用debug的msg参数时也可以引用变量的值。{{变量名}}。

  cat memory.yaml 
  ---
  - hosts: test
    remote_user: yuan
    tasks:
    - name: debug node01
      debug:
        msg: "ansible-node01 host memory: {{ansible_memory_mb}}"

  执行: ansible-playbook -S -R root memory.yaml

输出信息如下:

变量(3)

  • 注册变量

    注册变量:将模块的返回值写入到变量中的方法。

    使用"register"关键字指定对应的变量名即可。

  cat register.yaml 
  ---
  - hosts: test
    remote_user: yuan
    tasks:
    - name: node01
      shell: "echo 'test node01' > /opt/nodefile"
      register: nodevar
    - name: return nodefile values
      debug:
        var: nodevar

  执行: ansible-playbook -S -R root register.yaml

输出的信息如下:

如果要获取到返回值中的某一项特定值,只需要指定键值对中的key即可。例如: {{nodevar.cmd}}


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

    将用户输入的信息存入指定的变量中,当需要输入信息时,引用对应的变量即可。

  cat input.yaml 
  ---
  - hosts: test
    remote_user: yuan
    vars_prompt:
      - name: "hostname"
        prompt: "remote host hostname"
      - name: "username"
        prompt: "remote host sudo use username"
    tasks:
    - name: output vars
      debug:
        msg: remote hostname is {{hostname}},remote host sudo user is {{username}}

输出信息如下:

命令执行后默认情况下不显示用户输入的信息。要显示用户输入时的信息,可以使用private关键字。将属性设置为no即可。


  • 为提示信息设置默认值

  cat defaultinput.yaml 
  ---
  - hosts: test
    remote_user: yuan
    vars_prompt:
      - name: "qustion"
        prompt: "choose the a you want\n
        A: node01\n
        B: node02\n
        C: node03\n"

        private: no
        default: A
    tasks:
    - name: output vars
      debug:
        msg: please can you answer is {{qustion}}

  执行命令: ansible-playbook -S -R root defaultinput.yaml  可直接回车也可以选择再进行回车操作。

输出信息如下:


  • 用提示信息创建用户和密码

    使用user模块创建用户并设置密码。
    使用"encrypt"关键字,对用户输入的字符串进行哈希。
    encrypt: "sha512_crypt"
    表示使用sha512算法对用户输入的信息进行哈希。

    注意: 当使用"encrypt"关键字对字符串进行哈希时,ansible需要依赖passlib库完成哈希操作。

安装:

python3 -m pip install passlib

也可以用其他算法对字符串进行哈希。参考ansible官网。

例如:

  cat useradd.yaml 
  ---
  - hosts: test
    remote_user: yuan
    vars_prompt:
      - name: "username"
        prompt: "please Enter keybord and input user name"
        private: no
      - name: "user_password"
        prompt: " please input you settings user password"
        private: no
        encrypt: "sha512_crypt"
    tasks:
    - name: create user
      user:
        name"{{username}}"
        password"{{user_password}}"
    - nameoutput passwd hash string
      debug:
        msg: "{{user_password}}"

执行命令: ansible-playbook -S -R root useradd.yaml

输出信息如下:


使用"confirm"关键字实现确认密码的功能。
 在useradd.yaml文件中,encrypt关键字的下方添加confirm关键字,并设置属性为yes即可。

在远程主机18.18.23.102上,用user用户并输入密码即可登录。

变量(4)

  • 在清单中配置变量

  • 主机变量

    配置被控机时也可以配置对应变量。主机变量的生效范围只限于对应主机。

    cat /etc/ansible/hosts 
    [test]
    18.18.23.102 ansible_become_pass='123.cn' node=xiao

    执行命令:ansible test -m shell -a "echo {{node}}"

  • 主机组变量

    将多个主机分为一组。为单个组配置组变量。组变量的使用范围为组内所有主机。也可以用YAML格式配置。使用vars关键字指定组变量,vars对应组的下一级。

    cat /etc/ansible/hosts
    [test]
    test1 ansible_host=18.18.23.101 ansible_become_pass='123.cn' 
    test2 ansible_host=18.18.23.102 ansible_become_pass='123.cn' 

    [test:vars]  # test组配置变量
    master='yuan'
    node='xiao'

    执行结果如下:

  • 通过set_fact定义变量

    set-fact是一个模块,通过set_fact模块在tasks中定义变量。也可以通过set_fact将一个变量的值赋予另一个变量,例如:

  cat setfact1.yaml 
  ---
  - hosts: test
    remote_user: yuan
    vars:
      nodename: testone
    tasks:
    - shell: "echo nodename"
      register: shellreturn
    - set_fact:
      node1: "{{nodename}}"
      node2: "{{shellreturn.stdout}}"
    - debug:
      msg: "{{node1}} {{node2}}"

说明; 先定义变量nodename,再使用register将shell模块的返回值注册到变量shellreturn中,接下来,使用set_fact模块将nodename变量的值赋予给变量node1,将shellreturn变量的stdout信息赋值给node2变量。最后使用debug模块输出node1和node2的值。

变量(5)

  • 清单配置:

  cat /etc/ansible/hosts 
  [test]
  test1 ansible_host=18.18.23.101 ansible_become_pass='123.cn' 
  test2 ansible_host=18.18.23.102 ansible_become_pass='123.cn' 

  • 内置变量ansible_version

    查看ansible版本号

    ansible test2 -m debug -a "msg={{ansible_version}}"

  • 内置变量hostvars

    hostvars在操作当前主机时获取到其他主机中的信息。

    命令行执行:

    ansible test2 -m debug -a "msg={{hostvars}}"

  cat hostvars1.yaml 
  ---
  - name: "get test2"
    hosts: test2
    remote_user: yuan

  - name: "get test2 and get test1"
    hosts: test1
    remote_user: yuan
    tasks:
    - debug:
        msg: "{{hostvars.test2.ansible_ens34.ipv4}}"

执行playbook脚本时,都需要执行该命令:

  ansible-playbook -S -R root hostvars1.yaml

输出test2的ens34网卡的IP信息:

使用gather_facts关键字可以控制当前play是否收集对应主机的facts信息。
 使用hostvars内置变量获取其他主机中的注册变量。例如:

  cat buildvar.yaml 
  ---
  - hosts: test2
    remote_user: yuan
    gather_facts: no
    tasks:
    - shell: "echo register"
      register: shellreturn

  - hosts: test1
    remote_user: yuan
    gather_facts: no
    tasks:
    - debug:
        msg: "{{hostvars.test2.shellreturn.stdout}}"

跨play获取其他主机中的变量信息

  cat factplay.yaml 
  ---
  - hosts: test2
    remote_user: yuan
    gather_facts: no
    tasks:
    - set_fact:
        node: "xiao"
    - debug:
        msg: "{{node}}"

  - hosts: test1
    remote_user: yuan
    gather_facts: no
    tasks:
    - debug:
        msg: "{{hostvars.test2.node}}"

  • 内置变量inventory_hostname

    通过inventory_hostname变量可以获取到被操作的当前主机的主机名称。

  cat /etc/ansible/hosts 
  [test]
  test1 ansible_host=18.18.23.101 ansible_become_pass='123.cn' 
  ansible_host=18.18.23.102 ansible_become_pass='123.cn' 

执行命令:

ansible test -m debug -a "msg={{inventory_hostname}}"

这里的主机名称是对应主机在清单中配置的名称。

  • 内置变量inventory_hostname_short

    获取当前play操作的主机在清单中的名称。
    返回结果为主机的简短名称。

    ansible test -m debug -a "msg={{inventory_hostname_short}}"

  • 内置变量play_hosts

    获取到当前play所操作的所有主机的主机名列表。

  cat /etc/ansible/hosts 
  [test]
  test1 ansible_host=18.18.23.101 ansible_become_pass='123.cn' 
  test2 ansible_host=18.18.23.102 ansible_become_pass='123.cn'

  cat hosts.yaml 
  ---
  - hosts: test1,test2
    remote_user: yuan
    gather_facts: no
    tasks:
    - debug:
        msg: "{{play_hosts}}"

执行hosts.yaml。

总结: inventory_hostname只返回当前被操作的主机的主机名。play_hosts则返回当前play中所有被操作主机的主机名列表。

  • 内置变量groups

    通过groups内置变量获取到清单中"所有分组"的分组信息。

    cat /etc/ansible/hosts
    test1 ansible_host=18.18.23.101 ansible_become_pass='123.cn' 
    test2 ansible_host=18.18.23.102 ansible_become_pass='123.cn' 

    [testA]
    test3 ansible_host=18.18.23.103
    test5 ansible_host=18.18.23.105

    [testB]
    test1 

    [test:children]
    testA
    testB

    执行命令:

    ansible test1 -m debug -a "msg={{groups}}"

    获取指定组的分组信息,例如:获取testA信息

    ansible test1 -m debug -a "msg={{groups.testA}}"

  • 内置变量group_names

    获取当前主机所在分组的组名。

    ansible test1 -m debug -a "msg={{group_names}}"

  • 内置变量inventory_dir

    获取到ansible主机中清单文件的存放路径。
    一般是默认的清单文件路径:/etc/ansible/hosts

    执行命令:
    ansible test1 -m debug -a "msg={{inventory_dir}}"


    坚持自己所选择的,方能成就自己想成就的。或许学英语对有些人很简单,但是对于运维人员来说,也是一项不小的挑战。往往最新最火的技术就在官方英文文档中,虽然现在的翻译软件很多,但翻译出来的句子大部分有点词不达意,导致自己误解了官网文档的正确意思。学好英语和思考能力是必不可缺的。小编也会尽量每周更新一篇文章和一小段每日英语,希望能够帮助更多的读者。

每日英语(Daily English Tips)(1)

1-100的英文单词如下:

1 one2 two3 three
4 four5 five6 six
7 seven8 eight9 nine
10 ten11 eleven12 twelve
13 thirteen14 fourteen15 fifteen
16 sixteen17 seventeen18 eighteen
19 nineteen20 twenty21 twenty-one
22 twenty- two23 twenty- three24 twenty- four
25 twenty- five26 twenty- six27 twenty- seven
28 twenty- eight29 twenty- nine30 thirty
31 thirty- one32 thirty- two33 thirty- three
34 thirty- four35 thirty- five36 thirty- six
37 thirty- seven38 thirty- eight39 thirty- nine
40 forty41 forty- one42 forty- two
44 forty- four45 forty- five46 forty- six
47 forty- seven48 forty- eight49 forty- nine
50 fifty51 fifty- one52 fifty- two
53 fifty- three54 fifty- four55 fifty- five
56 fifty- six57 fifty- seven58 fifty- eight
59 fifty- nine60 sixty61 sixty- one
62 sixty- two63 sixty- three64 sixty- four
65 sixty- five66 sixty- six67 sixty- seven
68 sixty- eight69 sixty- nine70 seventy
71 seventy- one72 seventy- two73 seventy- three
74 seventy- four75 seventy- five76 seventy- six
77 seventy- seven78 seventy- eight79 seventy- nine
80 eighty81 eighty- one82 eighty- two
83 eighty- three84 eighty- four85 eighty- five
86 eighty- six87 eighty- seven88 eighty- eight
89 eighty- nine90 ninety91 ninety-one
92 ninety- two93 ninety- three94 ninety- four
95 ninety- five96 ninety- six97 ninety- seven
98 ninety- eight99 ninety- nine100 hundred


文章转载自运维开发圈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论