Ansible_playbook_變量和變量引用


#
# Topic: playbook 基本語法和常用命令
# State:
# 1. Ansible playbook 腳本編寫方法
# 2. Playbook是Ansible的最和興的功能組件
# 3. Ansible 的配置管理和應(yīng)用部署工作都是通過playbook來完成的
# Testing environment:
# OS: RHEL6.6
# Python: python2.7.5
# Ansible: ansible 2.3.1.0
# Nodes: 3
#
# 1. Playbook 基礎(chǔ)語法

    1. Playbook 基礎(chǔ)語法:
    • 必備基礎(chǔ): YAML語法 #Playbook使用YAML語法編寫的Ansible腳本

    • Playbook運(yùn)行命令: ansible-playbook
      # 示例: ansible-playbook first_demo.yaml

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

    • 列出Playbook中的任務(wù): ansible-playbook playbook_name --list-
      # 示例: ansible-playbook base_playbook1.yaml --list-task

    • 列出Playbook文件中任務(wù)的目標(biāo)主機(jī): ansible-playbook --list-hosts
      # 示例: ansible-playbook base_playbook1.yaml --list-

    • 運(yùn)行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"

    • 其他命令選項(xiàng):

      • -f: 指定任務(wù)運(yùn)行的并發(fā)數(shù)
      • -i: 指定playbook運(yùn)行使用的inventory
    • 完整示例:
      ...
      ######################## Example Start ##########################


# Install Nginx

  • name: Install Nginx # play名稱
    hosts: tomcat # 目標(biāo)主機(jī)抠刺,支持patterns
    remote_user: root # 遠(yuǎn)程ssh認(rèn)證主機(jī)
    sudo: yes # 是否啟用sudo
    sudo_user: ansible # sudo權(quán)限用戶
    gather_facts: no # 是否收集facts信息
    accelerate: no # 是否啟用加速模式
    accelerate_port: 5999 # 如果啟用加速模式存谎,那么需要設(shè)置端口
    connection: local # 設(shè)置鏈接方式
    serial: 15 # 設(shè)置playbook的并發(fā)數(shù)
    vars: # 設(shè)置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: # 設(shè)置taks運(yùn)行之前的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: # 設(shè)置運(yùn)行之后的task
    • naem: post_tasks
      shell: hostname
      handlers: # 設(shè)置handler
    • include: handlers.yml

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

# Playbook 中的變量和變量引用

    1. Playbook 中的變量和引用
    • 2.1 通過Inventory來定義host和group變量
      # 說明:
      # 1. host 變量只對當(dāng)前host起作用
      # 2. group 變量對組內(nèi)的所有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. 創(chuàng)建以hostname命名的文件
        1. 在步驟2中創(chuàng)建的文件中定義變量
      • group變量定義
          1. 新建文件夾group_vars
          1. 創(chuàng)建以groupname命名的文件
          1. 在步驟2中創(chuàng)建的文件中定義變量
      • 變量引用
        {{變量名}}
        #說用: 1. 創(chuàng)建的變量文件名必須是在inventory中存在的host或是group
        # 2. 如果變量沒有被覆蓋,那么就可以引用到
        # 3. 變量文件內(nèi)容必須以YAML的格式編寫
        #
        #示例:
        # 文件結(jié)構(gòu):
        # 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 中的循環(huán)
  • 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需要根據(jù)上一個task的變量來決定是否運(yùn)行
    • 定義步驟
        1. 在上一個任務(wù)運(yùn)行完成后恃鞋,使用register定義變量
        1. 當(dāng)任務(wù)運(yùn)行完成后會將運(yùn)行結(jié)果保持到注冊的變量中
        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 交互的方式傳入變量
    # 該方式不做介紹了

  • 同名變量的優(yōu)先級

      1. extra vars(命令中-e)最優(yōu)先
      1. inventory 主機(jī)清單中連接變量(ansible_ssh_user 等)
      1. play 中 vars告抄、vars_files 等
      1. 剩余的在 inventory 中定義的變量
      1. 系統(tǒng)的 facts 變量
      1. 角色定義的默認(rèn)變量(roles/rolesname/defaults/main.yml)
    1. Playbook 中的循環(huán)
    • 見其他文檔
      # 4. Playbook 中條件分支
    1. Playbook 中條件分支
    • 見其他文檔
      # 5. Jinja2 過濾器
    1. Jinja2 過濾器
    • 見其他文檔
      # 6. Playbook中的內(nèi)置變量
    1. Playbook中的內(nèi)置變量
    • 見其他文檔
      # 總結(jié)
  • 總結(jié)

    • 見其他文檔
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末栈幸,一起剝皮案震驚了整個濱河市愤估,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌速址,老刑警劉巖玩焰,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異芍锚,居然都是意外死亡昔园,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門并炮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來默刚,“玉大人,你說我怎么就攤上這事逃魄∠劭茫” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵嗅钻,是天一觀的道長皂冰。 經(jīng)常有香客問我,道長养篓,這世上最難降的妖魔是什么秃流? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮柳弄,結(jié)果婚禮上舶胀,老公的妹妹穿的比我還像新娘。我一直安慰自己碧注,他們只是感情好嚣伐,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著萍丐,像睡著了一般轩端。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逝变,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天基茵,我揣著相機(jī)與錄音奋构,去河邊找鬼。 笑死拱层,一個胖子當(dāng)著我的面吹牛弥臼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播根灯,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼径缅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了烙肺?” 一聲冷哼從身側(cè)響起纳猪,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茬高,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體假抄,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怎栽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宿饱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熏瞄。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谬以,靈堂內(nèi)的尸體忽然破棺而出强饮,到底是詐尸還是另有隱情,我是刑警寧澤为黎,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布邮丰,位于F島的核電站,受9級特大地震影響铭乾,放射性物質(zhì)發(fā)生泄漏剪廉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一炕檩、第九天 我趴在偏房一處隱蔽的房頂上張望斗蒋。 院中可真熱鬧,春花似錦笛质、人聲如沸泉沾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跷究。三九已至,卻和暖如春敲霍,著一層夾襖步出監(jiān)牢的瞬間揭朝,已是汗流浹背队贱。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留潭袱,地道東北人柱嫌。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像屯换,于是被迫代替她去往敵國和親编丘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容