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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ansible配置详解及基本示例

發布時間:2025/3/19 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ansible配置详解及基本示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ansible:
?? ?http://www.ansible.com
?? ?http://www.ansible.com.cn

?? ?主要功能:
?? ??? ?1.批量的系統部署;
?? ??? ?2.批量的程序部署;
?? ??? ?3.批量的運行命令;

?? ?運維工具的分類:
?? ??? ?agentless:無代理端程序,通過依賴于SSH協議;
?? ??? ??? ?ansible,fabric,saltstack;
?? ??? ?agent:基于代理程序實現安全通信;
?? ??? ??? ?puppet,Zabbix,func;

?? ?ansible的特性:
?? ??? ?1.模塊化:ansible核心僅僅提供了一組命令行工具(框架),真正的運維管理功能需要各個模塊來實現;
?? ??? ?2.基于python語言開發實現的,需要有Paromiko,jinja2,PyYMAL三個關鍵模塊的支持;
?? ??? ?3.Agentless,部署簡單,默認依靠SSH協議;
?? ??? ?4.支持自定義模塊;
?? ??? ?5.支持playbook;
?? ??? ?6.快速失敗,執行效率O(1),冪等性;

?? ?ansible應用程序的結構:
?? ??? ?ansible核心:提供核心命令行工具;
?? ??? ?Host Inventory:主機清單,指定ansible能夠操縱和管理的主機列表及分組情況;
?? ??? ?Playbook:劇本,可以重復執行或同時執行一個或多個任務的具有YAML語言的格式的文件文件;一般,文件的后綴名稱為:.yml或.yaml;
?? ??? ?modules:
?? ??? ??? ?核心模塊;
?? ??? ??? ?自定義模塊;
?? ??? ?插件:
?? ??? ??? ?連接器插件:在與后端被管設備進行通信之前用于建立通信會話連接的插件;
?? ??? ??? ?郵件發送的插件
?? ??? ??? ?日志記錄的插件

?? ?ansible的安裝:
?? ??? ?到目前為止,ansible的rpm包只能由EPEL源提供;

?? ??? ?使用yum命令來安裝即可;(CentOS 7.5(1803))
?? ??? ??? ?# yum install ansible

?? ?ansible的程序環境:
?? ??? ?主配置文件:/etc/ansible/ansible.cfg
?? ??? ?主機清單文件:/etc/ansible/hosts
?? ??? ?主程序:
?? ??? ??? ?/usr/bin/ansible
?? ??? ??? ?/usr/bin/ansible-doc
?? ??? ??? ?/usr/bin/ansible-playbook

?? ?主機清單的文件格式:
?? ??? ?1.單純的主機列表:
?? ??? ??? ?將主機名或IP地址按照每行一個的格式寫入/etc/ansible/hosts文件;
?? ??? ?2.主機分組:
?? ??? ??? ?[websrvs]
?? ??? ??? ?IP_ADDR1
?? ??? ??? ?...
?? ??? ??? ?HOSTNAME1
?? ??? ??? ?...

?? ??? ??? ?[dbsrvs]
?? ??? ??? ?IP_ADDR2
?? ??? ??? ?...
?? ??? ??? ?HOSTNAME2
?? ??? ??? ?...

?? ??? ??? ?[ha]
?? ??? ??? ?172.16.72.2
?? ??? ?3.主機范圍表示:
?? ??? ??? ?web01-web10
?? ??? ??? ?web[01:10]
?? ??? ??? ?172.16.72.[2:10]

?? ?ansible命令:
?? ??? ?ansible - Define and run a single task 'playbook' against a set of hosts

?? ??? ?格式:
?? ??? ??? ?ansible <host-pattern> [options]

?? ??? ??? ?常用選項:
?? ??? ??? ??? ?-a MODULE_ARGS, --args MODULE_ARGS
?? ??? ??? ??? ??? ?在使用某些模塊時,用于指定該模塊所需要的參數;
?? ??? ??? ??? ?-e, --extra-vars
?? ??? ??? ??? ??? ?在ansible的命令行中用于設置執行ansible任務時的自定義變量;
?? ??? ??? ??? ?-m MODULE_NAME, --module-name MODULE_NAME
?? ??? ??? ??? ??? ?在執行ansible任務時,所選擇使用的模塊;如果未給出該選項,默認選擇使用"command"模塊;
?? ??? ??? ??? ?-C, --check
?? ??? ??? ??? ??? ?并不真正的在被管主機上運行任務,而是測試看結果是否會發生改變;

?? ?ansible-doc命令:
?? ??? ?ansible-doc - plugin documentation tool
?? ??? ?格式:
?? ??? ??? ?ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]

?? ??? ??? ?常用選項:
?? ??? ??? ??? ?-l, --list:
?? ??? ??? ??? ??? ?列表顯示當前所有可用的ansible模塊;
?? ??? ??? ??? ?-s, --snippet:
?? ??? ??? ??? ??? ?獲取模塊的使用規則,其結果通常是劇本中的用法;

?? ?常用的ansible模塊:
?? ??? ?1.command模塊:
?? ??? ??? ?Executes a command on a remote node

?? ??? ??? ?示例:
?? ??? ??? ??? ?# ansible all -m command -a "useradd testuser01"
?? ??? ??? ??? ?# ansible all -m command -a "id testuser01"

?? ??? ?2.shell模塊:
?? ??? ??? ?Execute commands in nodes.

?? ??? ??? ?示例:
?? ??? ??? ??? ?# ansible all -m shell -a "echo qhdlink | passwd --stdin testuser01"

?? ??? ?3.user模塊:
?? ??? ??? ?Manage user accounts

?? ??? ??? ?常用的參數:
?? ??? ??? ??? ?name: 指定欲管理的用戶賬戶名稱;必選參數;
?? ??? ??? ??? ?create_home: 是否為用戶創建家目錄,除非顯式給出"no"值,默認創建;
?? ??? ??? ??? ?system: 是否將用戶創建為系統用戶;
?? ??? ??? ??? ?uid: 為指定的用戶指定一個固定的UID;
?? ??? ??? ??? ?group: 為指定的用戶指定一個主要組;
?? ??? ??? ??? ?groups: 為指定的用戶添加一個附加組;
?? ??? ??? ??? ?state: 此次ansible任務的執行狀態;必選參數;
?? ??? ??? ??? ??? ?present:創建;
?? ??? ??? ??? ??? ?absent:刪除;
?? ??? ??? ??? ?force: 當state=absent時,該任務相當于"userdel --force";
?? ??? ??? ??? ?remove: 當state=absent時,該任務相當于"userdel --remove | userdel -r";
?? ??? ??? ??? ?shell: 為指定的用戶指定一個默認登錄shell;

?? ??? ??? ?示例:
?? ??? ??? ??? ?# ansible all -m user -a "name=testuser02 system=yes uid=333 create_home=no shell=/sbin/nologin state=present"
?? ??? ??? ??? ?# ansible all -m user -a "name=testuser01 state=absent remove=yes"

?? ??? ?4.group模塊:
?? ??? ??? ?Add or remove groups

?? ??? ??? ?常用的參數:
?? ??? ??? ??? ?gid: 為指定組名的組指定一個GID;
?? ??? ??? ??? ?name: 指定組名;必選參數
?? ??? ??? ??? ?state: 此次ansible任務的執行狀態;必選參數;
?? ??? ??? ??? ??? ?present:創建;
?? ??? ??? ??? ??? ?absent:刪除;
?? ??? ??? ??? ?system: 是否將組設置為系統組;

?? ??? ??? ?示例:
?? ??? ??? ??? ?# ansible all -m group -a "name=qinhuangdao system=yes gid=345 state=present"
?? ??? ??? ??? ?# ansible all -m group -a "name=qinhuangdao state=absent"

?? ??? ?5.copy模塊:
?? ??? ??? ?Copies files to remote locations

?? ??? ??? ?常用的參數:
?? ??? ??? ??? ?dest: 此次ansible的復制任務的目標位置,必須用絕對路徑表示;
?? ??? ??? ??? ??? ?注意:
?? ??? ??? ??? ??? ??? ?1.如果src指定的路徑是目錄,則dest必須指定目錄;
?? ??? ??? ??? ??? ??? ?2.如果dest的路徑是以"/"做結尾或src是一個目錄時,若dest不存在,則創建;
?? ??? ??? ??? ??? ??? ?3.如果src和dest都是文件,若dest表示的路徑中有目錄不存在,則不會創建并報告錯誤;
?? ??? ??? ??? ?src: 此次ansible的復制任務的源文件的位置,可以使用相對路徑也可以使用絕對路徑;
?? ??? ??? ??? ??? ?注意:
?? ??? ??? ??? ??? ??? ?1.如果src所指定的路徑是以"/"結尾,僅復制該目錄下的文件到目標位置;
?? ??? ??? ??? ??? ??? ?2.如果src所指定的路徑不以"/"結尾,就會復制所有路徑中包含的目錄的內容到目標位置;類似于rsync;
?? ??? ??? ??? ?mode: 設置目標位置文件的權限屬性;
?? ??? ??? ??? ?owner: 設置目標位置文件的屬主;
?? ??? ??? ??? ?group: 設置目標位置文件的屬組;
?? ??? ??? ??? ?force: 如果目標位置文件已經存在,是否覆蓋;默認為yes;

?? ??? ??? ?示例:
?? ??? ??? ??? ?# ansible websrvs -m copy -a "content='hello\neverybody\n' force=yes dest=/tmp/hello.txt mode=0600 owner=testuser02"
?? ??? ??? ??? ?# ansible websrvs -m copy -a "src=/etc/yum.repos.d/CentOS-Base.repo dest=/tmp owner=ftp group=daemon mode=0640"

?? ??? ?6.cron模塊:
?? ??? ??? ?Manage cron.d and crontab entries

?? ??? ??? ?常用的參數:
?? ??? ??? ??? ?name: cron任務的名稱;在刪除時必須指定,創建時如果不指定,則自動創建一個新的cron任務;
?? ??? ??? ??? ?month: 月份;
?? ??? ??? ??? ?day: 天;
?? ??? ??? ??? ?hour: 小時;
?? ??? ??? ??? ?minute: 分鐘;
?? ??? ??? ??? ?weekday: 星期;
?? ??? ??? ??? ?job: 此次定義的工作的具體內容,即:命令;
?? ??? ??? ??? ?state:
?? ??? ??? ??? ??? ?present:創建;
?? ??? ??? ??? ??? ?absent:刪除;
?? ??? ??? ??? ?user: 指定此次修改的計劃任務的所有者;

?? ??? ??? ?示例:
?? ??? ??? ??? ?# ansible all -m cron -a "name='Update Time' minute=*/10 job='/usr/sbin/ntpdate 172.16.72.1 &> /dev/null' state=present"
?? ??? ??? ??? ?# ansible all -m cron -a "name='Update Time'? state=absent"

?? ??? ?7.hostname模塊:
?? ??? ??? ?Manage hostname

?? ??? ??? ?參數:
?? ??? ??? ??? ?name: 指定主機名;

?? ??? ??? ?注意:如果直接拿來設置主機名,會導致所有主機同名;絕大多數情況下,會結合變量進行主機名的設置,以保證不同的主機被設置不同的主機名;

?? ??? ??? ?示例:
?? ??? ??? ??? ?# ansible 172.16.72.3 -m hostname -a "name=web1.qhdlink.com"

?? ??? ?8.script模塊:
?? ??? ??? ?Runs a local script on a remote node after transferring it

?? ??? ??? ?示例:
?? ??? ??? ??? ?# ansible websrvs -m script -a "/root/test.sh"

?? ??? ?9.service模塊:
?? ??? ??? ?Manage services

?? ??? ??? ?常用的參數:
?? ??? ??? ??? ?name: 指定要管理的服務的名稱;
?? ??? ??? ??? ?enabled: 設置要管理的服務是否隨操作系統啟動而啟動;
?? ??? ??? ??? ?state:
?? ??? ??? ??? ??? ?started
?? ??? ??? ??? ??? ?stopped
?? ??? ??? ??? ??? ?restarted
?? ??? ??? ??? ??? ?reloaded

?? ??? ??? ?示例:
?? ??? ??? ??? ?# ansible websrvs -m service -a "name=httpd enabled=yes state=started"

?? ??? ?10.yum模塊:
?? ??? ??? ?Manages packages with the `yum' package manager

?? ??? ??? ?常用的參數:
?? ??? ??? ??? ?name: 指定此次要管理的程序包的名稱,還可以加上版本號;如果想要一次管理多個程序包,可以使用","分隔程序包名稱的列表;
?? ??? ??? ??? ?state:
?? ??? ??? ??? ??? ?`present' or `installed', `latest' :都表示安裝;
?? ??? ??? ??? ??? ?`absent' or `removed' :都表示卸載;
?? ??? ??? ?示例:
?? ??? ??? ??? ?# ansible websrvs -m yum -a "name=httpd,php-fpm state=present"

?? ??? ?11.setup模塊:
?? ??? ??? ?Gathers facts about remote hosts

?? ??? ??? ?示例:
?? ??? ??? ??? ?# ansible 172.16.72.3 -m setup


playbook:
?? ?批量運行多個相關聯或無關聯的任務的一種策略實施方法;
?? ?playbook的文件格式為YAML格式的文件,通常使用的后綴名稱為.yml或.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)通過空格來展示,列表里的項用"-"來代表,數據字典里的鍵值對用":"分隔。


?? }}




??? list

?? ??? ?列表的所有元素均使用“-”打頭,例如:
?? ??? ?# A list of tasty fruits
?? ??? ?- Apple
?? ??? ?- Orange
?? ??? ?- Strawberry
?? ??? ?- Mango

?? ?dictionary

?? ??? ?字典通過key與value進行標識,例如:
?? ??? ?---
?? ??? ?# An employee record
?? ??? ?name: Example Developer
?? ??? ?job: Developer
?? ??? ?skill: Elite

?? ??? ?也可以將key:value放置于{}中進行表示,例如:
?? ??? ?---
?? ??? ?# An employee record
?? ??? ?{name: Example Developer, job: Developer, skill: Elite}

?? ?下面是一個示例。

?? ??? ?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。

?? ?playbook的核心元素:基本結構;
?? ??? ?- hosts:
?? ??? ??? ?remote_user:
?? ??? ??? ?vars:
?? ??? ??? ??? ?var1: value1
?? ??? ??? ??? ?var2: value2
?? ??? ??? ?tasks:
?? ??? ??? ??? ?- name1:
?? ??? ??? ??? ??? ?module_name:
?? ??? ??? ??? ??? ?tags:
?? ??? ??? ??? ??? ?notify:
?? ??? ??? ??? ?- name2
?? ??? ??? ??? ??? ?...
?? ??? ??? ??? ?...
?? ??? ??? ?roles:
?? ??? ??? ??? ?- role_name1
?? ??? ??? ??? ?- role_name2
?? ??? ??? ??? ?...
?? ??? ??? ?handlers:

?? ?ansible-playbook命令:
?? ??? ?ansible-playbook - Runs Ansible playbooks, executing the defined tasks on the targeted hosts.

?? ??? ?格式:
?? ??? ??? ?ansible-playbook [options] playbook.yml [playbook2 ...]

?? ??? ??? ?常用選項:
?? ??? ??? ??? ?-C, --check
?? ??? ??? ??? ??? ?測試運行劇本中任務,不做任何改變;
?? ??? ??? ??? ?-e, --extra-vars
?? ??? ??? ??? ??? ?在命令行中設置額外的變量或者修改某個指定的變量的值;
?? ??? ??? ??? ?-t, --tags
?? ??? ??? ??? ??? ?指明只運行那些與指定的標記匹配的任務;

測試playbook的示例:
- hosts: all
? remote_user: root
? tasks:
? - name: create group agroup1
??? group: name=agroup1 gid=455 system=yes
? - name: create user auser1
??? user: name=auser1 uid=456 system=yes create_home=no group=agroup1

利用playbook部署nginx應用:
- hosts: websrvs
? remote_user: root
? tasks:
? - name: copy openssl packages
??? copy: src=../files/openssl/ dest=/root/
? - name: install openssl new version
??? yum: name=/root/openssl-1.0.2k-12.el7.x86_64.rpm,/root/openssl-libs-1.0.2k-12.el7.x86_64.rpm state=latest
? - name: install nginx package
??? yum: name=nginx state=present
? - name: provide nginx config file
??? copy: src=../files/nginx.conf dest=/etc/nginx/nginx.conf
? - name: start nginx service
??? service: name=nginx state=started enabled=true

? 注意:
? ?? ?1.CentOS 7.2上的openssl版本較低,不能適用于nginx-1.12.2版本,所以需要提供更高版本的openssl,在CentOS 7.5發行版中沒有此類問題;
? ?? ?2.copy模塊不能復制多個文件,復制目錄即可;
? ?? ?3.在指定的目錄中(/etc/ansible/files)準備好要復制的文件,包括:
? ?? ??? ?openssl相關程序包
? ?? ??? ?nginx.conf配置文件

?? ?運行playbook:
?? ??? ?ansible-playbook [--check] /path/to/yml_file

?? ?handlers:
?? ??? ?處理器;
?? ??? ?事實上,handlers也是定義了任務,但該任務并非每次都必然被執行,只是在特殊的條件下觸發執行;在ansible中,特殊條件一般是指handlers接收到了其他任務發送的通知信息;

示例:
- hosts: websrvs
? remote_user: root
? tasks:
? - name: copy openssl packages
??? copy: src=../files/openssl/ dest=/root/
? - name: install openssl new version
??? yum: name=/root/openssl-1.0.2k-12.el7.x86_64.rpm,/root/openssl-libs-1.0.2k-12.el7.x86_64.rpm state=latest
? - name: install nginx package
??? yum: name=nginx state=present
? - name: provide nginx config file
??? copy: src=../files/nginx.conf dest=/etc/nginx/nginx.conf
??? notify: reload nginx config
??? tags: provconf
? - name: start nginx service
??? service: name=nginx state=started enabled=true
? handlers:
? - name: reload nginx config
??? service: name=nginx state=reloaded

? 變量:variables
? ?? ?變量的定義方式:
? ?? ??? ?1.facts:利用setup模塊從被管設備上取回的變量,可以直接使用;
? ?? ??? ??? ?注意:如果使用ansible命令行工具向被管設備執行任務時,默認并沒有可用的facts變量;只有在運行ansible-playbook命令執行playbook時,首先回獲取被管設備上的facts變量,從而可以直接調用;

? ?? ??? ??? ?如果想要調用facts變量,都需要在playbook中調用;

? ?? ??? ?2.在hosts inventory中定義變量:
? ?? ??? ??? ?1) 為不同的主機定義同一變量的不同變量值;

? ?? ??? ??? ?示例:在/etc/ansible/hosts文件中定義;
? ?? ??? ??? ??? ?[websrvs]
?? ??? ??? ??? ??? ?172.16.72.3 nname=www1.qhdlink.com
?? ??? ??? ??? ??? ?172.16.72.4 nname=www2.qhdlink.com

?? ??? ??? ??? ??? ?# ansible websrvs -m hostname -a "name={{ nname }}"

?? ??? ??? ??? ?2) 向某個主機組中傳遞變量值:

?? ??? ??? ??? ?示例:
?? ??? ??? ??? ??? ?[websrvs:vars]
?? ??? ??? ??? ??? ?ngx_port=80

?? ??? ??? ??? ??? ?在templates中調用生效;

?? ??? ??? ?3.在ansible命令行或ansible-playbook命令行中通過-e選項傳遞變量值;
?? ??? ??? ??? ?-e var1=value1 -e var2=value2 ...

?? ??? ??? ?4.在YAML格式的playbook文件中定義并引用;
?? ??? ??? ??? ??? ?vars:
?? ??? ??? ??? ??? ??? ?var1: value1
?? ??? ??? ??? ??? ??? ?var2: value2
?? ??? ??? ??? ??? ??? ?...

?? ??? ??? ?5.在roles中定義變量;

?? ??? ??? ?6.在playbook中調用roles時,向roles傳遞變量值;

?? ??? ??? ?7.inventory內置參數:
?? ??? ??? ??? ?ansible_ssh_host
?? ??? ??? ??? ??? ?將要連接的遠程主機名.與你想要設定的主機的別名不同的話,可通過此變量設置.

?? ??? ??? ??? ?ansible_ssh_port
?? ??? ??? ??? ??? ?ssh端口號.如果不是默認的端口號,通過此變量設置.

?? ??? ??? ??? ?ansible_ssh_user
?? ??? ??? ??? ??? ?默認的 ssh 用戶名

?? ??? ??? ??? ?ansible_ssh_pass
?? ??? ??? ??? ??? ?ssh 密碼(這種方式并不安全,我們強烈建議使用 --ask-pass 或 SSH 密鑰)

?? ??? ??? ??? ?ansible_sudo_pass
?? ??? ??? ??? ??? ?sudo 密碼(這種方式并不安全,我們強烈建議使用 --ask-sudo-pass)

?? ??? ??? ??? ?ansible_sudo_exe (new in version 1.8)
?? ??? ??? ??? ??? ?sudo 命令路徑(適用于1.8及以上版本)

?? ??? ??? ??? ?ansible_connection
?? ??? ??? ??? ??? ?與主機的連接類型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默認使用 paramiko.1.2 以后默認使用 'smart','smart' 方式會根據是否支持 ControlPersist, 來判斷'ssh' 方式是否可行.

?? ??? ??? ??? ?ansible_ssh_private_key_file
?? ??? ??? ??? ??? ?ssh 使用的私鑰文件.適用于有多個密鑰,而你不想使用 SSH 代理的情況.

?? ??? ??? ??? ?ansible_shell_type
?? ??? ??? ??? ??? ?目標系統的shell類型.默認情況下,命令的執行使用 'sh' 語法,可設置為 'csh' 或 'fish'.

?? ??? ??? ??? ?ansible_python_interpreter
?? ??? ??? ??? ??? ?目標主機的 python 路徑.適用于的情況: 系統中有多個 Python, 或者命令路徑不是"/usr/bin/python",比如? \*BSD, 或者 /usr/bin/python
?? ??? ??? ??? ??? ?不是 2.X 版本的 Python.我們不使用 "/usr/bin/env" 機制,因為這要求遠程用戶的路徑設置正確,且要求 "python" 可執行程序名不可為 python以外的名字(實際有可能名為python26).
?? ??? ??? ??? ??? ?與 ansible_python_interpreter 的工作方式相同,可設定如 ruby 或 perl 的路徑....

?? ??? ?變量調用的方式:
?? ??? ??? ?{{ var_name }}

?? ??? ?12.template模塊:
?? ??? ??? ?Templates a file out to a remote server

?? ??? ??? ??? ?模板文件:純文本文件,嵌套了某種編程語言腳本代碼的文本文件;

?? ??? ??? ??? ?python語言將自身代碼嵌套進純文件文件的腳本語言,Jinja2;以"j2"后綴命名的文件;

?? ??? ??? ??? ?在jinja2腳本文件中,表達式的最簡單的表現形式,稱為"字面量";

?? ??? ??? ??? ?字面量:
?? ??? ??? ??? ??? ?字符串:通常是使用單引號或雙引號引用的內容;
?? ??? ??? ??? ??? ?列表:可變化的數據結構;
?? ??? ??? ??? ??? ??? ?[item1, item2, ...]
?? ??? ??? ??? ??? ?元組:不可變數據結構;
?? ??? ??? ??? ??? ??? ?(item1, item2, ...)
?? ??? ??? ??? ??? ?字典:
?? ??? ??? ??? ??? ??? ?{key1: value1, key2: value2, ...}
?? ??? ??? ??? ??? ?布爾型:true | false

?? ??? ??? ??? ?操作符號:
?? ??? ??? ??? ??? ?算術運算符:+, -, *, /, %, //, **
?? ??? ??? ??? ??? ?比較操作符:==, !=, <, >, <=, >=
?? ??? ??? ??? ??? ?邏輯運算符:and, or, not

?? ??? ??? ?template模塊的常用參數:
?? ??? ??? ??? ?src:在ansible主控設備上的Jinja2格式的模板文件的路徑;.j2
?? ??? ??? ??? ?dest:將模板文件復制到遠程主機后的文件路徑;
?? ??? ??? ??? ?owner:
?? ??? ??? ??? ?group:
?? ??? ??? ??? ?mode:
?? ??? ??? ??? ?setype:

?? ?template模塊使用示例:
- hosts: websrvs
? remote_user: root
? tasks:
? - name: copy openssl packages
??? copy: src=../files/openssl/ dest=/root/
? - name: install openssl new version
??? yum: name=/root/openssl-1.0.2k-12.el7.x86_64.rpm,/root/openssl-libs-1.0.2k-12.el7.x86_64.rpm state=latest
? - name: install nginx package
??? yum: name=nginx state=present
? - name: provide nginx config file
??? template: src=../templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf
??? notify: reload nginx config
??? tags: provconf
? - name: start nginx service
??? service: name=nginx state=started enabled=true
? handlers:
? - name: reload nginx config
??? service: name=nginx state=reloaded

? 注意:需要實現提供一個j2格式的文件作為配置文件的模板;此例中模板文件是:/etc/ansible/templates/nginx.conf.j2
? ?? ?worker_processes {{ ansible_processor_vcpus-2 }};
? ?? ?listen?????? {{ ngx_port }} default_server;

? 應用模板的時候,可以通過命令行傳遞變量的值:
? ?? ?# ansible-playbook -t provconf -e "ngx_port=40080" nginx.yml

條件判斷機制:
?? ?when: condition

?? ?基于條件判斷機制實現不同的CentOS發行版本中的數據庫管理系統的管理示例:
- hosts: dbsrvs
? remote_user: root
? vars:
??? srvstate: started
? tasks:
? - name: install mysql-server package on centos 6
??? yum: name=mysql-server state=present
??? when: ansible_distribution_major_version == "6"
??? tags: instpkgs
? - name: install mariadb-server package on centos 7
??? yum: name=mariadb-server state=present
??? when: ansible_distribution_major_version == "7"
??? tags: instpkgs
? - name: start mysqld service
??? service: name=mysqld state={{ srvstate }}
??? when: ansible_distribution_major_version == "6"
??? tags: servicemgmt
? - name: start mariadb service
??? service: name=mariadb state={{ srvstate }}
??? when: ansible_distribution_major_version == "7"
??? tags: servicemgmt

循環控制機制:
?? ?在ansible中可以將其稱為"迭代",遍歷給定的數據結構中的各元素,在同一個任務中可以實現多次執行;

?? ?在迭代項的引用上,YAML通常有固定的格式,即:變量名固定為"item";

?? ?在tasks中使用with_items的鍵值對的方式設定元素迭代列表;
?? ??? ?列表的實現方法:
?? ??? ??? ?字符串;
?? ??? ??? ?字典;

構建amp平臺:
?? ?amp——apache(httpd) + mysql-server(mariadb-server) + php-fpm

示例1:
- hosts: websrvs
? remote_user: root
? tasks:
? - name: install packges
??? yum: name={{ item }} state=present
??? with_items:
??? - httpd
??? - mariadb-server
??? - php-fpm
? - name: manage service
??? service: name={{ item }} state=started
??? with_items:
??? - httpd
??? - mariadb
??? - php-fpm

示例2:
- hosts: websrvs
? remote_user: root
? tasks:
? - name: create some groups
??? group: name={{ item }} state=present
??? with_items:
??? - group11
??? - group22
??? - group33
? - name: create some users
??? user: name={{ item.user }} group={{ item.group }}
??? with_items:
??? - { user: user11, group: group11 }
??? - { user: user22, group: group22 }
??? - { user: user33, group: group33 }

ansible的角色(roles):
?? ?角色:一個完整的應用服務的配置集合;

?? ?默認情況下,存放各個角色的目錄是:/etc/ansible/roles

?? ?在上述目錄中,創建一個與要管理的應用服務相關或相同的目錄名稱即可;
?? ??? ?/etc/ansible/roles/httpd
?? ??? ?/etc/ansible/roles/nginx
?? ??? ?...

?? ?在每個應用服務項目中,都需要有一套嚴格標準的目錄結構:
?? ??? ?/etc/ansible/roles/nginx/{files/,templates/,tasks/,handlers/,vars/,meta/,default/}/main.yml

?? ??? ?files/:
?? ??? ??? ?用于存放由copy模塊或script模塊所用到的靜態文件;
?? ??? ?templates/:
?? ??? ??? ?template模塊查找和復制所需的Jinja2格式的模板文件的目錄;因此,存儲于該目錄中的文件都必須以".j2"為文件的后綴名稱;
?? ??? ?tasks/:
?? ??? ??? ?定義ansible所執行的任務所使用的yml文件的集合;至少要包含一個main.yml文件作為訪問入口;如果該目錄中有其他的yml格式的文件,需要在main.yml文件中以include命令將其包含;
?? ??? ?handlers/:
?? ??? ??? ?定義處理器時所使用的yml文件的集合;至少要包含一個main.yml文件作為訪問入口;如果該目錄中有其他的yml格式的文件,需要在main.yml文件中以include命令將其包含;
?? ??? ?vars/:
?? ??? ??? ?定義自定義變量時所使用的yml文件的集合;至少要包含一個main.yml文件作為訪問入口;如果該目錄中有其他的yml格式的文件,需要在main.yml文件中以include命令將其包含;
?? ??? ?meta/:
?? ??? ??? ?定義當前角色的某些特定屬性和依賴關系;至少要包含一個main.yml文件作為訪問入口;如果該目錄中有其他的yml格式的文件,需要在main.yml文件中以include命令將其包含;
?? ??? ?default/:?? ??? ???? 定義默認變量時使用的目錄,至少要包含一個main.yml文件作為訪問入口;如果該目錄中有其他的yml格式的文件,需要在main.yml文件中以include命令將其包含;




????為了避免連接時出現權限問題,在主管與被管設備之間使用免密認證。

????

????



驗證是否可以免密登陸;

????













轉載于:https://blog.51cto.com/holmes975/2364214

總結

以上是生活随笔為你收集整理的ansible配置详解及基本示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。