1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        一文掌握 Ansible 自動(dòng)化運(yùn)維

        共 16024字,需瀏覽 33分鐘

         ·

        2022-05-24 12:47

        作者:?kangvcar
        來(lái)源: https://my.oschina.net/kangvcar/blog/1830155

        1一、基本部署

        安裝Ansible

        #?yum?-y?install?epel-release
        #?yum?list?all?*ansible*
        #?yum?info?ansible
        #?yum?-y?install?ansible

        Ansible配置文件

        /etc/ansible/ansible.cfg????主配置文件
        /etc/ansible/hosts??????????Inventory
        /usr/bin/ansible-doc????????幫助文件
        /usr/bin/ansible-playbook???指定運(yùn)行任務(wù)文件

        定義Inventory

        #?cd?/etc/ansible/
        #?cp?hosts{,.bak}
        #?>?hosts

        #?cat?hosts
        [webserver]
        127.0.0.1
        192.168.10.149

        [dbserver]
        192.168.10.113

        使用秘鑰方式連接

        #?ssh-keygen?-t?rsa?
        #?ssh-copy-id?-i?/root/.ssh/[email protected]
        #?ssh-copy-id?-i?/root/.ssh/[email protected]
        #?ssh-copy-id?-i?/root/.ssh/[email protected]

        使用幫助

        #?ansible-doc?-l????????????????列出ansible所有的模塊
        #?ansible-doc?-s?MODULE_NAME????查看指定模塊具體適用

        Ansible命令應(yīng)用基礎(chǔ)

        語(yǔ)法:ansible  [-f forks] [-m module_name] [-a args]

        這次命令對(duì)哪些主機(jī)生效的
        inventory group name
        ip
        all
        -f forks 一次處理多少個(gè)主機(jī)
        -m module_name 要使用的模塊
        -a args 模塊特有的參數(shù)

        # ansible 192.168.10.113 -m command -a 'date'
        # ansible webserver -m command -a 'date'
        # ansible all -m command -a 'date'

        2二、常見模塊

        command?????命令模塊(默認(rèn)模塊)用于在遠(yuǎn)程主機(jī)執(zhí)行命令;不能使用變量,管道等
        #?ansible?all?-a?'date'
        cron????????計(jì)劃任務(wù)????
        ???month???指定月份
        ???minute??指定分鐘
        ???job?????指定任務(wù)
        ???day?????表示那一天
        ???hour????指定小時(shí)
        ???weekday?表示周幾
        ???state???表示是添加還是刪除
        ?????? present:安裝
        ?????? absent:移除
        ???#?ansible?webserver?-m?cron?-a?'minute="*/10"?job="/bin/echo?hello"?name="test?cron?job"'???#不寫默認(rèn)都是*,每個(gè)任務(wù)都必須有一個(gè)名字?
        ???#?ansible?webserver?-a?'crontab?-l'
        ???#?ansible?webserver?-m?cron?-a?'minute="*/10"?job="/bin/echo?hello"?name="test?cron?job"?state=absent'??#移除任務(wù)
        user????用戶賬號(hào)管理
        ???name????用戶名
        ???uid?????uid
        ???state???狀態(tài)??
        ???group???屬于哪個(gè)組
        ???groups??附加組
        ???home????家目錄
        ???createhome??是否創(chuàng)建家目錄
        ???comment?注釋信息
        ???system??是否是系統(tǒng)用戶
        ???
        ???#?ansible?all?-m?user?-a?'name="user1"'
        ???#?ansible?all?-m?user?-a?'name="user1"?state=absent'
        group???組管理
        ???gid?????gid??????
        ???name????組名???????????????
        ???state???狀態(tài)???????????
        ???system??是否是系統(tǒng)組
        ???#?ansible?webserver?-m?group?-a?'name=mysql?gid=306?system=yes'
        ???#?ansible?webserver?-m?user?-a?'name=mysql?uid=306?system=yes?group=mysql'
        copy????復(fù)制文件(復(fù)制本地文件到遠(yuǎn)程主機(jī)的指定位置)
        ???src?????定義本地源文件路徑
        ???dest????定義遠(yuǎn)程目錄文件路徑(絕對(duì)路徑)
        ???owner???屬主
        ???group???屬組
        ???mode????權(quán)限
        ???content?取代src=,表示直接用此處的信息生成為文件內(nèi)容
        ???#?yum?-y?install?libselinux-python
        ???#?ansible?all?-m?copy?-a?'src=/etc/fstab?dest=/tmp/fstab.ansible?owner=root?mode=640'
        ???#?ansible?all?-m?copy?-a?'content="hello?ansible
        Hi?ansible"?dest=/tmp/test.ansible'
        file????設(shè)置文件的屬性
        ???path|dest|name??對(duì)那個(gè)文件做設(shè)定
        ???
        ???創(chuàng)建文件的符號(hào)鏈接:
        ?????? src:????指定源文件
        ?????? path:???指明符號(hào)鏈接文件路徑
        ???#?ansible?all?-m?file?-a?'owner=mysql?group=mysql?mode=644?path=/tmp/fstab.ansible'
        ???#?ansible?all?-m?file?-a?'path=/tmp/fstab.link?src=/tmp/fstab.ansible?state=link'
        ping????測(cè)試指定主機(jī)是否能連接
        ???#?ansible?all?-m?ping
        service?管理服務(wù)運(yùn)行狀態(tài)
        ???enabled?是否開機(jī)自動(dòng)啟動(dòng)
        ???name????指定服務(wù)名
        ???state???指定服務(wù)狀態(tài)
        ???????started?????啟動(dòng)服務(wù)
        ???????stoped??????停止服務(wù)
        ???????restarted???重啟服務(wù)
        ???arguments???服務(wù)的參數(shù)
        ???#?ansible?webserver?-m?service?-a?'enabled=true?name=httpd?state=started'
        shell???在遠(yuǎn)程主機(jī)上運(yùn)行命令
        ???尤其是用到管道變量等功能的復(fù)雜命令
        ???#?ansible?all?-m?shell?-a?'echo?devopsman?|?passwd?--stdin?user1'
        script??將本地腳本復(fù)制到遠(yuǎn)程主機(jī)并運(yùn)行之
        ???#?ansible?all?-m?script?-a?'/tmp/test.sh'
        yum?????安裝程序包
        ???name????程序包名稱(不指定版本就安裝最新的版本latest)
        ???state???present,latest表示安裝,absent表示卸載
        ???#?ansible?webserver?-m?yum?-a?'name=httpd'
        ???#?ansible?all?-m?yum?-a?'name=ntpdate'??#默認(rèn)就是安裝
        ???#?ansible?all?-m?yum?-a?'name=ntpdate?state=absent'
        setup???收集遠(yuǎn)程主機(jī)的facts
        ???每個(gè)被管理節(jié)點(diǎn)在接受并運(yùn)行管理命令之前,會(huì)將自己主機(jī)相關(guān)信息,如操作系統(tǒng)版本,IP地址等報(bào)告給遠(yuǎn)程的ansible主機(jī)?
        ???#?ansible?all?-m?setup

        3三、Ansible playbook

        組成結(jié)構(gòu):

        inventory???????#以下操作應(yīng)用的主機(jī)
        modules?????????#調(diào)用哪些模塊做什么樣的操作
        ad?hoc?commands?#在這些主機(jī)上運(yùn)行哪些命令
        playbooks???
        ???tasks???????#任務(wù),即調(diào)用模塊完成的某操作
        ???variable????#變量
        ???templates???#模板
        ???handlers????#處理器,由某事件觸發(fā)執(zhí)行的操作
        ???roles???????#角色

        4四、YAML

        4.1 YAML介紹

        YAML是一個(gè)可讀性高的用來(lái)表達(dá)資料序列的格式。YAML參考了其它多種語(yǔ)言,包括:XML、C語(yǔ)言、Python、Perl以及電子郵件格式RFC2822等。ClarkEvans在2001年首次發(fā)表了這種語(yǔ)言,另外Ingy dot Net與Oren Ben-Kiki也是這語(yǔ)言的共同設(shè)計(jì)者。

        YAML Ain't Markup Language,即YAML不是XML,不過,在開發(fā)這種語(yǔ)言時(shí),YAML的意思其實(shí)是:"Yet Another Markup Language"(仍是一種標(biāo)記語(yǔ)言),其特性:

        • YAML的可讀性好
        • YAML和腳本語(yǔ)言的交互性好
        • YAML使用實(shí)現(xiàn)語(yǔ)言的數(shù)據(jù)類型
        • YAML有一個(gè)一致的信息模型
        • YAML易于實(shí)現(xiàn)
        • YAML可以基于流來(lái)處理
        • YAML表達(dá)能力強(qiáng),擴(kuò)展性好

        更多的內(nèi)容及規(guī)范參見[1]

        4.2 YAML語(yǔ)法

        YAML的語(yǔ)法和其他高階語(yǔ)言類似,并且可以簡(jiǎn)單表達(dá)清單、散列表、標(biāo)量等數(shù)據(jù)結(jié)構(gòu),其結(jié)構(gòu)(structure)通過空格來(lái)展示,序列(sequence)里的項(xiàng)用"-"來(lái)表示,Map里面的鍵值對(duì)用":"分割,下面是一個(gè)示例。

        name:?john?smith
        age:?41
        gender:?male
        spouse:
        ???name:jane?smith
        ???age:37
        ???gender:?female
        children:
        ???-???name:jimmy?smith
        ???????age:17
        ???????gender:?male
        ???-???name:jenny?smith
        ???????age:?13
        ???????gender:?female

        YAML文件擴(kuò)展名通常為.yaml,如example.yaml

        Docker+K8s+Jenkins 主流技術(shù)全解視頻資料

        4.2.1 list

        列表的所有元素均使用"-"打頭,例如:

        #?A?list?of?testy?fruits
        -?Apple
        -?Orange
        -?Strawberry
        -?Mango

        4.2.2 dictionary

        字典通過key與value進(jìn)行標(biāo)識(shí),例如:

        ---
        #?An?employee?record
        name:?Example?Developer
        job:?Developer
        skill:?Elite

        也可以將key:value放置于{}中進(jìn)行表示,例如:

        ---
        #An?exmloyee?record
        {name:?Example?Developer,?job:?Developer,?skill:?Elite}

        5五、Ansible基礎(chǔ)元素

        5.1 變量

        5.1.1 變量命名

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

        5.1.2 facts

        facts是由正在通信的遠(yuǎn)程目標(biāo)主機(jī)發(fā)回的信息,這些信息被保存在ansible變量中。要獲取指定的遠(yuǎn)程主機(jī)所支持的所有facts,可使用如下命令進(jìn)行:

        #ansible?hostname?-m?setup

        5.1.3 register

        把任務(wù)的輸出定義為變量,然后用于其他任務(wù),實(shí)例如下:

        tasks:
        ???-?shell:?/usr/bin/foo
        ?????register:?foo_result
        ?????ignore_errors:?True

        5.1.4 通過命令行傳遞變量

        在運(yùn)行playbook的時(shí)候也可以傳遞一些變量供playbook使用,示例如下:

        #ansible-playbook?test.yml?--extra-vars?"hosts=www?user=devopsman"

        5.1.5 通過roles傳遞變量

        當(dāng)給一個(gè)主機(jī)應(yīng)用角色的時(shí)候可以傳遞變量,然后在角色內(nèi)使用這些變量,示例如下:

        -?hosts:?webserver
        ?roles:
        ???-?common
        ???-?{role:?foo_app_instance,?dir:?'/web/htdocs/a.com',?port:?8080}

        5.2 Inventory

        ansible的主要功用在于批量主機(jī)操作,為了便捷的使用其中的部分主機(jī),可以在inventory file中將其分組命名,默認(rèn)的inventory file為/etc/ansible/hosts

        inventory file可以有多個(gè),且也可以通過Dynamic Inventory來(lái)動(dòng)態(tài)生成。

        5.2.1 inventory文件格式

        inventory文件遵循INI文件風(fēng)格,中括號(hào)中的字符為組名??梢詫⑼粋€(gè)主機(jī)同時(shí)歸并到多個(gè)不同的組中;此外,當(dāng)如若目標(biāo)主機(jī)使用非默認(rèn)的SSH端口,還可以在主機(jī)名稱之后使用冒號(hào)加端口號(hào)來(lái)表明。

        ntp.devopsman.cn

        [webserver]
        www1.devopsman.cn:2222
        www2.devopsman.cn

        [dbserver]
        db1.devopsman.cn
        db2.devopsman.cn
        db3.devopsman.cn

        如果主機(jī)名遵循相似的命名模式,還可使用列表的方式標(biāo)識(shí)個(gè)主機(jī),例如:
        [webserver]
        www[01:50].example.com

        [databases]
        db-[a:f].example.com

        5.2.2 主機(jī)變量

        可以在inventory中定義主機(jī)時(shí)為其添加主機(jī)變量以便于在playbook中使用,例如:

        [webserver]
        www1.devopsman.cn http_port=80 maxRequestsPerChild=808
        www2.devopsman.cn http_port=8080 maxRequestsPerChild=909

        5.2.3 組變量

        組變量是指賦予給指定組內(nèi)所有主機(jī)上的在playbook中可用的變量。例如:

        [webserver]
        www1.devopsman.cn
        www2.devopsman.cn

        [webserver:vars]
        ntp_server=ntp.devopsman.cn
        nfs_server=nfs.devopsman.cn

        5.2.4 組嵌套

        inventory中,組還可以包含其它的組,并且也可以向組中的主機(jī)指定變量。不過,這些變量只能在ansible-playbook中使用,而ansible不支持。例如:

        [apache]
        httpd1.devopsman.cn
        httpd2.devopsman.cn

        [nginx]
        ngx1.devopsman.cn
        ngx2.devopsman.cn

        [webserver:children] #固定格式
        apache
        nginx

        [webserver:vars]
        ntp_server=ntp.devopsman.cn

        5.2.5 inventory參數(shù)

        ansible基于ssh連接inventory中指定的遠(yuǎn)程主機(jī)時(shí),還可以通過參數(shù)指定其交互方式,這些參數(shù)如下所示:

        ansible_ssh_host
        ansible_ssh_port
        ansible_ssh_user
        ansible_ssh_pass
        ansible_sudo_pass
        ansible_connection
        ansible_ssh_private_key_file
        ansible_shell_type
        ansible_python_interpreter

        5.3 條件測(cè)試

        如果需要根據(jù)變量、facts或此前任務(wù)的執(zhí)行結(jié)果來(lái)做為某task執(zhí)行與否的前提時(shí)要用到條件測(cè)試。

        5.3.1 when語(yǔ)句

        在task后添加when字句即可使用條件測(cè)試;when語(yǔ)句支持jinja2表達(dá)式語(yǔ)句,例如:

        tasks:
        ?-?name:?'shutdown?debian?flavored?system"
        ???command:?/sbin/shutdown?-h?now
        ???when:?ansible_os_family?==?"Debian"

        when語(yǔ)句中還可以使用jinja2的大多"filter",例如果忽略此前某語(yǔ)句的錯(cuò)誤并基于其結(jié)果(failed或success)運(yùn)行后面指定的語(yǔ)句,可使用類似如下形式;

        tasks:
        ?-?command:/bin/false
        ???register:?result
        ???ignore_errors:?True
        ?-?command:?/bin/something
        ???when:?result|failed
        ?-?command:?/bin/something_else
        ???when:?result|success
        ?-?command:?/bin/still/something_else
        ???when:?result|skipped

        此外,when語(yǔ)句中還可以使用facts或playbook中定義的變量

        #?cat?cond.yml?
        -?hosts:?all
        ?remote_user:?root
        ?vars:
        ?-?username:?user10
        ?tasks:
        ?-?name:?create?{{?username?}}?user
        ???user:?name={{?username?}}?
        ???when:?ansible_fqdn?==?"node1.exercise.com"

        5.4 迭代

        當(dāng)有需要重復(fù)性執(zhí)行的任務(wù)時(shí),可以使用迭代機(jī)制。其使用格式為將需要迭代的內(nèi)容定義為item變量引用,并通過with_items語(yǔ)句來(lái)指明迭代的元素列表即可。例如:

        -?name:?add?server?user
        ?user:?name={{?item?}}?state=persent?groups=wheel
        ?with_items:
        ???-?testuser1
        ???-?testuser2

        上面語(yǔ)句的功能等同于下面的語(yǔ)句:

        -?name:?add?user?testuser1
        ?user:?name=testuser1?state=present?group=wheel
        -?name:?add?user?testuser2
        ?user:?name=testuser2?state=present?group=wheel

        事實(shí)上,with_items中可以使用元素還可為hashes,例如:

        -?name:?add?several?users
        ?user:?name={{?item.name}}?state=present?groups={{?item.groups?}}
        ?with_items:
        ???-?{?name:?'testuser1',?groups:?'wheel'}
        ???-?{?name:?'testuser2',?groups:?'root'}

        Ansible的循環(huán)機(jī)制還有更多的高級(jí)功能,具體請(qǐng)參考官方文檔[2]

        6六、模板示例:

        #?grep?'{{'?conf/httpd.conf?
        MaxClients???????{{?maxClients?}}
        Listen?{{?httpd_port?}}

        #?cat?/etc/ansible/hosts
        [webserver]
        127.0.0.1?httpd_port=80?maxClients=100
        192.168.10.149?httpd_port=8080?maxClients=200

        #?cat?apache.yml?
        -?hosts:?webserver
        ?remote_user:?root
        ?vars:
        ?-?package:?httpd
        ?-?service:?httpd
        ?tasks:
        ?-?name:?install?httpd?package
        ???yum:?name={{?package?}}?state=latest
        ?-?name:?install?configuration?file?for?httpd
        ???template:?src=/root/conf/httpd.conf?dest=/etc/httpd/conf/httpd.conf
        ???notify:?
        ???-?restart?httpd
        ?-?name:?start?httpd?service
        ???service:?enabled=true?name={{?service?}}?state=started
        ?
        ?handlers:
        ?-?name:?restart?httpd
        ???service:?name=httpd?state=restarted

        7七、Ansible playbooks

        playbook是由一個(gè)或多個(gè)"play"組成的列表。play的主要功能在于將事先歸并為一組的主機(jī)裝扮成事先通過ansible中的task定義好的角色。從根本上來(lái)講,所有task無(wú)非是調(diào)用ansible的一個(gè)module。將多個(gè)play組織在一個(gè)playbook中,即可以讓他們連同起來(lái)按事先編排的機(jī)制同唱一臺(tái)大戲。下面是一個(gè)簡(jiǎn)單示例。

        -?hosts:?webserver
        ?vars:
        ???http_port:?80
        ???max_clients:?256
        ?remote_user:?root
        ?tasks:
        ?-?name:?ensure?apache?is?at?the?latest?version
        ???yum:?name=httpd?state=latest
        ?-?name:?ensure?apache?is?running
        ???service:?name=httpd?state=started
        ?handlers:
        ???-?name:?restart?apache
        ?????service:?name=httpd?state=restarted

        7.1 playbook基礎(chǔ)組件

        7.1.1 Hosts和Users

        playbook中的每一個(gè)play的目的都是為了讓某個(gè)或某些主機(jī)以某個(gè)指定的用戶身份執(zhí)行任務(wù)。hosts用于指定要執(zhí)行指定任務(wù)的主機(jī),其可以使一個(gè)或多個(gè)由冒號(hào)分隔主機(jī)組;remote_user則用于指定遠(yuǎn)程主機(jī)的執(zhí)行任務(wù)的用戶,如上面的實(shí)例中的

        -?hosts:?webserver
        ?remote_user:?root

        不過,remote_user也可用于各task中,也可以通過指定其通過sudo的方式在遠(yuǎn)程主機(jī)上執(zhí)行任務(wù),其可用于play全局或其任務(wù);此外,甚至可以在sudo時(shí)使用sudo_user指定sudo時(shí)切換的用戶。

        -?hosts:?webserver
        ?remote_user:?devopsman
        ?tasks:
        ??-?name:?test?connection
        ????ping:
        ????remote_user:?devopsman
        ????sudo:?yes

        7.1.2 任務(wù)列表和action

        play的主題部分是task list。task list中的各任務(wù)按次序逐個(gè)在hosts中指定的所有主機(jī)上執(zhí)行,即在所有主機(jī)上完成第一個(gè)任務(wù)后再開始第二個(gè)。在運(yùn)行自上而下某playbook時(shí),如果中途發(fā)生錯(cuò)誤,所有已執(zhí)行任務(wù)都可能回滾,在更正playbook后重新執(zhí)行一次即可。

        taks的目的是使用指定的參數(shù)執(zhí)行模塊,而在模塊參數(shù)中可以使用變量。模塊執(zhí)行是冪等的。這意味著多次執(zhí)行是安全的,因?yàn)槠浣Y(jié)果均一致。

        每個(gè)task都應(yīng)該有其name,用于playbook的執(zhí)行結(jié)果輸出,建議其內(nèi)容盡可能清晰地描述任務(wù)執(zhí)行步驟,如果為提供name,則action的結(jié)果將用于輸出。

        定義task可以使用"action: module options"或”module:options“的格式推薦使用后者以實(shí)現(xiàn)向后兼容。如果action一行的內(nèi)容過多,也中使用在行首使用幾個(gè)空白字符進(jìn)行換行。

        tasks:
        ?-?name:make?sure?apache?is?running
        ???service:?name=httpd?state=started
        tasks:
        ?-?name:?run?this?command?and?ignore?the?result
        ???shell:?/usr/bin/somecommand?||?/bin/true

        在眾多的模塊中,只有command和shell模塊僅需要給定一個(gè)列表而無(wú)需使用"key=value"格式,例如:

        tasks:
        ?-?name:?disable?selinux
        ???command:?/sbin/setenforce?0

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

        或者使用ignore_errors來(lái)忽略錯(cuò)誤信息:

        tasks:
        ?-?name:?run?this?command?and?ignore?the?result
        ???shell:?/usr/bin/somecommand
        ???ignore_errors:?True

        7.1.3handlers

        用于當(dāng)關(guān)注的資源發(fā)生變化時(shí)采取一定的操作。

        "notify"這個(gè)action可用于在每個(gè)play的最后被觸發(fā),這樣可以避免多次有改變發(fā)生時(shí)每次都執(zhí)行執(zhí)行的操作,取而代之,僅在所有的變化發(fā)生完成后一次性地執(zhí)行指定操作,在notify中列出的操作稱為handlers,也即notify中調(diào)用handlers中定義的操作。

        -?name:?template?configuration?file
        ?template:?src=template.j2?dest=/etc/foo.conf
        ?notify:
        ???-?restart?memcached
        ???-?restart?apache

        handlers是task列表,這些task與前述的task并沒有本質(zhì)上的不同。

        handlers:
        ?-?name:?restart?memcached
        ???service:?name=memcached?state=restarted
        ?-?name:?restart?apache
        ???service:?name=apache?state=restarted

        簡(jiǎn)單示例1:

        #?cat?nginx.yml?
        -?hosts:?webserver
        ?remote_user:?root
        ?tasks:
        ?-?name:?create?nginxn?group
        ???group:?name=nginx?system=yes?gid=208
        ?-?name:?create?nginx?user
        ???user:?name=nginx?uid=208?group=nginx?system=yes

        -?hosts:?dbserver
        ?remote_user:?root
        ?tasks:
        ?-?name:?copy?file?to?dbserver
        ???copy:?src=/etc/inittab?dest=/tmp/inittab.ans
        ???
        #?ansible-playbook?nginx.yml

        簡(jiǎn)單示例2:

        #?cat?apache.yml?
        -?hosts:?webserver
        ?remote_user:?root
        ?tasks:
        ?-?name:?install?httpd?package
        ???yum:?name=httpd?state=latest
        ?-?name:?install?configuration?file?for?httpd
        ???copy:?src=/root/conf/httpd.conf?dest=/etc/httpd/conf/httpd.conf
        ?-?name:?start?httpd?service
        ???service:?enabled=true?name=httpd?state=started

        #?ansible-playbook?apache.yml

        handlers 示例:

        #?cat?apache.yml?
        -?hosts:?webserver
        ?remote_user:?root
        ?tasks:
        ?-?name:?install?httpd?package
        ???yum:?name=httpd?state=latest
        ?-?name:?install?configuration?file?for?httpd
        ???copy:?src=/root/conf/httpd.conf?dest=/etc/httpd/conf/httpd.conf
        ???notify:?
        ???-?restart?httpd
        ?-?name:?start?httpd?service
        ???service:?enabled=true?name=httpd?state=started
        ?
        ?handlers:
        ?-?name:?restart?httpd
        ???service:?name=httpd?state=restarted

        #??ansible-playbook?apache.yml

        variable 示例1:

        #?cat?apache.yml?
        -?hosts:?webserver
        ?remote_user:?root
        ?vars:
        ?-?package:?httpd
        ?-?service:?httpd
        ?tasks:
        ?-?name:?install?httpd?package
        ???yum:?name={{?package?}}?state=latest
        ?-?name:?install?configuration?file?for?httpd
        ???copy:?src=/root/conf/httpd.conf?dest=/etc/httpd/conf/httpd.conf
        ???notify:?
        ???-?restart?httpd
        ?-?name:?start?httpd?service
        ???service:?enabled=true?name={{?service?}}?state=started
        ?
        ?handlers:
        ?-?name:?restart?httpd
        ???service:?name=httpd?state=restarted

        variable 示例2:(在playbook中可以使用所有的變量)

        #?cat?facts.yml?
        -?hosts:?webserver
        ?remote_user:?root
        ?tasks:
        ?-?name:?copy?file
        ???copy:?content="{{?ansible_all_ipv4_addresses?}}?"?dest=/tmp/vars.ans

        8八、roles

        ansible自1.2版本引入的新特性,用于層次性、結(jié)構(gòu)化地組織playbook。roles能夠根據(jù)層次型結(jié)構(gòu)自動(dòng)轉(zhuǎn)載變量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。簡(jiǎn)單來(lái)講,roles就是通過分別將變量、文件、任務(wù)、模板以及處理器放置于單獨(dú)的目錄中,并可以便捷地include他們的一種機(jī)制。角色一般用于基于主機(jī)構(gòu)建服務(wù)的場(chǎng)景中,但也可以使用于構(gòu)建守護(hù)進(jìn)程的場(chǎng)景中

        Docker+K8s+Jenkins 主流技術(shù)全解視頻資料

        一個(gè)roles的案例如下所示:

        site.yml
        webserver.yml
        fooserver.yml
        roles/
        ???common/
        ???????files/
        ???????templates/
        ???????tasks/
        ???????handlers/
        ???????vars/
        ???????meta/
        ???webserver/
        ???????files/
        ???????templates/
        ???????tasks/
        ???????handlers/
        ???????vars/
        ???????meta/

        而在playbook中,可以這樣使用role:

        -?hosts:?webserver
        ?roles:
        ???-?common??
        ???-?webserver

        也可以向roles傳遞參數(shù),例如:

        -?hosts:?webserver
        ?roles:
        ???-?common
        ???-?{?role:?foo_app_instance,?dir:'/opt/a',port:5000}
        ???-?{?role:?foo_app_instance,?dir:'/opt/b',port:5001}

        甚至也可以條件式地使用roles,例如:

        -?hosts:webserver
        ?roles:
        ???-?{?role:?some_role,?when:?"ansible_so_family?==?'RedHat"?}

        8.1 創(chuàng)建role的步驟

        1. 創(chuàng)建以roles命名的目錄:
        2. 在roles目錄中分別創(chuàng)建以各角色命名的目錄,如webserver等
        3. 在每個(gè)角色命名的目錄中分別創(chuàng)建files、handlers、meta、tasks、templates和vars目錄;用不到的目錄可以創(chuàng)建為空目錄,也可以不創(chuàng)建
        4. 在playbook文件中,調(diào)用各角色

        8.2 role內(nèi)各目錄中可應(yīng)用的文件

        • task目錄:至少應(yīng)該包含一個(gè)為main.yml的文件,其定義了此角色的任務(wù)列表;此文件可以使用include包含其它的位于此目錄中的task文件;
        • file目錄:存放由copy或script等模板塊調(diào)用的文件;
        • template目錄:template模塊會(huì)自動(dòng)在此目錄中尋找jinja2模板文件;
        • handlers目錄:此目錄中應(yīng)當(dāng)包含一個(gè)main.yml文件,用于定義此角色用到的各handlers,在handler中使用inclnude包含的其它的handlers文件也應(yīng)該位于此目錄中;
        • vars目錄:應(yīng)當(dāng)包含一個(gè)main.yml文件,用于定義此角色用到的變量
        • meta目錄:應(yīng)當(dāng)包含一個(gè)main.yml文件,用于定義此角色的特殊設(shè)定及其依賴關(guān)系;ansible1.3及其以后的版本才支持;
        • default目錄:應(yīng)當(dāng)包含一個(gè)main.yml文件,用于為當(dāng)前角色設(shè)定默認(rèn)變量時(shí)使用此目錄;
        #?mkdir?-pv?ansible_playbooks/roles/{webserver,dbserver}/{tasks,files,templates,meta,handlers,vars}?
        #?cp?/etc/httpd/conf/httpd.conf?files/??
        #?pwd
        /root/ansible_playbooks/roles/webserver?
        #?cat?tasks/main.yml?
        -?name:?install?httpd?package
        ?yum:?name=httpd?state=present
        -?name:?install?configuretion?file
        ?copy:?src=httpd.conf?dest=/etc/httpd/conf/httpd.conf
        ?tags:
        ?-?conf
        ?notify:
        ?-?restart?httpd
        -?name:?start?httpd
        ?service:?name=httpd?state=started

        #?cat?handlers/main.yml?
        -?name:?restart?httpd
        ?service:?name=httpd?state=restarted
        ???
        #?pwd;ls
        /root/ansible_playbooks
        roles??site.yml?


        #?cat?site.yml?
        -?hosts:?webserver
        ?remote_user:?root
        ?roles:
        ?-?webserver

        #?ansible-playbook?site.yml

        9九、Tags

        tags用于讓用戶選擇運(yùn)行或跳過playbook中的部分代碼。ansible具有冪等性,因此會(huì)自動(dòng)跳過沒有變化的部分,即便如此,有些代碼為測(cè)試其確實(shí)沒有發(fā)生變化的時(shí)間依然會(huì)非常的長(zhǎng)。此時(shí),如果確信其沒有變化,就可以通過tags跳過此些代碼片段。

        tags:在playbook可以為某個(gè)或某些任務(wù)定義一個(gè)"標(biāo)簽",在執(zhí)行此playbook時(shí),通過為ansible-playbook命令使用--tags選項(xiàng)能耐實(shí)現(xiàn)僅運(yùn)行指定的tasks而非所有的;

        #?cat?apache.yml?
        -?hosts:?webserver
        ?remote_user:?root
        ?vars:
        ?-?package:?httpd
        ?-?service:?httpd
        ?tasks:
        ?-?name:?install?httpd?package
        ???yum:?name={{?package?}}?state=latest
        ?-?name:?install?configuration?file?for?httpd
        ???template:?src=/root/conf/httpd.conf?dest=/etc/httpd/conf/httpd.conf
        ???tags:
        ???-?conf
        ???notify:?
        ???-?restart?httpd
        ?-?name:?start?httpd?service
        ???service:?enabled=true?name={{?service?}}?state=started
        ?
        ?handlers:
        ?-?name:?restart?httpd
        ???service:?name=httpd?state=restarted

        #?ansible-playbook?apache.yml?--tags='conf'

        特殊tags:always #無(wú)論如何都會(huì)運(yùn)行

        - END -
        ?推薦閱讀?






        31天拿下K8s含金量最高的CKA+CKS證書!
        Linux 使用 Systemd 管理進(jìn)程服務(wù),劃重點(diǎn)~
        Linux的10個(gè)最危險(xiǎn)命令
        Kubernetes網(wǎng)絡(luò)難懂?可能是沒看到這篇文章
        100個(gè)Linux Shell腳本經(jīng)典案例(附PDF)
        24 個(gè) Docker 常見問題處理技巧
        23 款 DevOps 工具建設(shè)云原生時(shí)代
        Shell分析日志文件,全面解鎖新姿勢(shì)!
        這篇文章帶你全面掌握 Nginx !
        一文搞懂 Kubernetes 網(wǎng)絡(luò)通信原理
        SRE本質(zhì)就是一個(gè)懂運(yùn)維的資深開發(fā)
        Kubernetes 4000節(jié)點(diǎn)運(yùn)維經(jīng)驗(yàn)分享
        Kubernetes 的高級(jí)部署策略,你不一定知道!
        基于Nginx實(shí)現(xiàn)灰度發(fā)布與AB測(cè)試
        大型網(wǎng)站技術(shù)架構(gòu)設(shè)計(jì)
        搭建一套完整的企業(yè)級(jí) K8s 集群(v1.22,二進(jìn)制方式)


        點(diǎn)亮,服務(wù)器三年不宕機(jī)
        瀏覽 59
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            少妇一级片| 人妻1 8 P | 人人操91 | 男女互被舔69式免费视频 | 婷婷一区二区三区 | 免费在线观看视频黄 | 日本淫视频 | 艹逼动态图片 | 囯产精品久久久久久久久久青青 | 免费在线观看成人小视频 |