Linux下ansible使用(自動化運維)示例


//系統、版本
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 10 (buster)
Release:	10
Codename:	buster
$ uname -r
4.19.97-v7l+
$ ansible --version
ansible 2.7.7
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/pi/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.7.3 (default, Dec 20 2019, 18:57:59) [GCC 8.3.0]
//前提
//ansible使用基於ssh,所以服務器間互免密登陸非常重要,可參考我的另一篇博文
//[Linux下ssh單向免密登陸/互免密登陸](https://blog.csdn.net/qq_35590198/article/details/87360081)
//另,需要安裝python (一般使用自帶的默認版本即可)

//安裝ansible
# apt-get -y install ansible
# whereis ansible
ansible: /usr/bin/ansible /etc/ansible /usr/share/ansible /usr/share/man/man1/ansible.1.gz
# ansible --help	//獲取幫助

//配置文件
# vim /etc/ansible/ansible.cfg	//(可選)編輯180行的deprecation_warnings爲False,用於減少ansible提示
180 deprecation_warnings = False

# vim /etc/ansible/hosts	//在文件的最後追加模塊以及hosts (這是一個示例,當有多個時,按照實際修改)
[localhost-vm]
192.168.56.20 ansible_ssh_user=root ansible_ssh_port=22
//ansible_ssh_user 爲指定使用的用戶,ansible_ssh_port 爲指定ssh端口,這2個參數如果都爲默認,否則都可以省略
//配置完畢(要注意的是ansible的配置文件修改後不需要重新載入之類的操作,保存後即可使用)
//命令示例 通過shell模塊安裝包
# ansible -i /etc/ansible/hosts localhost-vm -m shell -a 'yum -y install tree' -vvvv
//-i 指定使用的hosts
//localhost-vm 要執行的命令的主機組或ip地址(根據實際會不同)
//-m 指定使用什麼模塊(根據使用的模塊不同,命令各不相同)
//-a 指定執行什麼命令(即命令的內容)
//-vvvv 顯示執行命令的詳細程度,v越多越詳細,反之該選項可以忽略
//命令示例 判斷 localhost-vm 主機組下的主機是否存活
# ansible localhost-vm -m ping
//命令示例 批量創建用戶(用戶名以及密碼明文)
# pwd
/etc/ansible
# vim userlist.yml	//創建文件添加以下內容
#################分割線#################
---
- hosts: localhost-vm
  tasks:
    - name: create user
      user:
        name: "{{ item.user }}"
        password: "{{ 'item.pass' | password_hash('sha512') }}"
        state: present
      loop:
        - { user: user-name1, pass: user-passwd}
        - { user: user-name2, pass: user-passwd}
#################分割線#################
localhost-vm	//hosts中的羣組名稱或ip
loop	//所需創建的用戶名以及密碼
# ansible-playbook createuser.yml	//執行命令
//命令示例 從ansible推送文件到羣組
# ansible localhost-vm -m copy -a 'src=/etc/ansible/shell/hostname.sh dest=/root/hostname.txt backup=yes mode=777 owner=www'

localhost-vm	//羣組名或ip
copy	//copy是模塊名
src	//後接源目標路徑
dest	//後接目的目標(根據示例這裏可以爲目錄,可以爲不同名稱文件(若爲文件則傳輸並改名))(可省略)
mode	//指定文件權限(可省略)
owner	//指定文件所有者(可省略)
//通過 # ansible-doc copy 可以查看詳細的關於copy模塊描述
//命令示例,下載文件(目標文件必須是具體文件)
# ansible localhost-vm -m fetch -a 'src=/home/128.log dest=/root/128/'
//fetch 文件下載模塊
//src 下載源文件路徑
//dest 下載目的目錄
//命令示例 刪除文件
# ansible localhost-vm -m shell -a 'rm -f /root/hostname.sh'
//檢查
# ansible localhost-vm -m shell -a 'ls /root'
//命令示例 使用file模塊
# ansible localhost-vm -m file -a 'name=/root/test state=touch'
name	//後接目標的絕對路徑
state	//決定創建的是目錄還是文件
touch	//表示創建
absent	//反之 absent 表示刪除(包含文件和目錄)
directory	//表示目錄

//創建軟鏈接
# ansible localhost-vm -m file -a 'src=/root/name.txt dest=/name.link state=link'
link	//表示軟鏈接
src	//源
dest	//目標

//刪除軟鏈接
# ansible localhost-vm -m file -a 'dest=/name.link state=absent'
//命令示例 hostname模塊修改主機名
# ansible localhost-vm -m hostname -a 'name=Test-client.com'
name	//後接主機名

# ansible localhost-vm -m shell -a 'cat /etc/hostname'	//檢查
//命令示例 cron模塊
# ansible localhost-vm -m cron -a 'minute=* job="/usr/bin/wall FBI warning" name=warning'
cron	//模塊名
minute	//定時什麼時候執行(注意,crontab中 分 時 日 月 周 5個時間如沒有指定則爲 * )
job	//"具體的任務內容"
name	//作業名稱

//禁用crontab任務
# ansible localhost-vm -m cron -a 'disabled=true job="/usr/bin/wall FBI warning" name=warning'

//啓用crontab任務
# ansible localhost-vm -m cron -a 'disabled=false job="/usr/bin/wall FBI warning" name=warning'

//刪除crontab任務
# ansible localhost-vm -m cron -a 'job="/usr/bin/wall FBI warning" name=warning state=absent'

//檢查
# ansible localhost-vm -m shell -a 'crontab -l'
//命令示例 yum模塊
# ansible localhost-vm -m yum -a 'name=httpd,memcached state=installed update_cache=yes'
yum	//模塊名
name	//後接需要安裝的包名,多個時用 , 隔開。也可接本地rpm路徑,安裝本地包(如name=/root/src/popt-static-1.13-7.el6.x86_64.rpm)
state	//state有多種狀態('present' or 'installed', 'latest''absent' or 'removed')
update_cache	//更新緩存(可忽略)

//卸載包
# ansible localhost-vm -m yum -a 'name=httpd,memcached state=absent'
//命令示例 service模塊
# ansible localhost-vm -m service -a 'name=rpcbind state=started enabled=yes'
service	//模塊名稱
name	//後接服務名稱
state	//後接操作(包含 {started | stopped | restarted | reloaded})
enable	//是否開機啓用(可忽略)(yes or no 或 true or false)

# ansible localhost-vm -m shell -a 'ps aux|grep rpcbind'	//檢查
//命令示例 user模塊
# ansible localhost-vm -m user -a 'name=nginx shell=/sbin/nologin system=yes groups=root group=nginx home=/home/nginx comment="nginx service"'
user	//模塊名
name	//指定用戶名
shell	//指定使用的shell
system	//是否是系統用戶(可忽略)
groups	//指定附屬組
group	//指定主組
home	//指定家目錄(可忽略)
comment	//註釋(可忽略)
//需要注意:主組、附屬組、家目錄等如果不存在需要先創建
//更多參數,詳見 # ansible-doc user

//刪除用戶
# ansible localhost-vm -m user -a 'name=nginx shell=/sbin/nologin system=yes groups=root comment="nginx service" state=absent'

//檢查
# ansible localhost-vm -m shell -a 'id nginx'
//命令示例 group模塊
# ansible localhost-vm -m group -a 'name=nginx system=yes'
group	//模塊名
name	//指定組名稱
system	//是否是系統組(可忽略)
//更多參數,詳見 # ansible-doc group

//刪除組
# ansible localhost-vm -m group -a 'name=nginx system=yes state=absent'

//檢查
# ansible localhost-vm -m shell -a 'getent group nginx'
//命令示例 ansible-galaxy [官網地址](https://galaxy.ansible.com)
//galaxy表示一種可擴充語言,通過ansible-galaxy命令,可以從網絡上把已經各種寫好的galaxy下載下來使用。
# ansible-galaxy install geerlingguy.nginx	//安裝nginx roles(默認下載到 ~/.ansible/roles/geerlingguy.nginx)
# ansible-galaxy list	//列出所有已安裝的roles
# ansible-galaxy remove geerlingguy.nginx	//刪除nginx roles
//ansible編譯安裝jdk
$ pwd
../roles/jdk-ansible-role
$ tree -N ./	##目錄結構
./
├── files
│   └── jdk-8u241-linux-x64.tar.gz
└── jdk.yaml

1 directory, 2 files

//playbook內容
$ cat jdk.yaml 
====分割線====
- hosts: localhost-vm
  remote_user: root
  roles:
      - ..ansible/roles/jdk-ansible-role	##根據實際路徑修改
  tasks:
      - name: create dir
        file: name=/usr/java state=directory
      - name: copy and unzip
        unarchive: src=jdk-8u241-linux-x64.tar.gz dest=/usr/java/
      - name: set env
        lineinfile: path=/etc/profile insertafter={{ item.position }} line={{ item.value }} state=present
        with_items:
            - { position: EOF, value: "JAVA_HOME=/usr/java/jdk1.8.0_241"}
            - { position: EOF, value: "PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin"}
            - { position: EOF, value: "CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib/tools.jar:$JAVA_HOME%/lib/dt.jar:$JAVA_HOME/lib:$JAVA_HOME/jre/lib"}
            - { position: EOF, value: "export JAVA_HOME PATH CLASSPATH"}
      - name:
        file: dest=/usr/java/jdk1.8.0_241 mode=0755 recurse=yes
      - name: source profile    ##貌似沒有作用,所以運行該yaml後執行 sudo ansible localhost-vm -m shell -a 'source /etc/profile && java -version'
        shell: source /etc/profile
====分割線====
//執行playbook
$ sudo ansible-playbook jdk.yaml
//
//驗證
$ sudo ansible localhost-vm -m shell -a 'source /etc/profile && java -version
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章