运维开发网

ansible变量vars/vars_files

运维开发网 https://www.qedev.com 2020-09-04 12:58 出处:51CTO 作者:菜机运维
对于重复使用而且复杂的参数值,可以定义变量引用,便于管理和修改,也可以创建文件存放变量,引用变量文件即可示例如下[[email protected]]#tree..├──ansible.cfg├──backup│└──backup.sh├──hosts├──roles├──vars============>存放变量的目录│└──httpd.yml=========>存放变量的文件└

对于重复使用而且复杂的参数值,可以定义变量引用,便于管理和修改,也可以创建文件存放变量,引用变量文件即可

示例如下

[[email protected] ansible]# tree .

.

├── ansible.cfg

├── backup

│   └── backup.sh

├── hosts

├── roles

├── vars ============>存放变量的目录

│   └── httpd.yml =========>存放变量的文件

└── work ===========================>工作目录

├── apache_config_1.yml

├── apache_config.yml

├── apache_create.yml

├── apache_remove.yml

变量写法要主要格式和缩进

[[email protected] ansible]# cat vars/httpd.yml

#apache vars

apache:

conf: /etc/httpd/conf/httpd.conf

vhost: /etc/httpd/vhost

引用方法:

"{{apache.conf}}"

如下方式创建apache的虚拟主机

需要注意的是对同一文件多次blockin时,marker很重要,否则会覆盖上次插入的内容

[[email protected] ansible]# cat work/apache_config.yml


  • hosts: jack6-2

    remote_user: root

    vars_files:

    • /etc/ansible/vars/httpd.yml

      tasks:

    • name: insert line

      blockinfile:

      path: "{{apache.conf}}"

      block: "Listen 8888\nInclude vhost/*.conf"

      insertafter: EOF

      marker: "#{mark} 8888"

    • name: cat

      shell: grep ^Include {{apache.conf}}

    • name: DocumentRoot

      file:

      path: "{{apache.droot}}"

      state: directory

    • name: insert block

      blockinfile:

      path: "{{apache.vconf}}"

      block: "<VirtualHost *:8888>\n\tDocumentRoot /data/www/html\n\tServerName myvhost.com\n\t<Directory /data/www/html>\n\t\tAllowOverride None\n\t\tRequire all granted\n\t\tSatisfy Any\n\t\tOrder allow,deny\n\t\tAllow from all\n\t</Directory>\n</VirtualHost>"

      insertbefore: BOF

      backup: yes

      notify: reload_httpd

    • meta: flush_handlers
    • name: insert content

      blockinfile:

      path: "{{apache.vhtml}}"

      block: "Hello my bro! Welcome to My Website."

      insertbefore: BOF

      create: yes

      marker: "#{mark} WHAT FCK"

      backup: yes

    handlers:

    • name: reload_httpd

      service:

      name: httpd

      state: reloaded

###########################################################################

当我们需要使用testvar1的变量值时,则需要引用这个变量,如你所见,使用"{{变量名}}"可以引用对应的变量。

也可以定义多个变量,示例如下。

Shell

vars:

testvar1: testfile

testvar2: testfile2

1

2

3

vars:

testvar1: testfile

testvar2: testfile2

除了使用上述语法,使用YAML的块序列语法也可以定义变量,示例如下

Shell

vars:

  • testvar1: testfile
  • testvar2: testfile2

    1

    2

    3

    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


  • 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配置文件路径

当我们需要引用这两个变量时,有两种语法可用

语法一

Shell

"{{nginx.conf80}}"

1

"{{nginx.conf80}}"

语法二

Shell

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

1

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

而在上述后面的示例中引用变量时,变量被引用时如下,处于"开头的位置"

Shell

path: "{{nginx.conf80}}"

1

path: "{{nginx.conf80}}"

这种情况下,我们引用变量时必须使用双引号引起被引用的变量,否则会报语法错误

"vars"关键字和"vars_files"关键字可以同时使用,如下

Shell

vars:

  • conf90: /etc/nginx/conf.d/90.conf

    vars_files:

  • /testdir/ansible/nginx_vars.yml

    vars:

  • conf90: /etc/nginx/conf.d/90.conf

    vars_files:

  • /testdir/ansible/nginx_vars.yml

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号