rpm -ql ansible 查看安裝文件node
/usr/bin/ansible 主程序
/usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具
/usr/bin/ansible-galaxy 下載/上傳優秀代碼或者Roles模塊的官網平臺
/usr/bin/ansible-playbook 定製自動化任務,編排劇本工具/usr/bin/ansible-pull遠程執行命令工具
/usr/bin/ansible-valult 文件加密工具(腳本打開看到內容,經過這個加密)
/usr/bin/ansible-console 基於console界面與用戶交互的執行工具
cat /etc/ansible/hosts Inventory主機清單mysql
ansible --key-file=/root/id_rsa all -m ping #all Inventory主機清單裏面全部的主機
Inventory主機清單
172.168.1.112:22 #修改端口nginx
ansible配置文件詳解web
[defaults] #通用默認配置 inventory = /etc/ansible/hosts #被控制端IP或者DNS列表 library = /usr/share/my_modules/ ##默認搜尋模塊的位置 remote_tmp = ~/.ansible/tmp #遠程執行臨時文件 local_tmp = ~/.ansible/tmp plugin_filters_cfg = /etc/ansible/plugin_filters.yml forks = 5 ##並行線程數 poll_interval = 15 ##回頻率或輪詢間隔時間 sudo_user = root ##sudo遠程執行用戶名 ask_sudo_pass = True ##使用sudo,是否須要輸入密碼 ask_pass = True ##是否須要輸入密碼 transport = smart ##通訊機制 remote_port = 22 ##遠程SSH端口 module_lang = C ##模塊和系統之間通訊的語言 module_set_locale = False gathering = implicit ##控制默認facts收集(遠程系統變量) gather_subset = all gather_timeout = 10 roles_path = /etc/ansible/roles ##使用playbook搜索Ansible roles host_key_checking = False ##是否檢查遠程主機密鑰 sudo_exe = sudo ##sudo遠程執行命令 sudo_flags = -H -S -n ##傳遞sudo以外的參數 timeout = 10 ##SSH超時時間 remote_user = root ##遠程登陸用戶名 log_path = /var/log/ansible.log ##日誌文件存放路徑 module_name = command ##Ansible命令默認執行的模塊 executable = /bin/sh ##執行的shell環境,用戶shell模塊 hash_behaviour = replace ##特定的優先級覆蓋變量 jinja2_extensions = jinja2.ext.do,jinja2.ext.i18 ##容許開啓jinja2擴展模塊 private_key_file = /path/to/file ##私鑰文件存儲位置 display_skipped_hosts = True ##顯示跳過任何任務的狀態 system_warnings = True ##禁用系統運行Ansible潛在問題警告 deprecation_warnings = True ##PlayBook輸出禁用「不建議使用」警告 command_warnings = False ##command模塊Ansible默認發出警告 nocolor = 1 ##輸出帶上顏色區別,0表示開啓,1表示關閉 pipelining = False ##開啓pipe SSH通道優化 [accelerate] ##accelerate緩存加速 accelerate_port = 5099 ##加速鏈接端口5099 accelerate_timeout = 30 ##命令執行超過期間,單位爲s accelerate_connect_timeout = 5.0 ##上一個活動鏈接的時間,單位爲min accelerate_daemon_timeout = 30 ##容許多個私鑰被加載到daemon accelerate_multi_key = yes ##任何客戶端想要鏈接daemon都要開啓這個選項
ansible 主機清單匹配規則:sql
all 表示主機清單全部主機 ansible all -m ping
* 通配符(機清單) ansible "*" -m ping ansible 192.168.1.* -m ping ansible "*svr" -m ping 或關係 ansible web:db -m ping ansible 192.168.1.1:192.168.1.22 -m ping 邏輯與(交集) ansible "web:&db" -m ping # 在web組而且在db組中的機器 邏輯非 ansible 'web:!db' -m ping # 在web組中,可是不在db組中的機器 須要用單引號 正則 ansible "~(web|db).\.hh\.com" -m ping
sudo 鏈接方式:
sudo 鏈接方式:
[root@zabbinx ~]# ansible all -m command -a "ls -lh" -u kuwo -k -b -K #-b sudo用戶,默認配置文件爲root -K sudo密碼
SSH password:
SUDO password[defaults to SSH password]:
ansible all -m ping -u kuwo -k -b --become-user mgpj #以kuwo sudo 切換至mgpj用戶執行ping
ansible all -m ping -u kuwo --become-user=root -a "ls -l" mgpj #以kuwo sudo 切換至 root用戶執行ping
經常使用模塊shell
ping模塊緩存
[root@zabbinx ~]# ansible -uroot --key-file=/root/id_rsa all -m ping
[root@zabbinx ~]# ansible -uroot -k all -m ping服務器
-m command 模塊 默認模塊 <>|;& $ 這些特殊字符command不支持
參數:
creates 文件存在 就不執行 #ansible all --key-file=/root/id_rsa -m command -a "creates=/etc/fstab ls -lh /root" #執行
removes 文件不存在 就不執行 #ansible all --key-file=/root/id_rsa -m command -a "removes=/etc/fs ls -lh /root" #不執行
chdir 切換目錄 #ansible all --key-file=/root/id_rsa -m command -a "chdir=/etc creates=ftab ls -lh /root"
#ansible all --key-file=/root/id_rsa -m command -a "chdir=/opt sh ./a.sh" 執行shell腳本app
-m shell 模塊 跟command模塊的區別 支持<>|;& $ 這些特殊字符
#ansible all --key-file=/root/id_rsa -m shell -a "echo 123|passwd --stdin test" #修改密碼
-m script 模塊 執行本機的shell腳本 都其餘主機運行
#ansible all --key-file=/root/id_rsa -m script -a "a.sh" #ansible本機的a.sh腳本 在全部主機運行執行儀表
-m copy 模塊 拷貝本機的文件到其餘主機
#ansible all --key-file=/root/id_rsa -m copy -a "src=/root/1.jpg dest=/opt/3.jpg backup=yes mode=066" #ansible本機的/root/1.jpg 文件拷貝到全部主機/opt/3.jpg 而且備份 給權限066
#ansible all --key-file=/root/id_rsa -m copy -a "src=/root/1.jpg dest=/opt/3.jpg backup=yes mode=066 owner=test"
#ansible all --key-file=/root/id_rsa -m copy -a "content='hello\n\world' dest=/opt/test.log" #內容生成到全部主機的/opt/test.log文件中dom
-m fetch 模塊 拷貝客服端的文件到服務器,只支持一個文件拷貝 目錄能夠先tar
#ansible all --key-file=/root/id_rsa -m fetch -a "src=/opt/test.log dest=/root" #拷貝客服端/opt/test.log文件到 ansible主機中的root目錄
-m file 模塊 建立文件設置文件屬性
參數 state=touch建立文件 state=directory建立目錄 state=absent刪除文件 state=link建立軟鏈接 state=hard建立硬鏈接
#ansible all --key-file=/root/id_rsa -m file -a 'path=/opt/111111111 state=touch' #path name dest 這3個在這裏面均可以用 都是一個意思
#ansible all --key-file=/root/id_rsa -m file -a 'path=/opt/1111111112 state=directory'
#ansible all --key-file=/root/id_rsa -m file -a 'path=/opt/1111111112 state=absent'
#ansible all --key-file=/root/id_rsa -m file -a 'src=/etc/fstab path=/opt/1111111112 state=link'
#ansible all --key-file=/root/id_rsa -m file -a 'path=/opt/ state=absent' 刪除文件
-m hostname 模塊 修改主機名
#ansible all --key-file=/root/id_rsa -m hostname -a 'name=node'
-m corn 模塊 建立計劃任務
#ansible all --key-file=/root/id_rsa -m cron -a 'minute=* weekday=1,2,3,4,5 job="/usr/bin/wall FBI" name=wall' #name 名字 就在計劃任務上面顯示這個#Ansible: wall
#ansible all --key-file=/root/id_rsa -m cron -a 'disable=true job="/usr/bin/wall FBI" name=wall' #禁用計劃任務
#ansible all --key-file=/root/id_rsa -m cron -a 'disable=false job="/usr/bin/wall FBI" name=wall' #啓用
#ansible all --key-file=/root/id_rsa -m cron -a 'name=wall state=absent' #刪除計劃任務
-m yum 模塊
#ansible all --key-file=/root/id_rsa -m yum -a 'name=ftp'
#ansible all --key-file=/root/id_rsa -m yum -a 'name=ftp state=installed' #安裝ftp 默認present 能夠指定 `present' or `installed', `latest'安裝
#ansible all --key-file=/root/id_rsa -m yum -a 'name=ftp,httpd state=installed' #安裝多個
#ansible all --key-file=/root/id_rsa -m yum -a 'name=ftp state=absent' #刪除 或者用removed
#ansible all --key-file=/root/id_rsa -m yum -a 'name=dstat update_cache=yes' #一邊安裝包一邊清理緩存
-m service 模塊 管理服務
started,stopped,restarted,reloaded, got: restartd"
#ansible all --key-file=/root/id_rsa -m service -a "name=sshd state=stopped" #啓動服務器
#ansible all --key-file=/root/id_rsa -m service -a "name=sshd state=stopped enabled=yes" #enabled=yes開機啓動 查看systemctl is-enabled sshd.service是否開機啓動
-m user 模塊
#ansible all --key-file=id_rsa -m user -a "name=nginx shell=/sbin/nologin system=yes home=/opt/nginx groups=root,bin uid=90"
#ansible all --key-file=id_rsa -m user -a "name=nginx state=absent remove=yes" #remove=yes刪除家目錄
主機清單中指定單獨主機執行ansible 使用參數 --limit
ansible all --key-file=/root/id_rsa -m hostname -a 'name=node' --limit 172.168.1.112 ansible all --key-file=/root/id_rsa -m hostname -a 'name=node' --limit all #指定組名也能夠的
ansible playbook 使用的yaml 或者 yml 文件:
test.yml文件 - hosts: all become: yes #是否容許身份切換 become_method: sudo #切換用戶身份的方式,有sudo、su、pbrun等方式,默認爲sudo tasks: - name: create file #remote_user: test #become: yes #是否容許身份切換 #become_method: sudo #切換用戶身份的方式,有sudo、su、pbrun等方式,默認爲sudo #become_user: test #切換指定的用戶 file: name=/opt/test state=touch
ansible-playbook -utest -k test.yml #普通用戶執行
ansible-playbook --list-hosts test.yml#獲取當前yml裏面的清單主機列表
ansible-playbook -utest -k test.yml --limit 172.168.1.112 test.yml 裏面清單主機中的特定這臺主機執行
ansible-playbook --list-tasks test.yml #查看任務
- hosts: web tasks: - name: cat prcesso shell: ps axu |grep httpd register: check #定義變量存儲返回的結果 - name: show debug: var=check.stdout verbosity=0 #check.stdout 顯示出的信息會看的更清晰點 ~
playbook 之 notify 和 handlers 配合使用,執行yml文件的時候,裏面內容會自動執行; notify 當某文件程序目錄發生變化的時候 通知handlers處理,
- hosts: all become: yes #是否容許身份切換 become_method: sudo #切換用戶身份的方式,有sudo、su、pbrun等方式,默認爲sudo tasks: - name: create file #remote_user: test #become: yes #是否容許身份切換 #become_method: sudo #切換用戶身份的方式,有sudo、su、pbrun等方式,默認爲sudo #become_user: test #切換指定的用戶 file: name=/opt/test state=touch notify: stop httpd #create file執行完後 通知handlers裏面的name: stop httpd 作中止服務
- name: create user user: name=newusers2 system=yes shell=/sbin/nologin notify: #下面能夠通知handlers多個name作處理,必須是發生改變 或 新建的時候 替換的時候 纔會執行 也就是說顏色是黃色的才執行 - restart httpd #通知handlers 描述的名字 - stop httpd - name: install httpd yum: name=httpd - name: create content copy: content="hello" dest=/opt/test ignore_errors: True #忽略錯誤,執行出錯了 忽略 繼續執行後面的任務,不會退出來 - name: start service service: name=httpd state=started enabled=yes handlers: #觸發器 - name: restart httpd service: name=httpd state=restarted - name: stop httpd service: name=httpd state=stopped
ansible-playbook -utest -k test.yml #普通用戶執行
ansible-playbook --list-hosts test.yml#獲取當前yml裏面的清單主機列表
ansible-playbook -utest -k test.yml --limit 172.168.1.112 test.yml 裏面清單主機中的特定這臺主機執行
ansible-playbook --list-tasks test.yml #查看任務
playbook 之 tags:加標籤,做用是未來能夠調用這個標籤裏面的內容,多個動做能夠用一個標籤,也就是標籤名相同
- hosts: all become: yes become_method: sudo tasks: - name: create file #remote_user: test #become: yes #become_method: sudo #become_user: test file: name=/opt/test state=touch #notify: stop httpd tags: createfile #定義標籤 - name: create user user: name=newusers2 system=yes shell=/sbin/nologin notify: - restart httpd - stop httpd - name: install httpd yum: name=httpd
ansible-playbook --key-file=/root/id_rsa test.yml -t starthttpd #-t starthttpd 指定標籤名
ansible-playbook --key-file=/root/id_rsa test.yml -t starthttpd,createfile #同時執行2個標籤
playbook之變量
ansible all --key-file=/root/id_rsa -m setup #查看系統變量,這些變量都是能夠直接拿到playbook裏面直接使用的
ansible all --key-file=/root/id_rsa -m setup -a 'filter=ansible_swapfree_mb' #過濾變量信息
參數 -e - hosts: all become: yes become_method: sudo tasks: - name: create user user: name={{ arg }} system=yes shell=/sbin/nologin
#ansible-playbook --key-file=/root/id_rsa -e 'arg=uuuukkk' test2.yml #ansible-playbook --key-file=/root/id_rsa -e 'arg1=2 arg2=1 arg2=3' test2.yml #指定多個變量
/etc/ansible/hosts 在主機清單中定義變量,能夠定義主機變量 和 公共變量
普通變量:單一的單個主機有效, 優先級比公共變量高 /etc/ansible/hosts 文件中組db裏面的172.168.1.112 定義了一個單一變量 hostname [db] 172.168.1.112 hostname=node1 #定義個hostname變量 yml內容: - hosts: all become: yes become_method: sudo tasks: - name: hostname
hostname: name={{ hostname }} #ansible-playbook --key-file=/root/id_rsa test2.yml #執行後 就修改主機名爲node1
公共變量(組變量):針對一個組的主機定義變量 /etc/ansible/hosts 文件中組db裏面,下面定義個db的組變量 [db] 172.168.1.112 hostname=node1 #定義個單一變量 [db:vars] #對DB組定義了公共變量 host=www domian=com yml文件: - hosts: db become: yes become_method: sudo tasks: - name: hostname
hostname: name={{ host }}.{{ hostname }}.{{domian}} #調用host公共變量 hostname單一變量 domian公共變量
#ansible-playbook --key-file=/root/id_rsa test2.yml 主機名就修改爲了www.node1.com
經過yml文件定義變量
testvars.yml: #存放變量的文件 var1: open var2: nginx test.yml - hosts: db vars_files: #指定存放變量testvars.yml文件 - testvars.yml tasks: - name: create fiel file: name=/opt/{{ var2 }} state=touch #var2 獲取的是 testvars.yml文件的變量
#ansible-playbook --key-file=/root/id_rsa test.yml
playbook之模版template: 是一個模塊 只能在playbook中使用
1 cp /etc/nginx/nginx.conf ./templates/nginx.conf.j2 #templates 在當前目錄下面創建一個templates目錄,默認從這個目錄查找,若是不是,須要定義絕對路勁
2 修改/templates/nginx.conf.j2文件 找到修改修改的變量 例如 worker_processes {{ cpu }}; 工做進程個數. 定義cpu模版內容
3 調用變量, 能夠是單一變量 系統setup變量 公共變量 yml文件變量
--- - hosts: db become: yes become_method: sudo vars_files: - testvars.yml #這裏面使用的是文件變量 這個文件變量中有定義個cpu: 5 tasks: - name: install nginx yum: name=nginx - name: copy file template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf #使用template模塊 拷貝這個文件的時候,會根據模版中的變量名找值 notify: reload nginx - name: start nginx service: name=nginx state=started enabled=yes handlers: - name: reload nginx service: name=nginx state=restarted
#ansible-playbook --key-file=/root/id_rsa test.yml
變量的優先級: 命令-e變量 > playbook裏面定義的變量 > 主機清單裏面定義的變量(普通變量>公共變量)
playbook 之 when 判斷語句
-m setup 查看到各個主機的 ansible_os_family 家庭版本系列 ansible_distribution 系統 ansible_distribution_major_version系統版本 ---
- hosts: db become: yes #是否容許身份切換 become_method: sudo #切換用戶身份的方式,有sudo、su、pbrun等方式,默認爲sudo vars_files: - testvars.yml tasks: - name: install nginx yum: name=nginx - name: copy file 6 when: ansible_distribution_major_version == "6" #當系統版本是6的時候 拷貝下面文件 template: src=nginx6.conf.j2 dest=/etc/nginx/nginx.conf notify: reload nginx - name: copy file 7 when: ansible_distribution_major_version == "7" #當系統版本是7的時候 拷貝下面文件 template: src=nginx7.conf.j2 dest=/etc/nginx/nginx.conf notify: reload nginx - name: start nginx service: name=nginx state=started enabled=yes handlers: - name: reload nginx service: name=nginx state=restarted
playbook之with_items 迭代 也就是循環
---
- hosts: db become: yes #是否容許身份切換 become_method: sudo #切換用戶身份的方式,有sudo、su、pbrun等方式,默認爲sudo vars_files: - testvars.yml tasks: - name: file
file: name=/opt/{{ item }} state=touch #item 表明with_items裏面的值 相似於for 裏面的值 when: ansible_distribution_major_version == "7" #若是是7 才執行建立文件 with_items: #至關因而for循環 - file1 - file2 - file3 - file4 - file5 - name: install with_items: - htop - sl - hping3
yum: name={{item}}
- name: test
user: name={{item.name}}
with_item:
- {name:'test',group:'test2'} #這種方式也支持 with_items: {name: 'test' , gr: 'g1'} user: name={{item.name}} group={{item.gr}}
playbook之template 的 if 判斷
for.yml: ---
- hosts: db become: yes #是否容許身份切換 become_method: sudo #切換用戶身份的方式,有sudo、su、pbrun等方式,默認爲sudo vars: http: - web1 - web2 service: - db: name1: mysql name2: sqlserver tasks: - name: file template: src=for.conf.j2 dest=/opt/for.conf
templates目錄下面for.conf.j2 {%for k in http %} #for 循環http {{k}} #獲取到web1 web2 {%endfor%} {%for i in service %} {%if i.db %} #判斷i.db是否有值 {{i.db}} {%else%} aaaa #沒有就顯示aaa {%endif%} {{i.name1}} {{i.name2}} {%endfor%}
#ansible-playbook --key-file=/root/id_rsa for.yml 執行會自動找templates目錄下面for.conf.j2文件
Roles角色 其實就是把各類yml裏面的模塊拆分開來使用 好比有4個模塊,這時候咱們就建4個文件 來單獨存放
ansible roles 各個目錄做用
role_name/:咱們定義的role的名字
file/:用於存放copy或script等模塊調用的函數
tasks/:用於定義各類task,此目錄必定要有main.yml;其餘文件須要main.yml包含調用
handlers:用於定義各類handlers,此目錄必定要有main.yml;其餘文件須要main.yml包含調用
vars:用於定義variables,此目錄必定要有main.yml;其餘文件須要main.yml包含調用
templates/:存儲由template模塊調用的模板文本;
meta/:定義當前角色的特殊設定及其依賴關係,此目錄中至少應該有一個名爲main.yml的文件;其它的文件須要由main.yml進行「包含」調用;
default/:此目錄中至少應該有一個名爲main.yml的文件,用於設定默認變量;
.
├── roles
│ ├── httpd
│ │ ├── files #用於存放copy或script等模塊調用的函數
│ │ │ └── httpd.conf.j2
│ │ └── tasks
│ │ ├── copy_file.yml #用於定義各類task,此目錄必定要有main.yml;其餘文件須要main.yml包含調用
│ │ ├── create_user.yml
│ │ ├── install_http.yml
│ │ └── main.yml
│ └── nginx
│ ├── files
│ │ └── httpd.conf.j2
│ ├── tasks
│ │ ├── create_group.yml
│ │ ├── create_user.yml
│ │ ├── install_nginx.yml
│ │ ├── main.yml
│ │ ├── restart_nginx.yml
│ │ ├── start_nginx.yml
│ │ └── template_file.yml
│ └── templates #存儲由template模塊調用的模板文本;
│ └── nginx.conf.j2
├── roles_http.yml #httpd使用的角色文件 須要跟roles目錄同級
├── roles_nginx.yml #nginx使用的角色文件
└── roles_totle.yml #httpd和nginx 使用的角色文件
roles_nginx.yml
- hosts: db become: yes #是否容許身份切換 become_method: sudo #切換用戶身份的方式,有sudo、su、pbrun等方式,默認爲sudo roles: #調用角色 - nginx #調用nginx角色 這個是一個目錄名
create_group.yml
- name: create group group: name=nginx
install_nginx.yml
- name: install nginx yum: name=nginx
main.yml 文件 調用全部yml文件執行的前後順序
- import_tasks: create_group.yml - import_tasks: create_user.yml - import_tasks: install_nginx.yml - import_tasks: template_file.yml - import_tasks: start_nginx.yml - import_tasks: restart_nginx.yml - import_tasks: roles/httpd/tasks/copy_file.yml #調用其餘角色裏面的任務
template_file.yml
- name: copy conf template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf #會在當前目錄的上一級files文件裏面找nginx.conf.j2
其餘文件不記錄到這了
在roles目錄下面執行 ansible-playbook --key-file=/root/id_rsa roles_nginx.yml
roles 之 標籤使用:
- hosts: db become: yes #是否容許身份切換 become_method: sudo #切換用戶身份的方式,有sudo、su、pbrun等方式,默認爲sudo roles: #調用角色 - {role: nginx,tags: ['web','http']} #調用nginx角色 這個是一個目錄名,tags是標籤名字,能夠多個 用列表方式
- {role: app,tags: ['web_1','http_2']}
在roles目錄下面執行 ansible-playbook --key-file=/root/id_rsa -t http roles_nginx.yml
roles 之 when 判斷使用
- hosts: db become: yes #是否容許身份切換 become_method: sudo #切換用戶身份的方式,有sudo、su、pbrun等方式,默認爲sudo roles: #調用角色 - {role: nginx,tags: ['web','http'],when: ansible_distribution_major_version == "7"} #判斷若是是7的系統 就執行
roles 之 notify 和 handles使用
新建一個handlers目錄 handlers:用於定義各類handlers,此目錄必定要有main.yml;其餘文件須要main.yml包含調用
文件mian.yml 必需要有這個名字的文件在這目錄裏面
- name: restart nginx service: name=nginx stated=restarted
vars目錄定義變量的目錄:
文件mian.yml 必需要有這個名字的文件在這目錄裏面
var: 123 #自定義變量 var_1: 223
template_file.yml #會獲取到上面的變量內容 -m setup變量也能夠使用
- name: copy conf template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf notify: restart nginx