Ansible_playbook_变量和变量引用


#
# Topic: playbook 基本语法和常用命令
# State:
# 1. Ansible playbook 脚本编写方法
# 2. Playbook是Ansible的最和兴的功能组件
# 3. Ansible 的配置管理和应用部署工作都是通过playbook来完成的
# Testing environment:
# OS: RHEL6.6
# Python: python2.7.5
# Ansible: ansible 2.3.1.0
# Nodes: 3
#
# 1. Playbook 基础语法

    1. Playbook 基础语法:
    • 必备基础: YAML语法 #Playbook使用YAML语法编写的Ansible脚本

    • Playbook运行命令: ansible-playbook
      # 示例: ansible-playbook first_demo.yaml

    • Playbook语法检查: ansible-playbook playbook_name --syntax-check
      # 示例: ansible-playbook first_demo.yaml --syntax-check

    • 列出Playbook中的任务: ansible-playbook playbook_name --list-
      # 示例: ansible-playbook base_playbook1.yaml --list-task

    • 列出Playbook文件中任务的目标主机: ansible-playbook --list-hosts
      # 示例: ansible-playbook base_playbook1.yaml --list-

    • 运行Playbook某个特定的task: ansible-playbook --start-at-task="task_name"
      # 示例: ansible-project]# ansible-playbook -i /etc/ansible/hosts base_playbook2.yaml -f 10 --start-at-task="check if the httpd is running"

    • 其他命令选项:

      • -f: 指定任务运行的并发数
      • -i: 指定playbook运行使用的inventory
    • 完整示例:
      ...
      ######################## Example Start ##########################


# Install Nginx

  • name: Install Nginx # play名称
    hosts: tomcat # 目标主机,支持patterns
    remote_user: root # 远程ssh认证主机
    sudo: yes # 是否启用sudo
    sudo_user: ansible # sudo权限用户
    gather_facts: no # 是否收集facts信息
    accelerate: no # 是否启用加速模式
    accelerate_port: 5999 # 如果启用加速模式,那么需要设置端口
    connection: local # 设置链接方式
    serial: 15 # 设置playbook的并发数
    vars: # 设置playbook变量
    nginx_port: 83
    vars_files:
    • "vars.yml"
    • [ "one.yml", "two.yml" ]
      vars_prompt:
    • name: "password vaes"
      # prompt: "Enter password"
      # default: "secret"
      # private: yes
      # encrypt: "md5_crypt"
      # confirm: yes
      # salt: 1234
      # salt_size: 8
      #
      pre_tasks: # 设置taks运行之前的task
    • name: pre_tasks
      shell: hostname
      roles: # 引入role
    • tomcat:
    • { role: tomcat, version: '9.0', when: "ansible_system =='linux', tags: [tomcat, install]"}
    • { role: tomcat, when: ansible_all_ipv4_addresses == "192.16.1.1" }
      tasks:
    • include: tasks.yaml
    • include: tasks.yaml ansible_distribution="CentOS" ansible_distribution_version='6.6'
    • { include: tasks.yaml, version: '1.1', package: [nginx, httpd] }
    • include: tasks_192.168.1.117.yaml
      when: ansible_all_ipv4_addresses == '192.168.1.117'
      post_tasks: # 设置运行之后的task
    • naem: post_tasks
      shell: hostname
      handlers: # 设置handler
    • include: handlers.yml

######################## Example End ############################
...

# Playbook 中的变量和变量引用

    1. Playbook 中的变量和引用
    • 2.1 通过Inventory来定义host和group变量
      # 说明:
      # 1. host 变量只对当前host起作用
      # 2. group 变量对组内的所有host起作用

# 示例Inventory定义
#[tomat]
#ansible1
#ansible2
#ansible3
#
#[tomat:vars]
# inventory_name=michael_chacki
# 示例playbook:
# ---
# # show vars
# - name: the frist play
# hosts: tomat
# remote_user: root
# gather_facts: false
# tasks:
# - name: the first task
# debug: msg="The hostname is {{inventory_hostname}} and the key is {{ key }}, the inventory_name is {{ inventory_name }}"

  • 2.2 通过/etc/ansible下的文件来定义host和group变量
    • host变量定义步骤
        1. 新建文件夹host_vars
        1. 创建以hostname命名的文件
        1. 在步骤2中创建的文件中定义变量
      • group变量定义
          1. 新建文件夹group_vars
          1. 创建以groupname命名的文件
          1. 在步骤2中创建的文件中定义变量
      • 变量引用
        {{变量名}}
        #说用: 1. 创建的变量文件名必须是在inventory中存在的host或是group
        # 2. 如果变量没有被覆盖,那么就可以引用到
        # 3. 变量文件内容必须以YAML的格式编写
        #
        #示例:
        # 文件结构:
        # group_vars
        # └── tomcat
        # host_vars
        # ├── ansible1
        # ├── ansible2
        # └── ansible3
        # 定义变量:
        # ---
        # group_key: michael.lin
        # ---
        # key: michael1
        # ---
        # key: michael2
        # ---
        # key: michae
        # ...
        # 引用变量:
        # ---
        # show_vars.yaml
        # - name: show the host ans group vars
        # remote_user: root
        # hosts: tomcat
        # gather_facts: false
        # tasks:
        # - name: show host vars
        # debug: msg="The current host {{ inventory_hostname }}''key value is {{ key }}"
        # - name: show group vars
        # debug: msg="The current group {{ current_group_name }} ''group name is {{ group_name }}"
        # ...
        #
  • 2.3 使用ansible-playbook中引入变量
    • 2.3.1 在命令行定义变量传入
      • 例如:ansible-playbook show_vars.yaml -e "key='Hello world' group_key=ansible"
    • 2.3.2 在命令行通过文件的方式传入,支持json和YAML
      • 例如:ansible-playbook show_vars.yaml -e "@var.yaml"
        #
  • 2.4 在playbook中通过vars定义变量
    # 示例如下:
    ...

# show_vars.yaml

  • name: show the host ans group vars
    remote_user: root
    hosts: tomcat
    gather_facts: false
    vars:
    key: 'I am Jin ge'
    group_key: 'I am a group'
    tasks:
    • name: show host vars
      debug: msg="The current host {{ inventory_hostname }}''key value is {{ key }}"
    • name: show group vars
      debug: msg="The current group {{ group_key }} ''group name is {{ group_key }
      ...
      # Playbook 中的循环
  • 2.5 通过vars_files来引用变量
    • 说明
        1. 变量列表是列表形式
    • 步骤
        1. 定义变量文件,yaml或是json格式
        1. 在playbook 中使用vars_files 引用变量文件
    • 示例
      ...

# show_vars.yaml

  • name: show the host ans group vars
    remote_user: root
    hosts: tomcat
    gather_facts: false
    vars:
    key: 'I am Jin ge'
    group_key: 'I am a group'
    vars_files:
    • var.yaml
      tasks:
    • name: show host vars
      debug: msg="The current host {{ inventory_hostname }}''key value is {{ key }}"
    • name: show group vars
      debug: msg="The current group {{ group_key }} ''group name is {{ group_key }}"
      ...
  • 2.6 使用register 在task之间传递变量
    • 功能:在不同的task之间传递变量
    • 使用场景:一个task需要根据上一个task的变量来决定是否运行
    • 定义步骤
        1. 在上一个任务运行完成后,使用register定义变量
        1. 当任务运行完成后会将运行结果保持到注册的变量中
        1. 返回的是一个字典格式的变量,可以通过python字典引用元素的方式引用
    • 示例

# show register vars

  • name: show register vars
    hosts: tomcat
    remote_user: root
    gather_facts: false
    tasks:

    • name: register var
      shell: hostname
      register: info
    • name: show var from task above
      debug: msg={{info['stdout']}}
      ...
  • 2.7 通过vars_prompt 交互的方式传入变量
    # 该方式不做介绍了

  • 同名变量的优先级

      1. extra vars(命令中-e)最优先
      1. inventory 主机清单中连接变量(ansible_ssh_user 等)
      1. play 中 vars、vars_files 等
      1. 剩余的在 inventory 中定义的变量
      1. 系统的 facts 变量
      1. 角色定义的默认变量(roles/rolesname/defaults/main.yml)
    1. Playbook 中的循环
    • 见其他文档
      # 4. Playbook 中条件分支
    1. Playbook 中条件分支
    • 见其他文档
      # 5. Jinja2 过滤器
    1. Jinja2 过滤器
    • 见其他文档
      # 6. Playbook中的内置变量
    1. Playbook中的内置变量
    • 见其他文档
      # 总结
  • 总结

    • 见其他文档
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249

推荐阅读更多精彩内容