<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # ansible的特性 **基于python語言實現,由Paramiko,PyYAML和Jinjia2三個關鍵模塊:** - 部署簡答,agentless - 默認使用ssh協議, - 主從模式: * master:ansible,ssh client * slave:ssh server * 支持自定義模塊:支持各種編程語言 * 支持Playbook * 基于“模塊”完成各種”任務“ **ansible主要組成部分功能說明** - PLAYBOOKS:任務劇本(任務集),編排定義Ansible任務集的配置文件,由Ansible順序依次執行,通常是JSON格式的YML文件 - INVENTORY:Ansible管理主機的清單/etc/anaible/hosts - MODULES:Ansible執行命令的功能模塊,多數為內置的核心模塊,也可自定義,ansible-doc –l 可查看模塊 - PLUGINS:模塊功能的補充,如連接類型插件、循環插件、變量插件、過濾插件等,該功能不常用 - API: 供第三方程序調用的應用程序編程接口 - ANSIBLE:組合INVENTORY、 API、 MODULES、PLUGINS的綠框,可以理解為是ansible命令工具,其為核心執行工具 # 安裝ansible ansible依賴于epel源、Python 2.6或更高的版本、paramiko、PyYAML及Jinja2。 ## 編譯安裝 解決依賴關系 ``` yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto tar xf ansible-1.5.4.tar.gz cd ansible-1.5.4 python setup.py build python setup.py install mkdir /etc/ansible cp -r examples/* /etc/ansible ``` ## rpm包安裝 yum install ansible 注意:不同版本的ansible的功能差異可能較大。 配置文件:/etc/ansible/ansible.cfg Invertory:/etc/ansible/hosts ## 配置文件 配置文件或指令描述 ``` /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性 /etc/ansible/hosts 主機清單 /etc/ansible/roles/ 存放角色的目錄 /usr/bin/ansible 主程序,臨時命令執行工具 /usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具 /usr/bin/ansible-galaxy 下載/上傳優秀代碼或Roles模塊的官網平臺 /usr/bin/ansible-playbook 定制自動化任務,編排劇本工具 /usr/bin/ansible-pull 遠程執行命令的工具 /usr/bin/ansible-vault 文件加密工具 /usr/bin/ansible-console 基于Console界面與用戶交互的執行工具 ``` ## inventory 主機清單 ansible必須通過Inventory 來管理主機。ansible 可同時操作屬于一個組的多臺主機,組和主機之間的關系通過 inventory 文件配置。ansible通過ssh實現配置管理、應用部署、任務執行等功能,因此,需要事先配置ansible端能基于密鑰認證的方式聯系各被管理節點。 語法格式: ``` green.example.com > FQDN 192.168.100.10 > IP地址 192.168.100.11:2222 > 非標準SSH端口 [webservers] > 定義了一個組名 alpha.example.org > 組內的單臺主機 192.168.100.10 [dbservers] 192.168.100.10 > 一臺主機可以是不同的組,這臺主機同時屬于[webservers] [group:children] > 組嵌套組,group為自定義的組名,children是關鍵字,固定語法,必須填寫。 dns > group組內包含的其他組名 db > group組內包含的其他組名 [webservers] www[001:006].yjscloud.com > 有規律的名稱列表, 這里表示相當于: www001.yjscloud.com www002.yjscloud.com www003.yjscloud.com www004.yjscloud.com www005.yjscloud.com www006.yjscloud.com [databases] db-[a:e].example.com > 定義字母范圍的簡寫模式, 這里表示相當于: db-a.example.com db-b.example.com db-c.example.com db-d.example.com db-e.example.com ``` 以下這2條定義了一臺主機的連接方式,而不是讀取默認的配置設定 ``` localhost ansible_connection=local www.163.com ansible_connection=ssh ansible_ssh_user=hunk ``` 最后還有一個隱藏的分組,那就是all,代表全部主機,這個是隱式的,不需要寫出來的。 # YAML ## YAML介紹 YAML是一個可讀性高的用來表達資料序列的格式。YAML參考了其他多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822等。Clark Evans在2001年在首次發表了這種語言,另外Ingy d?t Net與Oren Ben-Kiki也是這語言的共同設計者。 YAML Ain't Markup Language,即YAML不是XML。不過,在開發的這種語言時,YAML的意思其實是:"Yet Another Markup Language"(仍是一種標記語言)。其特性: - YAML的可讀性好 - YAML和腳本語言的交互性好 - YAML使用實現語言的數據類型 - YAML有一個一致的信息模型 - YAML易于實現 - YAML可以基于流來處理 - YAML表達能力強,擴展性好 更多的內容及規范參見`http://www.yaml.org` ## YAML語法 YAML的語法和其他高階語言類似,并且可以簡單表達清單、散列表、標量等數據結構。其結構(Structure)通過空格來展示,序列(Sequence)里的項用"-"來代表,Map里的鍵值對用":"分隔。下面是一個示例 ``` 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文件擴展名通常為.yaml,如example.yaml。 ### list 列表的所有元素均使用“-”打頭,例如: ``` # A list of tasty fruits - Apple - Orange - Strawberry - Mango ``` ### dictionary 字典通過key與valuef進行標識,例如: ``` # An employee record name: Example Developer job: Developer skill: Elite ``` 也可以將key:value放置于{}中進行表示,例如: ``` # An employee record {name: Example Developer, job: Developer, skill: Elite} ``` # ansible基礎元素 ## 變量 ### 變量命名 變量名僅能由字母、數字和下劃線組成,且只能以字母開頭。 ### acts facts是由正在通信的遠程目標主機發回的信息,這些信息被保存在ansible變量中。要獲取指定的遠程主機所支持的所有facts,可使用如下命令進行: # ansible hostname -m setup ### register 把任務的輸出定義為變量,然后用于其他任務,示例如下: ``` tasks: - shell: /usr/bin/foo register: foo_result ignore_errors: True ``` ### 通過命令行傳遞變量 在運行playbook的時候也可以傳遞一些變量供playbook使用,示例如下: ansible-playbook test.yml --extra-vars "hosts=www user=mageedu" ### 通過roles傳遞變量 當給一個主機應用角色的時候可以傳遞變量,然后在角色內使用這些變量,示例如下: ``` - hosts: webservers roles: - common - { role: foo_app_instance, dir: '/web/htdocs/a.com', port: 8080 } ``` ## Inventory ansible的主要功用在于批量主機操作,為了便捷地使用其中的部分主機,可以在inventory file中將其分組命名。默認的inventory file為/etc/ansible/hosts。 inventory file可以有多個,且也可以通過Dynamic Inventory來動態生成。 ### inventory文件格式 inventory文件遵循INI文件風格,中括號中的字符為組名。可以將同一個主機同時歸并到多個不同的組中;此外,當如若目標主機使用了非默認的SSH端口,還可以在主機名稱之后使用冒號加端口號來標明,`inventory 主機清單`章節已對文件格式進行了說明這里就不在贅述。 ### 主機變量 可以在inventory中定義主機時為其添加主機變量以便于在playbook中使用。例如: ``` [webservers] www1.yjscloud.com http_port=80 maxRequestsPerChild=808 www2.yjscloud.com http_port=8080 maxRequestsPerChild=909 ``` ### 組變量 組變量是指賦予給指定組內所有主機上的在playboo中可用的變量。例如: ``` [webservers] www1.yjscloud.com www2.yjscloud.com [webservers:vars] ntp_server=ntp.yjscloud.com nfs_server=nfs.yjscloud.com ``` ### 組嵌套 inventory中,組還可以包含其它的組,并且也可以向組中的主機指定變量。不過,這些變量只能在ansible-playbook中使用,而ansible不支持。例如: ``` [apache] httpd1.yjscloud.com httpd2.yjscloud.com [nginx] ngx1.yjscloud.com ngx2.yjscloud.com [webservers:children] apache nginx [webservers:vars] ntp_server=ntp.yjscloud.com ``` ### nventory參數 ansible基于ssh連接inventory中指定的遠程主機時,還可以通過參數指定其交互方式;這些參數如下所示: ``` ansible_ssh_host 連接到主機的名稱,如果你希望給不同的別名。 ansible_ssh_port ssh端口號,如果不是22 ansible_ssh_user 默認使用ssh的用戶名。 ansible_ssh_pass ssh密碼使用(這是不安全的,我們強烈建議使用——ask-pass或ssh密鑰) ansible_sudo_pass 使用sudo密碼(這是不安全的,我們強烈建議使用——ask-sudo-pass) ansible_connection 連接類型的主機。候選人都是本地,ssh或paramiko。默認是paramiko Ansible 1.2之前,和“smart”之后,檢測是否使用ssh的根據是否支持ControlPersist可行。 ansible_ssh_private_key_file 使用ssh私有密鑰文件。有用的,如果使用多個鍵和你不想使用SSH代理。 ansible_shell_type shell型的目標系統。默認命令格式默認使用“sh”風格的語法。設置這個“csh”或“fish"將導致在目標系統上執行命令跟隨那些shell的語法。 ansible_python_interpreter 目標主機的python的道路。這是對系統更有用,比Python位于“/ usr / bin / Python”如\ * BSD,或者/usr/bin/python 不是一個2.X系列Python。我們不使用“/ usr / bin / env”機制,需要遠程用戶的路徑設置正確,也假設“python可執行為python可執行的可能被命名為“python26” ansible\_\*\_interpreter 適用于任何諸如ruby、perl和ansible_python_interpreter一樣工作。這個模塊替換工作將在此主機上運行。 ``` ## 條件測試 如果需要根據變量、facts或此前任務的執行結果來做為某task執行與否的前提時要用到條件測試。 ### when語句 在task后添加when子句即可使用條件測試;when語句支持Jinja2表達式語法。例如: ``` tasks: - name: "shutdown Debian flavored systems" command: /sbin/shutdown -h now when: ansible_os_family == "Debian" ``` when語句中還可以使用Jinja2的大多“filter”,例如要忽略此前某語句的錯誤并基于其結果(failed或者sucess)運行后面指定的語句,可使用類似如下形式: ``` 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語句中還可以使用facts或playbook中定義的變量。 ## 迭代 當有需要重復性執行的任務時,可以使用迭代機制。其使用格式為將需要迭代的內容定義為item變量引用,并通過with_items語句來指明迭代的元素列表即可。例如: ``` - name: add several users user: name={{ item }} state=present groups=wheel with_items: - testuser1 - testuser2 ``` 上面語句的功能等同于下面的語句: ``` - name: add user testuser1 user: name=testuser1 state=present groups=wheel - name: add user testuser2 user: name=testuser2 state=present groups=wheel ``` 事實上,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的循環機制還有更多的高級功能,具體請參見[官方文檔](http://docs.ansible.com/playbooks_loops.html) # 常見的模塊 - command:命令模塊,默認模塊,用于在遠程執行命令; ``` ansible all -a 'date' ``` - cron:管理計劃任務 * state: present:安裝 absent:移除 ``` ansible websrvs -m cron -a 'minute="*/10" job="/bin/echo hell" name="test cron job"' ``` - user:管理用戶賬號 * name=:指明創建的用戶的名字: ``` ansible websrvs -m group -a 'name=mysql gid=306 system=yes group=mysql' ``` - group:添加組或刪除組 ``` ansible websrvs -m group -a 'name=mysql gid=306 system=yes' ``` - copy: * src=:定義本地源文件路徑 * dest=:定義遠程目標文件路徑 * content=:取代src=,表示直接用此處指定的信息生成為目標文件內容; ``` ansible all -m copy -a 'src=/etc/fstab dest=/tmp/fstab.ansible owner=root mode=640' ansible all -m copy -a 'content="Hello Ansible\nHi yjscloud" dest=/tmp/test.ansible' ``` - file:設定文件屬性 * path=:指定文件路徑,可以使用name或dest來替換; 創建文件的符號鏈接 * src=:指明源文件 * path=:指明符號鏈接文件路徑 ``` ansible all -m file -a 'path=/tmp/fstab.link src=/tmp/fstab.ansible state=link' ``` - ping:測試指定主機是否能連接; * serveice:指定運行狀態; * enabled=:是否開機自動啟動,取值為true或者flase; * name=:服務名稱 * state=:狀態,取值有started,stopped,restarted; - shell:在遠程主機上運行命令 用到管道等功能的復雜命令; - script:將本地腳本復制到遠程主機并運行之; 注意:要使用相對路徑指定腳本 - yum:安裝程序包 * name=:指明要安裝的程序包,可以帶上版本號; * state=:present,latest表示安裝,absent表示卸載; - setup:收集遠程主機的facts 每個被管理節點在接收并運行管理命令之前,會將自己主機相關信息,如操作系統版本、IP地址等報告給遠程的ansible主機; - fetch:從遠程節點獲取文件(只能是文件)到本地目錄。默認會以主機清單中的主機名為目錄存放獲取到的文件 ``` ansible all -m fetch -a 'src=/var/log/messages dest=/app' ``` 注意,`src=/var/log/mess*` 這種通配符語法是不支持的 - get_url:從 HTTP, HTTPS, or FTP 下載文件 * timeout:下載超時時間,默認10s * url:下載的URL * url_password、url_username:主要用于需要用戶名密碼進行驗證的情況 * force:yes目標存在時是否下載,no目標文件不存在時下載 ``` ansible all -m get_url -a 'dest=/app/ url="https://github.com/bennojoy/nginx/archive/master.zip"' ``` # ansible playbooks playbook是由一個或多個“play”組成的列表。play的主要功能在于將事先歸并為一組的主機裝扮成事先通過ansible中的task定義好的角色。從根本上來講,所謂task無非是調用ansible的一個module。將多個play組織在一個playbook中,即可以讓它們聯同起來按事先編排的機制同唱一臺大戲。下面是一個簡單示例。 ``` - hosts: webnodes 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 ``` ## playbook基礎組件 ### Hosts和Users playbook中的每一個play的目的都是為了讓某個或某些主機以某個指定的用戶身份執行任務。hosts用于指定要執行指定任務的主機,其可以是一個或多個由冒號分隔主機組;remote_user則用于指定遠程主機上的執行任務的用戶。如上面示例中的 ``` -hosts: webnodes remote_user: root ``` 不過,remote_user也可用于各task中。也可以通過指定其通過sudo的方式在遠程主機上執行任務,其可用于play全局或某任務;此外,甚至可以在sudo時使用sudo_user指定sudo時切換的用戶。 ``` - hosts: webnodes remote_user: yjscloud tasks: - name: test connection ping: remote_user: yjscloud sudo: yes ``` ### 任務列表和action play的主體部分是task list。task list中的各任務按次序逐個在hosts中指定的所有主機上執行,即在所有主機上完成第一個任務后再開始第二個。在運行自下而下某playbook時,如果中途發生錯誤,所有已執行任務都將回滾,因此,在更正playbook后重新執行一次即可。 task的目的是使用指定的參數執行模塊,而在模塊參數中可以使用變量。模塊執行是冪等的,這意味著多次執行是安全的,因為其結果均一致。 每個task都應該有其name,用于playbook的執行結果輸出,建議其內容盡可能清晰地描述任務執行步驟。如果未提供name,則action的結果將用于輸出。 定義task的可以使用“action: module options”或“module: options”的格式,推薦使用后者以實現向后兼容。如果action一行的內容過多,也中使用在行首使用幾個空白字符進行換行。 ``` tasks: - name: make sure apache is running service: name=httpd state=running ``` 在眾多模塊中,只有command和shell模塊僅需要給定一個列表而無需使用“key=value”格式,例如: ``` tasks: - name: disable selinux command: /sbin/setenforce 0 ``` 如果命令或腳本的退出碼不為零,可以使用如下方式替代: ``` 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 ``` ### handlers 用于當關注的資源發生變化時采取一定的操作。 “notify”這個action可用于在每個play的最后被觸發,這樣可以避免多次有改變發生時每次都執行指定的操作,取而代之,僅在所有的變化發生完成后一次性地執行指定操作。在notify中列出的操作稱為handler,也即notify中調用handler中定義的操作。 ``` - name: template configuration file template: src=template.j2 dest=/etc/foo.conf notify: - restart memcached - restart apache ``` handler是task列表,這些task與前述的task并沒有本質上的不同。 ``` handlers: - name: restart memcached service: name=memcached state=restarted - name: restart apache service: name=apache state=restarted ``` 案例: heartbeat.yaml ``` - hosts: hbhosts remote_user: root tasks: - name: ensure heartbeat latest version yum: name=heartbeat state=present - name: authkeys configure file copy: src=/root/hb_conf/authkeys dest=/etc/ha.d/authkeys - name: authkeys mode 600 file: path=/etc/ha.d/authkeys mode=600 notify: - restart heartbeat - name: ha.cf configure file copy: src=/root/hb_conf/ha.cf dest=/etc/ha.d/ha.cf notify: - restart heartbeat handlers: - name: restart heartbeat service: name=heartbeat state=restarted ``` # roles ansilbe自1.2版本引入的新特性,用于層次性、結構化地組織playbook。roles能夠根據層次型結構自動裝載變量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。簡單來講,roles就是通過分別將變量、文件、任務、模塊及處理器放置于單獨的目錄中,并可以便捷地include它們的一種機制。角色一般用于基于主機構建服務的場景中,但也可以是用于構建守護進程等場景中。 一個roles的案例如下所示: ``` site.yml webservers.yml fooservers.yml roles/ common/ files/ templates/ tasks/ handlers/ vars/ meta/ webservers/ files/ templates/ tasks/ handlers/ vars/ meta/ ``` 而在playbook中,可以這樣使用roles: ``` - hosts: webservers roles: - common - webservers ``` 也可以向roles傳遞參數,例如: ``` - hosts: webservers roles: - common - { role: foo_app_instance, dir: '/opt/a', port: 5000 } - { role: foo_app_instance, dir: '/opt/b', port: 5001 } ``` 甚至也可以條件式地使用roles,例如: ``` - hosts: webservers roles: - { role: some_role, when: "ansible_os_family == 'RedHat'" } ``` ## 創建role的步驟 - 創建以roles命名的目錄; - 在roles目錄中分別創建以各角色名稱命名的目錄,如webservers等; - 在每個角色命名的目錄中分別創建files、handlers、meta、tasks、templates和vars目錄;用不到的目錄可以創建為空目錄,也可以不創建; - 在playbook文件中,調用各角色; ## role內各目錄中可用的文件 - tasks目錄:至少應該包含一個名為main.yml的文件,其定義了此角色的任務列表;此文件可以使用include包含其它的位于此目錄中的task文件; - files目錄:存放由copy或script等模塊調用的文件; - templates目錄:template模塊會自動在此目錄中尋找Jinja2模板文件; - handlers目錄:此目錄中應當包含一個main.yml文件,用于定義此角色用到的各handler;在handler中使用include包含的其它的handler文件也應該位于此目錄中; - vars目錄:應當包含一個main.yml文件,用于定義此角色用到的變量; - meta目錄:應當包含一個main.yml文件,用于定義此角色的特殊設定及其依賴關系;ansible 1.3及其以后的版本才支持; - default目錄:為當前角色設定默認變量時使用此目錄;應當包含一個main.yml文件; # Tags tags用于讓用戶選擇運行或路過playbook中的部分代碼。ansible具有冪等性,因此會自動跳過沒有變化的部分,即便如此,有些代碼為測試其確實沒有發生變化的時間依然會非常地長。此時,如果確信其沒有變化,就可以通過tags跳過此些代碼片斷。 # Jinja2相關 ## 字面量 表達式最簡單的形式就是字面量。字面量表示諸如字符串和數值的 Python 對象。下面的字面量是可用的: ``` “Hello World”: 雙引號或單引號中間的一切都是字符串。無論何時你需要在模板中使用一個字 符串(比如函數調用、過濾器或只是包含或繼承一個模板的參數),它們都是 有用的。 ``` ``` 42 / 42.23: 直接寫下數值就可以創建整數和浮點數。如果有小數點,則為浮點數,否則為 整數。記住在 Python 里, 42 和 42.0 是不一樣的。 ``` ``` [‘list’, ‘of’, ‘objects’]: 一對中括號括起來的東西是一個列表。列表用于存儲和迭代序列化的數據。例如 你可以容易地在 for 循環中用列表和元組創建一個鏈接的列表: <ul> {% for href, caption in [('index.html', 'Index'), ('about.html', 'About'), ('downloads.html', 'Downloads')] %} <li><a href="{{ href }}">{{ caption }}</a></li> {% endfor %} </ul> ``` ``` (‘tuple’, ‘of’, ‘values’): 元組與列表類似,只是你不能修改元組。如果元組中只有一個項,你需要以逗號 結尾它。元組通常用于表示兩個或更多元素的項。更多細節見上面的例子。 ``` ``` {‘dict’: ‘of’, ‘key’: ‘and’, ‘value’: ‘pairs’}: Python 中的字典是一種關聯鍵和值的結構。鍵必須是唯一的,并且鍵必須只有一個 值。字典在模板中很少使用,罕用于諸如 xmlattr() 過濾器之類。 ``` ``` true / false: true 永遠是 true ,而 false 始終是 false 。 ``` ## 算術運算 Jinja 允許你用計算值。這在模板中很少用到,但是為了完整性允許其存在。支持下面的 運算符: + 把兩個對象加到一起。通常對象是素質,但是如果兩者是字符串或列表,你可以用這 種方式來銜接它們。無論如何這不是首選的連接字符串的方式!連接字符串見 ~ 運算符。 {{ 1 + 1 }} 等于 2 。 - 用第一個數減去第二個數。 {{ 3 - 2 }} 等于 1 。 / 對兩個數做除法。返回值會是一個浮點數。 {{ 1 / 2 }} 等于 {{ 0.5 }} 。 // 對兩個數做除法,返回整數商。 {{ 20 // 7 }} 等于 2 。 % 計算整數除法的余數。 {{ 11 % 7 }} 等于 4 。 * 用右邊的數乘左邊的操作數。 {{ 2 * 2 }} 會返回 4 。也可以用于重 復一個字符串多次。 {{ ‘=’ * 80 }} 會打印 80 個等號的橫條。 ** 取左操作數的右操作數次冪。 {{ 2**3 }} 會返回 8 。 ## 比較操作符 == 比較兩個對象是否相等。 != 比較兩個對象是否不等。 > 如果左邊大于右邊,返回 true 。 >= 如果左邊大于等于右邊,返回 true 。 < 如果左邊小于右邊,返回 true 。 <= 如果左邊小于等于右邊,返回 true 。 ## 邏輯運算符 對于 if 語句,在 for 過濾或 if 表達式中,它可以用于聯合多個表達式: and 如果左操作數和右操作數同為真,返回 true 。 or 如果左操作數和右操作數有一個為真,返回 true 。 not 對一個表達式取反(見下)。 (expr) 表達式組。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看