日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Ansible之Playbook使用

發(fā)布時間:2024/1/1 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Ansible之Playbook使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、Playbook是什么

playbook-劇本(也稱編排) 介紹

playbooks是 一個不同于使用Ansible命令行執(zhí)行方式的模式,其功能更強大靈活。簡單來說,playbook是一個非常簡單的配置管理和多主機部署系統(tǒng),不同于任何已經(jīng)存在的模式,可作為一個適合部署復(fù)雜應(yīng)用程序的基礎(chǔ)。Playbook可以定制配置,可以按照指定的操作步驟有序執(zhí)行,支持同步和異步方式。我們完成一個任務(wù),例如安裝部署一個httpd服務(wù),我們需要多個模塊(一個模塊也可以稱之為task)提供功能來完成。而playbook就是組織多個task的容器,他的實質(zhì)就是一個文件,有著特定的組織格式,它采用的語法格式是YAML(Yet Another Markup Language)。YAML語法能夠簡單的表示散列表,字典等數(shù)據(jù)結(jié)構(gòu)。具體請參考YAML詳細語法。

YAML基本語法

列表:每一個列表成員前面都要有一個短橫線和一個空格。

fruits:
? ? - Apple
? ? - Orange
? ? - Strawberry
? ? - Mango

或者:
fruits: ['Apple', 'Orange', 'Strawberry', 'Mango']

字典:每一個成員由鍵值對組成,注意冒號后面要有空格。

martin:
? ? name: Martin D'vloper
? ? job: Developer
? ? skill: Elite
或者
martin: {name: Martin D'vloper, job: Developer, skill: Elite}

列表和字典可以混合使用

- ?martin:
? ? name: Martin D'vloper
? ? job: Developer
? ? skills:
? ? ? - python
? ? ? - perl
? ? ? - pascal
- ?tabitha:
? ? name: Tabitha Bitumen
? ? job: Developer
? ? skills:
? ? ? - lisp
? ? ? - fortran
? ? ? - erlang

二、playbook基礎(chǔ)組件

  • hosts:運行執(zhí)行任務(wù)(task)的目標(biāo)主機
  • remote_user:在遠程主機上執(zhí)行任務(wù)的用戶
  • tasks:任務(wù),由模板定義的操作列表
  • handlers:任務(wù),與tasks不同的是只有在接受到通知(notify)時才會被觸發(fā)
  • templates:模板,使用模板語言的文本文件,使用jinja2語法。
  • variables:變量,變量替換{{ variable_name }}
  • roles:角色

hosts:用于指定要執(zhí)行指定任務(wù)的主機,須事先定義在主機清單中。

示例:

- hosts: websrvs

remote_user:執(zhí)行身份

1)可用于hoststask中。
2)通過指定其通過sudo的方式在遠程主機上執(zhí)行任務(wù),其可用于play全局或某任務(wù)。
3)可以在sudo時使用sudo_user指定sudo時切換的用戶

示例:

- hosts: websrvs

? remote_user: root

? tasks:

?? - name: test connection

???? ping:

???? remote_user: fz.hou

???? sudo: yes ? ? #默認sudo為root

???? sudo_user:fl ?#sudo為fl

task:任務(wù)列表

格式:
(1) action: module arguments
(2) module: arguments
建議使用
注意:shellcommand模塊后面跟命令,而非key=value
示例:

tasks:

?- name: disable selinux

?? command: /sbin/setenforce 0

notifyhandlers
某任務(wù)的狀態(tài)在運行后為changed時,可通過“notify”通知給相應(yīng)的handlers,繼而執(zhí)行handlers之后的命令。

tags:標(biāo)簽
任務(wù)可以通過”tags“打標(biāo)簽,而后可在ansible-playbook命令上使用-t指定進行調(diào)用
注意:如果多個任務(wù)標(biāo)簽相同,標(biāo)簽被調(diào)用時,任務(wù)都會被執(zhí)行。

示例:安裝httpd,修改httpd配置文件,并重啟服務(wù)。

- hosts: webservers

? remote_user: root

? tasks:

??? - name: install httpd

????? yum: name=httpd

??? - name: modify config

????? copy: src=~/httpd.conf dest=/etc/httpd/conf/httpd.conf

????? tags: modify

????? notify: restart httpd

??? - name: start httpd

????? service: name=httpd state=started enabled=yes

? handlers:

??? - name: restart httpd

????? service: name=httpd state=restarted

注意:如果命令或腳本的退出碼不為零,可以使用如下方式替代:

tasks:

? - name: run this command and ignore the result

? ? shell: /usr/bin/somecommand || /bin/true

或者使用ignore_errors來忽略錯誤信息:

tasks:

? - name: run this command and ignore the result

??? shell: /usr/bin/somecommand

??? ignore_errors: True

運行playbook

運行playbook的方式

ansible-playbook <filename.yml> ... [options]

常見選項
–check 只檢測可能會發(fā)生的改變,但不真正執(zhí)行操作
–list-hosts 列出運行任務(wù)的主機
–limit?主機列表 只針對主機列表中的主機執(zhí)行
-v 顯示過程 -vv -vvv 更詳細

playbook變量

變量名:僅能由字母、數(shù)字和下劃線組成,且只能以字母開頭
變量來源:

1ansible setup facts 遠程主機的所有變量都可直接調(diào)用

示例:

ansible myhosts -m setup -a 'filter=ansible_nodename'

filter是用來匹配后面的字符串,可以使用正則表達式。
也可以使用grep過濾,-C選項查看上下文三行。???????

2、在/etc/ansible/hosts中定義

普通變量:主機組中主機單獨定義,優(yōu)先級高于公共變量
公共(組)變量:針對主機組中所有主機定義統(tǒng)一變量
普通變量示例:在/etc/ansible/hosts文件中定義

[myhosts]

172.18.18.22 http_port=85 hname=nginx

172.18.18.23 http_port=86 hname=httpd

編寫playbook

cat /root/ansible/vars4.yml

? ---

? - hosts: myhosts

??? remote_user: root

??? tasks:

???? - name: set hostname

?????? hostname: name={{ hname }}-{{ http_port }}

公共(組)變量示例:在/etc/ansible/hosts文件中定義

[myhosts:vars]

myh=HFZ

編寫playbook

cat /root/ansible/vars5.yml

? ---

? - hosts: myhosts

??? remote_user: root

??? tasks:

???? - name: set hostname

?????? hostname: name={{ myh }}-{{ hname }}-{{ http_port }}

3、通過命令行指定變量,優(yōu)先級最高

ansible-playbook –e varname=value

示例:

cat /root/ansible/vars.yml

? ---

? - hosts: myhosts

??? remote_user: root

??? tasks:

???? - name: install package

?????? yum: name={{ pkname }}

4、在playbook中定義

示例:

cat cat vars2.yml

? ---

? - hosts: myhosts

??? remote_user: root

??? vars:

???? - username: user1

???? - groupname: group1

??? tasks:

???? - name: create group

?????? group: name={{ groupname }} state=present

???? - name: create user

?????? user: name={{ username }} group{{ groupname }} home=/home/{{ username }}dir

5、可以在文件中定義變量,并在playbook中調(diào)用文件。

示例:在vars.yml文件中定義變量

hi: hello

wd: world

編寫playbook

- hosts: myhosts

? remote_user: root

? vars_files:

?? - vars.yml

? tasks:

?? - name: create file

???? file: name=/root/{{ hi }}-{{ wd }}.log state=touch

6、在role中定義

playbook中的templates模板

templates特點:

基于Jinja2語言的文本文件,嵌套有腳本。

templates功能:

根據(jù)模塊文件動態(tài)生成對應(yīng)的配置文件

templates格式:

templates文件必須存放于templates目錄下,且命名為 .j2 結(jié)尾。

yaml/yml 文件需和templates目錄平級,目錄結(jié)構(gòu)如下:

./

?├── temnginx.yml

?└── templates

?? └── nginx.conf.j2

Jinja2語言:

使用字面量:

??? 字符串:使用單引號或雙引號

??? 數(shù)字:整數(shù),浮點數(shù)

??? 列表:[item1, item2, ...]

??? 元組:(item1, item2, ...)

??? 字典:{key1:value1, key2:value2, ...}

??? 布爾型:true/false

算術(shù)運算:+, -, *, /, //, %, **

比較操作:==, !=, >, >=, <, <=

邏輯運算:and, or, not

流表達式:for、if、when

示例:在centos6centos7主機上安裝httpd服務(wù),并修改相應(yīng)配置文件。

1、創(chuàng)建文件夾

mkdir ~/ansible/templats -pv

2、拷貝centos6centos7主機上的httpd配置文件到主機。并修改文件名

ansible myhosts -m fetch -a 'src=/etc/httpd/conf/httpd.conf dest=~/ansible/'

3、復(fù)制文件到templats文件夾下并修改文件名,修改文件內(nèi)容

mv ~/ansible/172.18.18.22/httpd.conf ~/ansible/templats/httpd-7.conf.j2

mv ~/ansible/172.18.18.22/httpd.conf ~/ansible/templats/httpd-6.conf.j2

4、編寫playbook,注意httpd.ymltemplats文件夾同級

cat httpd.yml

??? - hosts: myhosts

????? remote_user: root

????? tasks:

??????? - name: install httpd

????????? yum: name=httpd

??????? - name: templates-7

????????? template: src=httpd-7.conf.j2 dest=/etc/httpd/conf/httpd.conf

????????? when: ansible_distribution_major_version == "7"

????????? notify: restart httpd

????????? tags: conf

??????? - name: templates-6

????????? template: src=httpd-6.conf.j2 dest=/etc/httpd/conf/httpd.conf

????????? when: ansible_distribution_major_version == "6"

????????? notify: restart httpd

????????? tags: conf

??????? - name: start httpd

????????? service: name=httpd state=started

????? handlers:

???????? - name: restart httpd

?????????? service: name=httpd state=restarted

條件判斷

?

多條件判斷

??

組條件判斷

自定義條件判斷

  • when的值是一個條件表達式,如果條件判斷成立,這個task就執(zhí)行,如果判斷不成立,則task不執(zhí)行
  • 如果需要根據(jù)變量、facts(setup)或此前任務(wù)的執(zhí)行結(jié)果來作為某task執(zhí)行與否的前提時要用到條件測試,在Playbook中條件測試使用when子句。
  • 在task后添加when子句即可使用條件測試:when子句支持jinjia2表達式或語法,例如:

playbook迭代

迭代:當(dāng)有需要重復(fù)性執(zhí)行的任務(wù)時,可以使用迭代機制
對迭代項的引用,固定變量名為”item”
要在task中使用with_items給定要迭代的元素列表
列表格式:
字符串
字典

示例:創(chuàng)建固定組,并把新建用戶加入到固定組中。

cat items.yml:

??? - hosts: myhosts

????? remote_user: root

????? tasks:

??????? - name: create groups

????????? group: name={{item}}

????????? with_items:

??????????? - itemgroup1

??????????? - itemgroup2

??????????? - itemgroup3

??????? - name: create users

????????? user: name={{item.username}} group={{item.groupname}}

????????? with_items:

??????????? - {username: 'testuser1',groupname: 'itemgroup1'}

??????????? - {username: 'testuser2',groupname: 'itemgroup2'}

??????????? - {username: 'testuser3',groupname: 'itemgroup3'}

playbooktemplate for if

示例:利用for-iftemplates編寫playbook

cat for-if.yml

?? ?- hosts: myhosts

????? remote_user: root

????? vars:

??????? hosts:

????????? - {listen_port: 8080,web: nginx1,name: web1.fz.com}

????????? - {listen_port: 8081,web: nginx2,name: web2.fz.com}

????????? - {listen_port: 8082,web: nginx3}

????? tasks:

??????? - name: for-if

????????? template: src=for-if.j2 dest=/root/for-if

cat templates/for-if.j2

??? {% for host in hosts %}

??? server{

??????????? listen: {{host.listen_port}};

??? {%if host.name is defined%}

??????????? name: {{host.name}};

??? {%endif%}

??????????? web: {{host.web}};

??? }

??? {%endfor%}

playbook加密

??? - ansible-vault:管理加密解密yml文件

??? - ansible-vault encrypt hello.yml 加密

??? - ansible-vault decrypt hello.yml 解密

??? - ansible-vault view hello.yml 查看

??? - ansible-vault edit hello.yml 編輯加密文件

??? - ansible-vault rekey hello.yml 修改口令

??? - ansible-vault create new.yml 創(chuàng)建新文件

整理自???Ansible之Playbook詳解、案例_不學(xué)Python 改學(xué)GO的技術(shù)博客_51CTO博客

總結(jié)

以上是生活随笔為你收集整理的Ansible之Playbook使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。